F#でインタープリタ

半年前くらいにJavaでおもちゃスクリプトを作ってみましたが、今度はF#で挑戦。

この週末にフィボナッチ計算ができるところまで作ってみました。
言語の構文は 2週間でできる! スクリプト言語の作り方 (Software Design plus) に出てくるStoneをベースにしています。

def fib (n) {
  if n < 2 {
    n
  } else {
    fib(n - 1) + fib(n - 2)
  }
}
fib(10)

だいたい、以下のような方針を採ってみましたが、今のところなんとかなっています。

  • FParsecでパース
  • 継続を使う
  • 永続データ型を使う(System.Collections.Generic.Dictionaryのような変更可能なデータ型を避ける)
  • 判別共用体を使う(Object型のような汎用的な型の利用を避ける)


とはいえ、FParsecは難しい。なかなか覚えられないです。スペースの扱いで結構はまりました。

継続は、まだ利点/欠点が把握できていないのですが、とりあえず、やたらと使っています。

現時点での一番の収穫は、Object型を使ったりダウンキャストしたりしないでパースした結果を評価できていることですね。汎用的な処理をするところでは、具体的な型が失われるのは仕方ないなと思っていましたが、判別共用体をうまく使えば避けられるんじゃないかと思いつつあります。