generated at
monkey-nim

Nim実装のmonkey言語のインタプリタとコンパイラ
feature
括弧付き四則演算
変数束縛
関数定義と関数呼び出し
文字列結合
組み込み関数
len
string
list
first, rest, push, len
配列


ビルド
$ nimble build
実行
$ ./monkey_nim
デバッグ時
$ nim c -r src/monkey_nim.nim
テスト
$ nimble test

リファクタのTodo 2019/10/15
落ちる時に落ちるのではなくエラーを表示させたい
デバッグ用のecho関数群
macroを使ってより簡潔に記述する
実行時のコマンドラインオプションで、interpかcompどちらを起動するか選択できるようにする
FIXMEつぶす
TODOつぶす
CompilerとかのとこOption型使いたい
case文もっときれいにかける?
VMのOpPopは実質未実装状態

疑問
p.147
なんで、↓の時に、return 1が評価される?
return 10のあとにreturn 1が評価されている
if r.kind == ReturnValue に来る時にはもうreturn 1まで評価されている
なのでBlockStatementsを抜けたタイミングでreturnするように修正する
monkey
Test(input: """ if (10 > 1) { if(10 > 1) { return 10; } return 1; }""", expected: 10),


わすれた
コンパイル時ってどういう流れて出力する?
コンパイル時のテストってどういう挙動になっている?
makeByteとかが何してるか忘れた
コンパイル時ってどうやってechoデバッグしている?

メモ
もともとmonkeyのインタプリタは1行でしか入力できない仕様になっている
なので、オリジナリティを入れて改行で複文とかはそもそも無理
原因はASTが本のものと少し異なっている
本来は 1+2 1;2 も「 nkExpressionStatement の中のなにか」でないといけない
そして、その nkExpressionStatement の終わりにpopをすると良い
しかし、実装では nkExpressionStatement は含まれておらず直接、 nkInfixExpression だったり、 nkIntegerLiteral だったりするので良いタイミングでpopが呼べなくなっている
なのでCompile関数のProgramのところで呼ぶことにした


データ型
文字列
Haskell同様 String = [Char]


構成要素
let <identifier> = <expression>;
式(Expression)
値を生成する
42 , foo : 変数
文(Statement): 値を生成しない
let , return
for , if
式文(Expression Statement): 一つの式だけからなる文
x + 5


Nim参考


参考