pasberth/Macra

macrac の仕様

Opened this issue · 19 comments

instruction をテキストファイルに書き出したものの仕様を決めよう。

それが決まったら macrac をパースしてデータにするパーサを書く。

もとのソースコードのメタデータを埋め込めれば、エラー時のメッセージとかで使えるから嬉しい。

#include は macra を読み込む。
#require は macrac を読み込む。 (ただし、 macra のほうが更新されているならコンパイルしてから読み込む)

Haskellのreadで読めちゃうようにすればパーサいらないんじゃない?

その仕様だと Haskell という言語でしか実装できなくなっちゃうというか、
Haskell で実装されているということが仕様から見えちゃうから、嫌

Macra の仕様からは Haskell は切り離したい。

べつにHaskellのリテラルってそんなに特殊な見た目じゃないし、Haskellのリテラルのパーサを書けば他の言語でも使えると思うけど。

また新しく仕様作るの…
煩雑すぎる気がする

ん〜

Macra の仕様は現時点でも足りてない所だらけで、今まで作ってた仕様も含めて、新しく作ってるっていうか、穴埋めだけど

macrac に既存の構文を採用するにしても Haskell のリテラルはダメで json とかのがいいと思う。

jsonいいかもね.
それかs式

ぼくも S式がいいと思うけど、 S式って JSON みたいにパーサ配布してるかな?

いくらでもあると思うけど、1時間もかからずにパーサ書けるくらいシンプルだよ。もともとASTになってるし。

じゃあ、S式にしよう。

S式はS式でも、実際どういうデータで格納するかについてなんだけど

Haskell の

(FrameInst HaltInst (FreezeInst (ReferInst "x" (ThawInst HaltInst)) (ArgInst (ReferInst "f" (ThawInst ApplyInst)))))

だったら

(frame halt (freeze (refer "x" (thaw halt)) (arg (refer "f" (thaw apply)))))

こんな感じに Inst は削って snace_case で格納するとか

あるいは S式だったらいくらでも記号使える(予約語みたいのあったっけ?) し基本人間が読むものじゃないから

(# $ ( (@ "x" (& $)) (~ (@ "f" (& %)))))

(まだ記号に特に意味はない) とか、

とにかく実際どういうデータでやり取りするかの仕様が必要。

@ympbyc VM の実装が終わったら、 Haskell の Inst 型からテキストデータに変換する関数書いてくれ〜

記号に置き換えまくった方がファイルサイズ小さくなるから好みです。

予約語は括弧だけだよ。
記号にするくらいならFRMとかFRZ、REFとかの方がいい。わざわざ難読化する必要ある?

いや、たぶんないw

じゃあ FRM とかでも frame でもやまぴくの好みの方で仕様を決めちゃって〜

あと、

もとのソースコードのメタデータを埋め込めれば、エラー時のメッセージとかで使えるから嬉しい。

これできたら嬉しいと思う。

メタデータは行数ともとの関数の名前くらい?ほかになにかあるかな

そうだね。たぶんそれくらいでいいと思う。

必要になったらあとで追加しても良いし

!funcall 
  !lambda x x 
  5

(FRZ 3 ((LDC 3 5) (RET 3)))
(LDF 2 x ((REF 2 x) (THW 2) (RET 2)))
(APP 1)

になる。
(インストラクション名 行数 引数...)
インストラクション名は基本的にSECDマシンのものに準拠

とかでいいかな

メタデータはリストにしといた方がいいかも。
(FRZ (3) (...
とか

いいよ〜