SICP学习笔记(1.1.4~1.1.5)
生活随笔
收集整理的這篇文章主要介紹了
SICP学习笔记(1.1.4~1.1.5)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
? ? 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 ) 進行求值的話,(先不考慮應用序與正則序的問題) 首先應該是對各個子表達式依次求值,對+求值得到一個指令序列,我們用{Add}來表示, 然后對對a求值,我們假設為3,然后對5求值, 很簡單, 5, 于是乎,得到了這樣一個表達式({Add} 3? 5)(至于如何求該表達式的值,待會再探討)。 我們剛剛假設a為一個簡單的變量,其值為3, 如果我們現在假設a為一個過程名,它與某個過程pro相關聯,假設pro為(+ 1 2 )。如果我們的解釋器先將pro的值計算出來, 然后用計算出來的值去替代表達式中的a, 那么我們的表達式將變成({Add}? 3 5),這樣的求值順序就是SICP中所說的“應用序”,相反,如果 不計算pro而直接將pro的表達式內聯到原表達式中,即用(+ 1 2)替換a,那么我們的表達式將變成({Add} (+ 1 2) 5),而(+ 1 2)將在最后整個表達式被完全展開后計算,這樣的求值順序就是"正則序"。 在應用序和正則序中我們都用到了的"替換", 也就是我們所說的"代換模型"
關于如何求值({Add} 3 5)將在3.2.1中介紹,不過大體規則是這樣的:
如果要對表達式A求值,那么就需要
1)對其各個子表達式a求值,我們假設對子表達a的求值過程寫作Eval(a)
2)將運算符子表達式的值b應用于運算對象只表達式的值, 寫作 Apply (b)
遞歸應用Eval(a)與 Apply (b)直到表達式化為“最簡”(這里的最簡對應普通開發人員而言,即由一些基本過程,基本數據,謂詞等等組成。對解釋器而言,可能還有更細的劃分)
在(+ 3 5)中,對"+"的求值結果是{Add},對 3與5的求值結果就是他們本身,所以將{Add}對應的指令應用于3? 5,便計算出結果了。
注:這是一篇讀書筆記,所以其中的內容僅屬個人理解而不代表SICP的觀點,并隨著理解的深入其中的內容可能會被修改
????????????????????????????????? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? 周銀輝
書接上一回, 這里是我在學習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 ) 進行求值的話,(先不考慮應用序與正則序的問題) 首先應該是對各個子表達式依次求值,對+求值得到一個指令序列,我們用{Add}來表示, 然后對對a求值,我們假設為3,然后對5求值, 很簡單, 5, 于是乎,得到了這樣一個表達式({Add} 3? 5)(至于如何求該表達式的值,待會再探討)。 我們剛剛假設a為一個簡單的變量,其值為3, 如果我們現在假設a為一個過程名,它與某個過程pro相關聯,假設pro為(+ 1 2 )。如果我們的解釋器先將pro的值計算出來, 然后用計算出來的值去替代表達式中的a, 那么我們的表達式將變成({Add}? 3 5),這樣的求值順序就是SICP中所說的“應用序”,相反,如果 不計算pro而直接將pro的表達式內聯到原表達式中,即用(+ 1 2)替換a,那么我們的表達式將變成({Add} (+ 1 2) 5),而(+ 1 2)將在最后整個表達式被完全展開后計算,這樣的求值順序就是"正則序"。 在應用序和正則序中我們都用到了的"替換", 也就是我們所說的"代換模型"
關于如何求值({Add} 3 5)將在3.2.1中介紹,不過大體規則是這樣的:
如果要對表達式A求值,那么就需要
1)對其各個子表達式a求值,我們假設對子表達a的求值過程寫作Eval(a)
2)將運算符子表達式的值b應用于運算對象只表達式的值, 寫作 Apply (b)
遞歸應用Eval(a)與 Apply (b)直到表達式化為“最簡”(這里的最簡對應普通開發人員而言,即由一些基本過程,基本數據,謂詞等等組成。對解釋器而言,可能還有更細的劃分)
在(+ 3 5)中,對"+"的求值結果是{Add},對 3與5的求值結果就是他們本身,所以將{Add}對應的指令應用于3? 5,便計算出結果了。
注:這是一篇讀書筆記,所以其中的內容僅屬個人理解而不代表SICP的觀點,并隨著理解的深入其中的內容可能會被修改
總結
以上是生活随笔為你收集整理的SICP学习笔记(1.1.4~1.1.5)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: WCF分布式开发常见错误(26):Aut
- 下一篇: NHibernate简介