頑張っているつもりのブログ

幅広くそれっぽい技術に関することを述べていきます

Go言語でつくるインタプリタを読了した

タイトル通り。Go言語でつくるインタプリタを読み終えました。 読み終えたというより、記載されているコードを実装し終えたと言ったほうがよいですかね。

https://www.amazon.co.jp/gp/product/4873118220

Rubyのしくみを少し読んだことあって、そこでインタプリタについて触れていたので、どういう実装の流れになるかなんとなくはわかってた のですが、実際に実装するのは初めてだったので、それとなく理解を深められた気がします。

github.com

流れ的には、 字句解析(lexer) -> 構文解析(parser) -> 評価(evaluator)と言う感じでした。 字句解析では文字列として受け取り、次の文字を検査して、対応するトークンに当てはめる。 構文解析トークン列からASTを定義していき、 評価は定義されたASTから実際の処理を行う。をコードで実践して学ぶことが出来ました。

まあ読み終えた感想をちょっと書こうかなーと。

よかったこと・疑問に思ったこと

インタプリタの実装を学べたのも良かったけど、Goで実装されていたのでそれ自体の学びにもなった。

interface の活用方法も良かったし、最近spockというテストフレームワークいいなと思っていたので、テーブルドリブンテストを用いたテストの書き方はとても良かった。

あとは、テストを先に記述するスタイルだったので、その雰囲気が掴めたこともよかった。 同じようなテストをコピペしていくのもだんだんめんどくさくなってくる

それでも、パッケージ名は *_test ではないことが少し疑問ではありました。対象のテスト関数がpublicだったのもあって、別にprivate関数にアクセスする必要ないんじゃない?と。

アサーションを用いるところでは(特にswitch)、同じ変数に代入していましたが、変数を束縛したい気持ちのある性分ですこし疑問でした。

「あ、ジェネリクス欲しくね...?」って思う時があった。slice定義の局面で。 []int{} []string{} を受け取ることができれば、下記のコード部分も ArrayObject 評価するテストが楽になったのではないかと思ってしまいました...

gopter/evaluator_test.go at master · wasanx25/gopter · GitHub

良さそうな記事もありましたが、やっぱう〜んというかんじですよね。

【Go言語】[]string, []int to []interface{} とかそういうの - DRYな備忘録

まあGoを書き続けるなら筋力が必要。

まとめ

Goとインタプリタの実装を学ぶことが出来たので良かったです。ベースがコードなので進めやすい。

いい本でしたっ。