Golang でプログラミング言語を作る__Part24
Aug 24, 2017 · 3 min read
前回まで、下の本を使って、Go言語でInterpreterを作ってきました。
ここでは、最後にputをbuiltin関数に追加します。
object/builtins.go
"puts": &object.Builtin{
Fn: func(args ...object.Object) object.Object {
for _, arg := range args {
fmt.Println(arg.Inspect())
} return NULL
},
},
putの引数を、ループで回して、それぞれを Inspect() で出力される値をprintします。
以上で、終了です。
感想
本を読み終えてみて、大まかなInterpreter(コンパイラー)の仕組みが理解できました。
また、TDDで作られていくことから、TableDrivenTestのやり方が身につきます。
内容としては、二章のparsing(解析処理)の部分が濃いものでしたが、ここを理解できれば、その後の処理(実際にコードが動く)も分かってきます。
これまでは、本の内容の写経となっていますが、自分で他のタイプも追加できそうですね。
あと、この本の章ごとに、記事を書いていきました。が、最初の記事から合わせて、26記事になったのは、改めて驚きました。
また、上記に加えて、Macro処理をプログラミング言語の機能を付けました。下のサイトで、タダで見れます。
処理としては、関数を呼んだ時に、その関数がマクロによって定義されたものかどうかの分岐処理を加えています。
後は、その処理をプログラミング言語が認識できるように、token, AST, objectにMACROを表すものを設定し、lexer, parser, evaluatorがそれぞれマクロに対して行う処理を追加しました。
ただし、実際に quote と unquote を実装するのは、かなり複雑でした。というのも、どの段階でparising, evaluatingが行われているかの見極めが必要になっています。
