monkey-nim
https://interpreterbook.com/img/monkey_logo-d5171d15.png
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するように修正する
code: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参考
参考