lisp on yarv製作日誌12

repl(read - eval - print - loop)で実行できるようにしました。

>(+ 1 2 3 4)
10
>(puts "hello, world")
hello, world

これをできるようにするためにコンパイラlisp on yarvで書き直しました。

こんな感じで実装しています。

(def (repl)
     (loop (block ()
	    (display ">")
	    (= expr (compile (read) false))
	    (display (eval expr TOPLEVEL_BINDING))
            (newline))))

loopは、rubyのloopメソッドです。(block (引数1 ・・・) 〜)でブロック渡しが
できます。
compile関数に(+ 1 2 3 4)のようなリストを渡すと、"1+2+3+4"という文字列としてコンパイルされるので、それをrubyのeval関数に渡して実行しています。