Go言語でつくるインタプリタを読了した
タイトル通り。Go言語でつくるインタプリタを読み終えました。 読み終えたというより、記載されているコードを実装し終えたと言ったほうがよいですかね。
https://www.amazon.co.jp/gp/product/4873118220
Rubyのしくみを少し読んだことあって、そこでインタプリタについて触れていたので、どういう実装の流れになるかなんとなくはわかってた のですが、実際に実装するのは初めてだったので、それとなく理解を深められた気がします。
流れ的には、 字句解析(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とインタプリタの実装を学ぶことが出来たので良かったです。ベースがコードなので進めやすい。
いい本でしたっ。