用 Lisp 解釋 Lisp (2010-12-09)

最近在讀《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-actionquote, lambda, cond之外函數(shù)交由*application處理。*application對函數(shù)和參數(shù)列表分別進(jìn)行處理,按函數(shù)類型將primitive交給apply-primitive,而將non-primitive交給apply-closure處理。

evlis對 list 中的各個元素依次求值,把結(jié)果合成一個 list 返回。

evcon用于對cond求值。

剩下的各位還是看書吧??

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • //Clojure入門教程: Clojure – Functional Programming for the J...
    葡萄喃喃囈語閱讀 4,039評論 0 7
  • 林子大了什么鳥都有。明白的地方都是中規(guī)中矩的嚴(yán)明律己。 中途抽煙,休息,吃飯,都是有條文規(guī)定的,地點(diǎn)時間明確得讓人...
    余巍_d00a閱讀 232評論 0 0
  • 久違遇見最美好的自己,平淡的生活本是一種福。 不知不覺上半年已經(jīng)過去了,只記得上半年我每天在路上,周轉(zhuǎn)于飛機(jī)、大巴...
    胖嘟嘟的貓咪閱讀 529評論 0 1
  • 我在翻譯在德國的注意事項(xiàng) 我:看我像不像商界大佬 于:嗯 是挺像大佬
    檻上人45閱讀 165評論 0 1
  • 2017年11月23日我在實(shí)小講了一節(jié)課,一年級的《道德與法制》,感覺這次講課比以前進(jìn)步了很多,沒有了緊張...
    心如止水鵑閱讀 177評論 0 0

友情鏈接更多精彩內(nèi)容