F#で『Write Yourself a Scheme in 48 Hours』をやる
リポジトリはこれ。
https://github.com/guricerin/FSharp.Scheme
元サイトはこれ。
https://en.wikibooks.org/wiki/Write_Yourself_a_Scheme_in_48_Hours
Haskellで簡単なShemeインタープリターを実装する方法が上記のサイトで解説されているが、おれはHaskellを書けないのでF#で書いた。
Haskellだと変数の代入やエラーハンドリングで「モ」から始まる例の単語が飛び交うことになり、コードをパッと見しただけではなにがなんだかわからなくなるのだが、F#ではそんなことはなく由緒正しい手続き的なコーディングを許容してくれる。
このチュートリアル、変数名や関数名とそれらに対応する値を格納するデータ構造(いわゆる「環境」)には、単純なリストを採用している。なにを思ったのか、「リストやと計算量O(n)やんけ。普通こういうのにはハッシュテーブルだの二分木だのを使うんやろ?ギッハブの言語処理系のコードでみたことあるで。」ということでMapやSortedDictionaryで途中まで頑張っていたのだが、見事にバグらせてしまった。おれみたいなアホは素直に教科書の言うことを聞きましょう。
実はおれの実装にはバグが残っている。右閉じカッコ直前に空白が入っていると正しくパースできないのである。spaces >>. pchar ')'
とかしてもできない。やはりおれは頭が悪い。
やり終えてから気づいたこと
これって単にHaskellからF#に翻訳しただけじゃね?