SICP学习笔记(1.1.4~1.1.5)
生活随笔
收集整理的這篇文章主要介紹了
SICP学习笔记(1.1.4~1.1.5)
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
? ? SICP學(xué)習(xí)筆記(1.1.4~1.1.5)
????????????????????????????????? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? 周銀輝
書接上一回, 這里是我在學(xué)習(xí)1.1.4~1.1.5時的一些筆記
1, 標(biāo)準(zhǔn)過程與復(fù)合過程
以 Scheme為例, 作為一門語言, 其內(nèi)置了一些原始過程(或稱之為標(biāo)準(zhǔn)的過程)與Scheme環(huán)境中, 比如, + 實際上與某個內(nèi)置過程關(guān)聯(lián)(綁定)了起來, 該過程接收兩個參數(shù)并完成求和運算, 而字符"+"則是給該過程取的一個"名字". 同樣,? abs與某個內(nèi)置過程關(guān)聯(lián)起來了, 其完成求絕對值的操作.
如果我們將多個標(biāo)準(zhǔn)過程組合起來構(gòu)成某一個相對復(fù)雜的運算過程,這個過程就成為復(fù)合過程, 同樣, 我們會將某個名字與該復(fù)合過程關(guān)聯(lián)起來.
在" 名字"和"過程"的關(guān)聯(lián)中, 首先名字對于一個組合過程來說并不是必須的,正如lambda表達(dá)式 ( 我不指c#的lambda表達(dá)式, c#的lambda表達(dá)式和匿名方法是一回事情, 注意了,"匿名"不是"無名", 只是對我們編程人員不可見而已,感覺是在玩“語法糖衣”,關(guān)于這個問題,我保留意見,我也不太了解C#的lambda, 不過關(guān)于λ演算,看這里? ).
其次, "名字"和"過程"之間的關(guān)聯(lián)關(guān)系也可以被重寫的, 某些語言可能只允許你重寫部分, 而Scheme是這樣說的 : "程序可以使用最高層定義綁定任意變量,隨后也可以用賦值操作(參見4.1.6)改變?nèi)魏我粋€這樣的綁定。這些操作不會改變Scheme 內(nèi)置過程的行為。改變?nèi)魏螞]有通過定義引入的最高層綁定,其結(jié)果對于內(nèi)置過程的影響是未定義的"
2, 求值與代換模型
如果讓我們對數(shù)字“5”進(jìn)行求值的話,我們能輕松回答出來,其值就是其所代表的值5.
如果讓我們對變量 a 進(jìn)行求值的話,那么比較簡單,其值為某個與之相關(guān)聯(lián)的值(也許它在內(nèi)存的某個地方)。 這里的的“關(guān)聯(lián)”也就是SICP中常說的”綁定“,實際上是“環(huán)境"幫我們做的。"環(huán)境"維護(hù)著一個由"鍵值對"組成的表結(jié)構(gòu),其"鍵"實際上就是我們的變量名,"值"為與該變量名相關(guān)聯(lián)的某種類型的"對象". 最最基本的能夠?qū)崿F(xiàn)這種綁定的操作是我們的(Define A B) , 它將A和B(或B的地址)作為一個鍵值對放到某個表結(jié)構(gòu)中.
如果讓我們對運算符"+"進(jìn)行求值呢? 注意到上面在說"標(biāo)準(zhǔn)過程"和"復(fù)合過程"時, 已經(jīng)提到, 實際上它也是與某個過程關(guān)聯(lián)起來的, 它是個過程名, 很簡單地, 如果我們將"+"理解成一個變量名, 參考上面所說的對變量a的求值, 一切就變得簡單起來.? 那么"+"所對應(yīng)的值是什么呢? 是完成加法操作的指令序列. 所以對"+"這樣的運算符也是可以求值的.(這些語句是我的個人理解, 沒有多大把握 : 我們知道 λ 運算可以定義幾乎任何東西, 比如"加法運算"可以表示成 λ m. λ n. λ f. λ x. m f (n f x) , "數(shù)字0"可以表示成0 = λ f. λ x. x 等等, 那么有了Defined和 λ 運算是否就可以支撐起整個Scheme或與之類似的語言呢?)
如果讓我們對 (+ a 5 ) 進(jìn)行求值的話,(先不考慮應(yīng)用序與正則序的問題) 首先應(yīng)該是對各個子表達(dá)式依次求值,對+求值得到一個指令序列,我們用{Add}來表示, 然后對對a求值,我們假設(shè)為3,然后對5求值, 很簡單, 5, 于是乎,得到了這樣一個表達(dá)式({Add} 3? 5)(至于如何求該表達(dá)式的值,待會再探討)。 我們剛剛假設(shè)a為一個簡單的變量,其值為3, 如果我們現(xiàn)在假設(shè)a為一個過程名,它與某個過程pro相關(guān)聯(lián),假設(shè)pro為(+ 1 2 )。如果我們的解釋器先將pro的值計算出來, 然后用計算出來的值去替代表達(dá)式中的a, 那么我們的表達(dá)式將變成({Add}? 3 5),這樣的求值順序就是SICP中所說的“應(yīng)用序”,相反,如果 不計算pro而直接將pro的表達(dá)式內(nèi)聯(lián)到原表達(dá)式中,即用(+ 1 2)替換a,那么我們的表達(dá)式將變成({Add} (+ 1 2) 5),而(+ 1 2)將在最后整個表達(dá)式被完全展開后計算,這樣的求值順序就是"正則序"。 在應(yīng)用序和正則序中我們都用到了的"替換", 也就是我們所說的"代換模型"
關(guān)于如何求值({Add} 3 5)將在3.2.1中介紹,不過大體規(guī)則是這樣的:
如果要對表達(dá)式A求值,那么就需要
1)對其各個子表達(dá)式a求值,我們假設(shè)對子表達(dá)a的求值過程寫作Eval(a)
2)將運算符子表達(dá)式的值b應(yīng)用于運算對象只表達(dá)式的值, 寫作 Apply (b)
遞歸應(yīng)用Eval(a)與 Apply (b)直到表達(dá)式化為“最簡”(這里的最簡對應(yīng)普通開發(fā)人員而言,即由一些基本過程,基本數(shù)據(jù),謂詞等等組成。對解釋器而言,可能還有更細(xì)的劃分)
在(+ 3 5)中,對"+"的求值結(jié)果是{Add},對 3與5的求值結(jié)果就是他們本身,所以將{Add}對應(yīng)的指令應(yīng)用于3? 5,便計算出結(jié)果了。
注:這是一篇讀書筆記,所以其中的內(nèi)容僅屬個人理解而不代表SICP的觀點,并隨著理解的深入其中的內(nèi)容可能會被修改
????????????????????????????????? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? 周銀輝
書接上一回, 這里是我在學(xué)習(xí)1.1.4~1.1.5時的一些筆記
1, 標(biāo)準(zhǔn)過程與復(fù)合過程
以 Scheme為例, 作為一門語言, 其內(nèi)置了一些原始過程(或稱之為標(biāo)準(zhǔn)的過程)與Scheme環(huán)境中, 比如, + 實際上與某個內(nèi)置過程關(guān)聯(lián)(綁定)了起來, 該過程接收兩個參數(shù)并完成求和運算, 而字符"+"則是給該過程取的一個"名字". 同樣,? abs與某個內(nèi)置過程關(guān)聯(lián)起來了, 其完成求絕對值的操作.
如果我們將多個標(biāo)準(zhǔn)過程組合起來構(gòu)成某一個相對復(fù)雜的運算過程,這個過程就成為復(fù)合過程, 同樣, 我們會將某個名字與該復(fù)合過程關(guān)聯(lián)起來.
在" 名字"和"過程"的關(guān)聯(lián)中, 首先名字對于一個組合過程來說并不是必須的,正如lambda表達(dá)式 ( 我不指c#的lambda表達(dá)式, c#的lambda表達(dá)式和匿名方法是一回事情, 注意了,"匿名"不是"無名", 只是對我們編程人員不可見而已,感覺是在玩“語法糖衣”,關(guān)于這個問題,我保留意見,我也不太了解C#的lambda, 不過關(guān)于λ演算,看這里? ).
其次, "名字"和"過程"之間的關(guān)聯(lián)關(guān)系也可以被重寫的, 某些語言可能只允許你重寫部分, 而Scheme是這樣說的 : "程序可以使用最高層定義綁定任意變量,隨后也可以用賦值操作(參見4.1.6)改變?nèi)魏我粋€這樣的綁定。這些操作不會改變Scheme 內(nèi)置過程的行為。改變?nèi)魏螞]有通過定義引入的最高層綁定,其結(jié)果對于內(nèi)置過程的影響是未定義的"
2, 求值與代換模型
如果讓我們對數(shù)字“5”進(jìn)行求值的話,我們能輕松回答出來,其值就是其所代表的值5.
如果讓我們對變量 a 進(jìn)行求值的話,那么比較簡單,其值為某個與之相關(guān)聯(lián)的值(也許它在內(nèi)存的某個地方)。 這里的的“關(guān)聯(lián)”也就是SICP中常說的”綁定“,實際上是“環(huán)境"幫我們做的。"環(huán)境"維護(hù)著一個由"鍵值對"組成的表結(jié)構(gòu),其"鍵"實際上就是我們的變量名,"值"為與該變量名相關(guān)聯(lián)的某種類型的"對象". 最最基本的能夠?qū)崿F(xiàn)這種綁定的操作是我們的(Define A B) , 它將A和B(或B的地址)作為一個鍵值對放到某個表結(jié)構(gòu)中.
如果讓我們對運算符"+"進(jìn)行求值呢? 注意到上面在說"標(biāo)準(zhǔn)過程"和"復(fù)合過程"時, 已經(jīng)提到, 實際上它也是與某個過程關(guān)聯(lián)起來的, 它是個過程名, 很簡單地, 如果我們將"+"理解成一個變量名, 參考上面所說的對變量a的求值, 一切就變得簡單起來.? 那么"+"所對應(yīng)的值是什么呢? 是完成加法操作的指令序列. 所以對"+"這樣的運算符也是可以求值的.(這些語句是我的個人理解, 沒有多大把握 : 我們知道 λ 運算可以定義幾乎任何東西, 比如"加法運算"可以表示成 λ m. λ n. λ f. λ x. m f (n f x) , "數(shù)字0"可以表示成0 = λ f. λ x. x 等等, 那么有了Defined和 λ 運算是否就可以支撐起整個Scheme或與之類似的語言呢?)
如果讓我們對 (+ a 5 ) 進(jìn)行求值的話,(先不考慮應(yīng)用序與正則序的問題) 首先應(yīng)該是對各個子表達(dá)式依次求值,對+求值得到一個指令序列,我們用{Add}來表示, 然后對對a求值,我們假設(shè)為3,然后對5求值, 很簡單, 5, 于是乎,得到了這樣一個表達(dá)式({Add} 3? 5)(至于如何求該表達(dá)式的值,待會再探討)。 我們剛剛假設(shè)a為一個簡單的變量,其值為3, 如果我們現(xiàn)在假設(shè)a為一個過程名,它與某個過程pro相關(guān)聯(lián),假設(shè)pro為(+ 1 2 )。如果我們的解釋器先將pro的值計算出來, 然后用計算出來的值去替代表達(dá)式中的a, 那么我們的表達(dá)式將變成({Add}? 3 5),這樣的求值順序就是SICP中所說的“應(yīng)用序”,相反,如果 不計算pro而直接將pro的表達(dá)式內(nèi)聯(lián)到原表達(dá)式中,即用(+ 1 2)替換a,那么我們的表達(dá)式將變成({Add} (+ 1 2) 5),而(+ 1 2)將在最后整個表達(dá)式被完全展開后計算,這樣的求值順序就是"正則序"。 在應(yīng)用序和正則序中我們都用到了的"替換", 也就是我們所說的"代換模型"
關(guān)于如何求值({Add} 3 5)將在3.2.1中介紹,不過大體規(guī)則是這樣的:
如果要對表達(dá)式A求值,那么就需要
1)對其各個子表達(dá)式a求值,我們假設(shè)對子表達(dá)a的求值過程寫作Eval(a)
2)將運算符子表達(dá)式的值b應(yīng)用于運算對象只表達(dá)式的值, 寫作 Apply (b)
遞歸應(yīng)用Eval(a)與 Apply (b)直到表達(dá)式化為“最簡”(這里的最簡對應(yīng)普通開發(fā)人員而言,即由一些基本過程,基本數(shù)據(jù),謂詞等等組成。對解釋器而言,可能還有更細(xì)的劃分)
在(+ 3 5)中,對"+"的求值結(jié)果是{Add},對 3與5的求值結(jié)果就是他們本身,所以將{Add}對應(yīng)的指令應(yīng)用于3? 5,便計算出結(jié)果了。
注:這是一篇讀書筆記,所以其中的內(nèi)容僅屬個人理解而不代表SICP的觀點,并隨著理解的深入其中的內(nèi)容可能會被修改
總結(jié)
以上是生活随笔為你收集整理的SICP学习笔记(1.1.4~1.1.5)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: WCF分布式开发常见错误(26):Aut
- 下一篇: NHibernate简介