
200
|
第 6 章
程式設計進階技巧
構建程式卻完全沒有 proc 耗費更多心力,但是我們已經看到,只要不在意用點創造
力,就可以完成真正的工作。我們很快的討論幾種在這個最小環境編寫程式碼的其他技
巧。
無限串流
使用程式碼表示資料有一些有趣的優點。我們以 proc 為基礎的串列不一定是靜態:串
列只是在我們將它傳給
FIRST
和
REST
之際,執行正確運算的程式碼,因此我們很容易就
能實作忙著計算它們內容的串列,也就是所謂的
串流
(
stream
)。實際上,串流甚至沒
有理由必須是有限,因為在消耗它們的時候,計算只能產生串列內容,所以它可以持續
不斷產生新的值。
舉例來說,以下實作了無限串流的零:
ZEROS = Z[-> f { UNSHIFT[f][ZERO] }]
這是『無欺騙手段』版本的
ZEROS = UNSHIFT [ZEROS] [ZERO]
,是根據自身
的資料結構定義。作為程式開發人員,根據自身定義遞迴函式的想法,通
常會讓我們覺得滿意,但是根據自身定義的資料結構看起來可能很奇怪,
而且不尋常;它們在這種情況都完全一樣,而且 Z 組合器會讓兩者完全
合乎邏輯。
我們可以在主控台看到
ZEROS
的行為就像是串列,儘管好像可以無限延長:
>> to_integer(FIRST[ZEROS])
=> 0
>> to_integer(FIRST[REST[ZEROS]])
=> 0
>> to_integer(FIRST[REST[REST[REST[REST[REST[ZEROS]]]]]])
=> 0
雖然會將此串流轉換成 ...