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関数に渡して実行しています。