最近、Parserを書く or 書いたら楽になりそうな仕事が多いのでHaskellのParsecみたいなライブラリを探していたら
@lambda_sakura mpc (Monadic Parser Combinator)なるものが存在します
— κeen (@blackenedgold) December 9, 2014
というアドバイスをもらったので、早速mpcの使い方を学びつつLispインタプリタ(もどき)を作ってみました。
Write_Yourself_a_Scheme_in_48_Hours でParsecの使い方を覚えたので、mpcでも同じような方針で Lispインタプリタを実装してみました。
なお、幾つか手を抜いています。
- cons, equal, eq の実装がない
- cond の実装がない
- 例外処理をまともに実装していない
あたりがそうです。
コードはbitbucketに上げてみました。
https://bitbucket.org/lambda_sakura/lisp-parser/
使い方で困ることはなかったのですが、Parsecで最初にこの手のmonadic parserを覚えたので
- カリー化のためにalexandriaのcurryを利用する
- parsecだと標準である
letter
とかの便利な関数がない
など細かいところが気になりました。
ほとんどが言語仕様の差なので慣れれば問題ないでしょう。
どうしても気になるならマクロを書けば解決するでしょう。
今後文字列解析をCommon Lispでやるならmpcを積極的に活用してみようかと思います。