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

これは日本語版。
https://ja.wikibooks.org/wiki/48%E6%99%82%E9%96%93%E3%81%A7Scheme%E3%82%92%E6%9B%B8%E3%81%93%E3%81%86

Haskellで簡単なShemeインタープリターを実装する方法が上記のサイトで解説されているが、おれはHaskellを書けないのでF#で書いた。

Haskellだと変数の代入やエラーハンドリングで「モ」から始まる例の単語が飛び交うことになり、コードをパッと見しただけではなにがなんだかわからなくなるのだが、F#ではそんなことはなく由緒正しい手続き的なコーディングを許容してくれる。

このチュートリアル、変数名や関数名とそれらに対応する値を格納するデータ構造(いわゆる「環境」)には、単純なリストを採用している。なにを思ったのか、「リストやと計算量O(n)やんけ。普通こういうのにはハッシュテーブルだの二分木だのを使うんやろ?ギッハブの言語処理系のコードでみたことあるで。」ということでMapやSortedDictionaryで途中まで頑張っていたのだが、見事にバグらせてしまった。おれみたいなアホは素直に教科書の言うことを聞きましょう。

実はおれの実装にはバグが残っている。右閉じカッコ直前に空白が入っていると正しくパースできないのである。spaces >>. pchar ')'とかしてもできない。やはりおれは頭が悪い。

やり終えてから気づいたこと

これって単にHaskellからF#に翻訳しただけじゃね?