[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とかも一緒に実装しようかなぁ。気が向いたら。