[ocaml] OCamlでLispのサブセットっぽいのを作ってみた

https://github.com/komamitsu/OCaml-minilisp

先日、仕事が一区切りついてボーッとしていたところ、「そういえばLisp系の言語に疎いなぁ自分」とふと思ったので、簡単なLispのサブセットを作ってみた。いま見ると文法的にはSchemeぽい。


こんな感じでREPLしたり、

$ ./minilisp
minilisp> (define
(fib n x1 x2)
(if (<= n 0)
x1
(fib (- n 1) x2 (+ x1 x2))))
Func(fib, [n, x1, x2], Cond(Apply(<=, Var(n), Num(0)), Var(x1), Apply(fib, Apply(-, Var(n), Num(1)), Var(x2), Apply(+, Var(x1), Var(x2)))))

minilisp> (fib 100 0 1)
Num(3736710778780434371)


ソースファイルを読んで評価したりできる。

$ cat sample.minilisp 
(define
  (fib n x1 x2)
  (if (<= n 0)
      x1
      (fib (- n 1) x2 (+ x1 x2))))

(print (fib 100 0 1))


$ ./minilisp sample.minilisp 
Num(3736710778780434371)


フィボナッチ数列でも計算できれば良いか、くらいの感じだったので、気がついたらcarもcdrも実装してなかった(シンボルもない)という何だかやる気のない感じが... 気が向いたらlambdaとかprognとかも一緒に実装しようかなぁ。気が向いたら。