最近在讀《The Little Schemer》,一到七章都還好,到第八章就開始云里霧里了。書讀不透,那么看代碼吧。好在已經(jīng)有了把示例都整理好了。那么開始吧。
我們期望能寫出一個能對任意表達(dá)式求值的函數(shù),一般叫它eval。不過,這里為了強(qiáng)調(diào)是我們自己的求值函數(shù),叫它 value 。
我們先來看兩個求值過程:
(value 6)

(value '(add1 6)) ; 7

我們不禁要問,這么多函數(shù)是必要的嗎?它們起什么作用?
顯然,value是個入口函數(shù),因?yàn)樗挥玫搅艘淮巍?/p>
meaning需要一個表達(dá)式和一張記錄變量名和其值的對照表(上下文環(huán)境)。這就引出一個問題,什么時候改寫對照表?(*application)
接著,由expression-to-action判斷表達(dá)式是否為原子( atom ),是的話交給atom-to-action(如果是數(shù)字、真假、cons, car, cdr, null?, eq?, atom?, zero?, add1, sub1, number?,就交給*const;其他交給*identifier);否則交給list-to-action。
函數(shù)分為內(nèi)置函數(shù)( primitive )和自定義函數(shù)( non-primitive )兩類。語言規(guī)定了內(nèi)置函數(shù)的行為,但對于自定義函數(shù),我們只能在運(yùn)行時確定,所以需要在定義時把它們的相關(guān)信息(如:參數(shù)、函數(shù)體)寫進(jìn)對照表。
它們分別是這么存儲的:
(primitive primitive-name)
(non-primitive (table formals body)) (上下文 形參 函數(shù)體)
如,
(lambda (x) (cons x y))
對照表的內(nèi)容是
((( y z)
((8) 9)))
那么,解釋器內(nèi)部是這么存儲的:

其中,list (table formals body)叫做 closure record .
list-to-action將quote, lambda, cond之外函數(shù)交由*application處理。*application對函數(shù)和參數(shù)列表分別進(jìn)行處理,按函數(shù)類型將primitive交給apply-primitive,而將non-primitive交給apply-closure處理。
evlis對 list 中的各個元素依次求值,把結(jié)果合成一個 list 返回。
evcon用于對cond求值。
剩下的各位還是看書吧??