Golang でプログラミング言語を作る__Part24

Tuyoshi Akiyama
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がそれぞれマクロに対して行う処理を追加しました。

ただし、実際に quoteunquote を実装するのは、かなり複雑でした。というのも、どの段階でparising, evaluatingが行われているかの見極めが必要になっています。

)
Welcome to a place where words matter. On Medium, smart voices and original ideas take center stage - with no ads in sight. Watch
Follow all the topics you care about, and we’ll deliver the best stories for you to your homepage and inbox. Explore
Get unlimited access to the best stories on Medium — and support writers while you’re at it. Just $5/month. Upgrade