SchemeインタープリタをGoで書いた

背景

Structure and Interpretation of Computer Programs(SICP)を読んでいた。第4章でメタ循環評価機という話題が上がる。これはSchemeインタープリタSchemeで書くという、一見矛盾しているようなそんなものである。一旦、そのまま本を読み進めSchemeのコードを写経していき、Schemeのメタ循環評価機を作った。

しかし、SchemeSchemeインタープリタを書く、というのはどうにも自分の中で腹落ちしなかった。自分はインタープリタを書けた、また理解できた、という実感が得られなかった(これは単に写経しただけであったというのもあると思うが)。

このため、SchemeインタープリタScheme以外の言語で書くことにした。ここでは最近手に馴染んでいるGoで書くことに決めた。

goscheme

最低限の機能しかなく、またREPLのみしか対応していないが、書いたコードはGitHubに上げている。

github.com

メタ循環評価機を書いたときとの大きな違いは、LexerとParserを自分で書かなければならなかったことである。

Schemeのメタ循環評価機ではLexerとParserは必要ないためSICPにサンプルコードはなかったが、言語実装パターンに簡単なLL(k)パーサ書いて感覚を掴んでいたので、比較的スムーズにSchemeに対するLexerとParserを書くことができた。

また、既にSchemeインタープリタのGo実装は何人もの方によって書かれているが、特にsuzuken/gigueの実装が参考になった。感謝。

github.com