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