Code Monkey home page Code Monkey logo

sinfer's People

Contributors

otofune avatar

Stargazers

 avatar

Watchers

 avatar

sinfer's Issues

TypeScript をやめて別の言語に書き直す?

  • #2, #3 を解決するためには TypeScript でやると面倒
    • 独自の JSON パーサを用意する必要があったり
    • Go コンパイラを触れるように FFI しないといけない?
  • #4 とかもできれば #3 でやりたい
    • 今は struct の定義だけ吐いていて、型名やパッケージ名を持っていない
  • Go のためのコードを生成するツールで Go じゃないというのは別に気にしていないが、ワンバイナリで動いてくれないのは微妙
  • テンプレート文字列で無理やり Go のコードを組み立てているのもいまいち
  • #1 のリファクタリングも今後行いたいので、別の言語で書き直してもいいのでは

struct の定義だけでなく package の表記や型名も出力する

  • #4 のために必要
  • 今は struct 定義が次に来ることを想定したテンプレートを用意することを想定しているが、もっと手軽に使えるようにしたい
  • 参考: 想定テンプレート
    package main
    import "encoding/json"
    // 型名のうしろには1文字スペースが必要
    type GeneratedType 

nest した struct を別の型として出力できるようにする

例えば struct の slice に代入するときなど Go ではしばしば型を明示する必要がある場面に出会うことがある
匿名型だと常に append(slice, struct{A: string json:"a"}{"aaa"}) のようにしなければならず、定義が変更されたタイミングで様々な箇所を修正しなければならなくなって面倒
よって、型として独立した名前がつけられるようにしたい

UnifyIR 関数を分割する

Go に起こす部分でユニークなのは any にしなければならないという点でしかない。
情報量が落ちる処理のみが言語系に合わせる部分であり、その表現力を失わない範囲で併合することは問題がない。
その処理だけを切り出せば綺麗にまとまるのでは?

利点としては

  • 他言語への出力がしやすくなる
  • 中間言語を保存することで、生データを保存しなくても追記が行えるようになる
    • 公開リポジトリに元データを含みたくない欲求に答えられる
    • ただし元データは残しておくべき。あくまで中間表現 (キャッシュと同等) なので壊れる可能性がある

欠点としては

  • ただの内部表現であったのに JSON で保存される可能性が出てくると意味論の変更が難しくなるのではないか?
    • これは適当なフェイクのデータを IR から生成できるようにしてしまえば問題ない
      • 循環参照はサポートしていないので収束する
      • optional なフィールドか、Union かで分岐するだけ
    • ただし現在の変換処理が必要な情報まで捨てていた (表現力が足りなかった) 場合はどうしようもない

具体的には3つに分解する

IRUnion を情報量を減らさない範囲で併合する

方針: 同じ型のみ合成する

  1. IRUnion を子として含むなら、その内容を自身に併合する
    • これは子に IRUnion を含まなくなるまで繰り返す
  2. 全く同じ型しかなければ IRUnion をそれらの型にしてしまう
    • IRPrimitive なら条件はないのでそのまま外に出す
    • IRSlice なら of 同士を合成した IRUnion を作成し、併合処理を繰り返す
    • IRStruct なら field 毎に IRUnion を作成し、併合処理を繰り返す。このとき合計 struct 数より少ないフィールドには optional を付与
  3. 異なる型があればそれぞれの型同士で 1. の手順を行った結果を持つ IRUnion とする

IRIgnoreIRUnion から消し去る

[注意]
この処理を行うと IRAny になってしまう可能性があるので破壊的である。
最終成果物を生成する際にのみ、必要な処理。

  1. IRAny が含まれる IRUnion を常に IRAny にする
  2. 但し IRStruct のフィールドが IRUnion であった場合に限り、フィールドを optional 扱いにする役割を果す。その IRUnion からは IRAny を消し去った上で併合処理を繰り返す

Go のために IRUnion を消し去る

  1. 既に併合および IRIgnore を削除されているものとする。されていなければ、すること
  2. IRUnion は全て IRAny にする
    • この時点で併合できる範囲は併合されているはずだから

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.