天天看點

SICP讀到第二章時對Scheme的了解

在Scheme中,

一個括号裡包含了一個基本單元。

括号裡可以包含基本的資料,或者由别的括号圍起來的的基本單元。

比如 ( + 1 2 ),它有兩種意義:第一種,它代表了1+2這個運算過程,第二種,它代表了整數3.

再比如 ( define x 1 ),有兩種意義:第一種,它代表了“将x的值設定成1”這個運算過程。

第二種意義,它傳回一個東西,這個東西是值還是過程我也不知道(誤

但總之,( define 1 )代表了一個值或者過程。

在Scheme中,值和過程分的并不是那麼清楚,這是最令我驚奇和着迷的地方。

一個過程也可以作為傳回值,傳回給其它的過程作為一個參數來使用。

這句話可能有點抽象。但其實在C語言中有類似的概念,那就是函數指針。

在C語言中,函數指針指向了函數的起始位址,也就是函數的入口。這個指針是一個十六進制整數值,

但是這個整數又指向了一個函數,是以它又可以被看做一個函數。

是以C語言中,使用函數指針,可以達到Scheme中的,“把過程作為參數傳進去”、“把過程作為參數傳出來” 這兩個目的。

是以這就是函數式程式設計了對嗎?

下面讨論一下scheme的括号的意義

一對括号就代表了一個值,這個值可以是正常意義上的值,也可以是過程,也可以是空的:()

括号裡的東西由兩種元素組成:資料和對資料的操作。

第一項是對資料的操作,後面的都是資料。

但是,資料和操作分的并不是那麼清楚。

是以操作也可以被操作所操作(我覺得這句話會燒掉讀者的大腦)

比如

(define * 2)
(+ * * * *)
           

這麼做會輸出8,因為你把乘号定義成了2,這個例子雖然有些匪夷所思,但是可以說明,scheme語言的靈活性。

就像SICP第一章所說的:

”Lisp不像其它程式設計語言,它給了過程完全的第一級狀态。這就給有效實作提出了挑戰,但由此所獲得的描述能力卻是極其驚人的。“

繼續閱讀