sicp學習筆記(1.1.4~1.1.5)
周銀輝
書接上一回, 這裡是我在學習1.1.4~1.1.5時的一些筆記
1, 標準過程與復合過程
以 scheme為例, 作為一門語言, 其內建了一些原始過程(或稱之為標準的過程)與scheme環境中, 比如, + 實際上與某個內建過程關聯(繫結)了起來, 該過程接收兩個引數並完成求和運算, 而字元"+"則是給該過程取的乙個"名字". 同樣, abs與某個內建過程關聯起來了, 其完成求絕對值的操作.
如果我們將多個標準過程組合起來構成某乙個相對複雜的運算過程,這個過程就成為復合過程, 同樣, 我們會將某個名字與該復合過程關聯起來.
在" 名字"和"過程"的關聯中, 首先名字對於乙個組合過程來說並不是必須的,正如lambda表示式 ( 我不指c#的lambda表示式, c#的lambda表示式和匿名方法是一回事情, 注意了,"匿名"不是"無名", 只是對我們程式設計人員不可見而已,感覺是在玩「語法糖衣」,關於這個問題,我保留意見,我也不太了解c#的lambda, 不過關於λ演算,看
這裡 ).
其次, "名字"和"過程"之間的關聯關係也可以被重寫的, 某些語言可能只允許你重寫部分, 而scheme是這樣說的 : "程式可以使用最高層定義繫結任意變數,隨後也可以用賦值操作(參見4.1.6)改變任何乙個這樣的繫結。這些操作不會改變scheme 內建過程的行為。改變任何沒有通過定義引入的最高層繫結,其結果對於內建過程的影響是未定義的"
2, 求值與代換模型
如果讓我們對數字「5」進行求值的話,我們能輕鬆回答出來,其值就是其所代表的值5.
如果讓我們對變數 a 進行求值的話,那麼比較簡單,其值為某個與之相關聯的值(也許它在記憶體的某個地方)。 這裡的的「關聯」也就是sicp中常說的」繫結「,實際上是「環境"幫我們做的。"環境"維護著乙個由"鍵值對"組成的表結構,其"鍵"實際上就是我們的變數名,"值"為與該變數名相關聯的某種型別的"物件". 最最基本的能夠實現這種繫結的操作是我們的(define a b) , 它將a和b(或b的位址)作為乙個鍵值對放到某個表結構中.
如果讓我們對運算子"+"進行求值呢? 注意到上面在說"標準過程"和"復合過程"時, 已經提到, 實際上它也是與某個過程關聯起來的, 它是個過程名, 很簡單地, 如果我們將"+"理解成乙個變數名, 參考上面所說的對變數a的求值, 一切就變得簡單起來. 那麼"+"所對應的值是什麼呢? 是完成加法操作的指令序列. 所以對"+"這樣的運算子也是可以求值的.(這些語句是我的個人理解, 沒有多大把握 : 我們知道 λ 運算可以定義幾乎任何東西, 比如"加法運算"可以表示成 λ m. λ n. λ f. λ x. m f (n f x) , "數字0"可以表示成0 = λ
f. λ
x. x 等等, 那麼有了defined和 λ 運算是否就可以支撐起整個scheme或與之類似的語言呢?)
如果讓我們對 (+ a 5 ) 進行求值的話,(先不考慮應用序與正則序的問題) 首先應該是對各個子表示式依次求值,對+求值得到乙個指令序列,我們用來表示, 然後對對a求值,我們假設為3,然後對5求值, 很簡單, 5, 於是乎,得到了這樣乙個表示式( 3 5)(至於如何求該表示式的值,待會再**)。 我們剛剛假設a為乙個簡單的變數,其值為3, 如果我們現在假設a為乙個過程名,它與某個過程pro相關聯,假設pro為(+ 1 2 )。如果我們的直譯器先將pro的值計算出來, 然後用計算出來的值去替代表示式中的a, 那麼我們的表示式將變成( 3 5),這樣的求值順序就是sicp中所說的「應用序」,相反,如果 不計算pro而直接將pro的表示式內聯到原表示式中,即用(+ 1 2)替換a,那麼我們的表示式將變成( (+ 1 2) 5),而(+ 1 2)將在最後整個表示式被完全展開後計算,這樣的求值順序就是"正則序"。 在應用序和正則序中我們都用到了的"替換", 也就是我們所說的"代換模型"
關於如何求值( 3 5)將在3.2.1中介紹,不過大體規則是這樣的:
如果要對表示式a求值,那麼就需要
1)對其各個子表示式a求值,我們假設對子表達a的求值過程寫作eval(a)
在(+ 3 5)中,對"+"的求值結果是,對 3與5的求值結果就是他們本身,所以將對應的指令應用於3 5,便計算出結果了。
注:這是一篇讀書筆記,所以其中的內容僅屬個人理解而不代表sicp的觀點,並隨著理解的深入其中的內容可能會被修改
SICP學習筆記(1 1 4 1 1 5)
sicp學習筆記 1.1.4 1.1.5 周銀輝 書接上一回,這裡是我在學習1.1.4 1.1.5時的一些筆記 1,標準過程與復合過程 以 scheme為例,作為一門語言,其內建了一些原始過程 或稱之為標準的過程 與scheme環境中,比如,實際上與某個內建過程關聯 繫結 了起來,該過程接收兩個引數...
SICP學習筆記(1 1 1 1 1 3)
sicp學習筆記 1.1.1 1.1.3 周銀輝 sicp,即structure and interpretation of computer programs,電腦程式的構造和解釋,是mit 麻省理工學院 一門經典課程,相信很多程式愛好者都讀過,最近我也抽空讀了讀,挺有意思的。算是對大學知識 高數...
SICP學習筆記(一)
一直在斷斷續續地看sicp,確實字字珠璣,今天總算看了前兩章,習題做了一部分,不過日後肯定還是要回頭重看的,現在略微回頭總結一下。1 好的程式語言應提供的三種機制 基本表示式 組合 抽象 實際上我們自己也可以為特定問題制定自己的 語言 是否具有上述能力是這個語言是否強大的關鍵 2 過程作為黑箱的抽象...