SICP學習筆記(1 1 1 1 1 3)

2021-05-07 11:59:51 字數 1964 閱讀 3076

sicp學習筆記(1.1.1~1.1.3)

周銀輝

sicp,即structure and interpretation of computer programs, 電腦程式的構造和解釋,是mit(麻省理工學院)一門經典課程,相信很多程式愛好者都讀過,最近我也抽空讀了讀,挺有意思的。算是對大學知識(高數,線代,編譯,演算法....)的「溫故而知新」吧。

這裡是我在學習1.1.1~1.1.3節時做的一些筆記。

1,基本工具

語言:當然是 lisp,在其眾多方言中,我選擇的是scheme,關於scheme的教程,王詠剛的r5rs試譯稿不錯,這裡

ide  :  推薦pltscheme (或者叫drscheme),很好用。

2,表示式

中綴表示式(infix expression )

比如a * ( b + c ) / d比較符合我們的思維習慣,但其乙個很明顯的缺點是,其需要額外的資訊來比較操作符的優先順序,如果需要打破這種優先順序關係的話,我們這需要用到括號,對於計算機而言,計算乙個中綴表示式比計算字首或字尾表示式要來的麻煩, 況且一元運算子沒有中綴形式。

字尾表示式(postfix expression)

也稱逆波蘭式,比如a b c + * d /,這個執行起來非常簡單:從左到右依次讀取運算元和操作符,當遇到操作符時,只需將該操作符左邊(或者說先與該操作符讀取的)n個運算元拿來就行該操作符對應的運算就是了,並將計算結果作為新的運算元。這裡的n,取決於操作符是幾元操作符。

字首表示式(prefixexpression)

也稱波蘭式,比如/ * a + b c d

和逆波蘭式比較一下,就可以發現,如果我們從右向左讀取字首表示式的話,那麼計算方式就和字尾表示式差不多了,只不過得注意下不對稱運算的順序(滿足交換律的運算我們稱之為對稱運算,反之則不對稱運算),scheme採用的是字首方式而非字尾,給出的解釋是說,其可以適用於帶任意個實參的形式,比如(* a b c )則表示a*b*c,但與之相對的是,為了不產生歧義,則需要用括號來界定表示式的範圍

對於這三種形式的相互轉換:

如果你是在草稿紙上手動轉換的話,可以使用下面的簡單方法:

比如a+b轉成字尾,很簡單a b +,觀察一下就發現了,字尾就是把操作符調整到「兩個運算元的後邊」,相應的字首形式就是

把操作符調整到「兩個運算元的前邊,所以

a*(b+c)/ d , 則中綴形式為 ((a * (b + c) ) / d)  , 字尾形式為  ( (a (b c +) *) d /)    字首形式為  (/ (* a (+ b c) ) d)

, 其中的多餘的括號是為了輔助我們將子表示式理解成運算元。

關於如何使用電腦程式構造parsetree並實現表示式轉換,我將在接下來的一篇隨筆中詳細解釋。

3,特殊形式(special forms)

我們將「數」,「內部運算子」以及其中相同級別的名字稱為」基本表示式「,比如 123,+ ,- 等,「數」作為基本表示式,其值是其所表示的數值,內部運算子的值是其完成該操作所對應的機器指令,其他名字的值則是環境中與該名字相對應的那個物件。

由「基本表示式」復合而成的稱為「組合式」(或「復合表示式」),比如 (1 2 +)

而類似於(define a 100)這種看上去像組合式,但卻不是組合式的,稱為」特殊形式「,之所以特殊,是因為你不會按照普通表示式的求值規則進行求值,其有著自己的求值規則。其中一些特殊形式是程式語言的基本需要,而另外一些則是為了提高易讀性,影響控制邏輯,實現抽象與模組化等等,更多的,可以參考這篇**,而scheme語法層面的可以參考這裡。

注:這是一篇讀書筆記,所以其中的內容僅屬個人理解而不代表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學習筆記(一)

一直在斷斷續續地看sicp,確實字字珠璣,今天總算看了前兩章,習題做了一部分,不過日後肯定還是要回頭重看的,現在略微回頭總結一下。1 好的程式語言應提供的三種機制 基本表示式 組合 抽象 實際上我們自己也可以為特定問題制定自己的 語言 是否具有上述能力是這個語言是否強大的關鍵 2 過程作為黑箱的抽象...

SICP學習筆記(二)

進入正題,第三章標題是模組化 物件和狀態,其實怎麼覺得這一章是講哲學問題的呢。模組化的意義在於 使這些系統能夠 自然地 劃分為一些具有內聚力的部分,使這些部分可以分別進行開發和維護 本章提出了兩種組織模式,一種是物件,一種是流 物件導向,對於絕大部分人應該是很熟悉的,畢竟用的太多,賦值,環境模型 或...