積読していていた
つくって学ぶプログラミング言語 RubyによるScheme処理系の実装 (達人出版会)
を読みつつ、Micro Schemeを作ることにした。
この本にも推奨されていたが、
内容を理解したら、本のコードを見ないで自分で実装する方が理解が深まるので
それに従って、実装した。
作成するプログラム
小さなScheme処理系Rubyで実装
SchemeプログラムはRubyのリストで表現
例: [:+, [:+, 1, 2], 3]
四則演算できるところまで実装した。
https://github.com/takeisa/uschemer/tree/v0.01
プログラム評価のアルゴリズム
(1)リストの場合関数呼び出しとして処理する。
(1)-1 リストの最初のシンボルに対応する関数を取得する。
※シンボルに対応する関数は USchemeR.FUNCS で定義している。
(1)-2 二番目以降の要素を引数として、全て評価する(再帰呼び出し)。
(1)-3 評価後の引数を関数に適用する。
(2)リスト以外の場合
a)数値の場合は数値を返す。
b)それ以外は関数を返す。
これだけ。
まだ、lambda式やクロージャも扱えないので、簡単だ。
実行例
eval_print(1)1 #=> 1
eval_print(:+)
:+ #=> #<Proc:0xb743dc8c@uschemer.rb:7>
eval_print([:+, 1, 2])
[:+, 1, 2] #=> 3
eval_print([:+, [:+, 1, 2], [:+, 3, 4]])
[:+, [:+, 1, 2], [:+, 3, 4]] #=> 10
0 件のコメント:
コメントを投稿