資料的過程性表示

2021-09-11 09:41:48 字數 2863 閱讀 6080

夜裡睡不著看起了 sicp,這裡是第二章《構造資料抽象》的筆記。

(cons x y) 表示乙個序對,記為 z。

(car z) 可以獲取 z 的第乙個元素 x。

(cdr z) 可以獲取 z 的第二個元素 y。

複製**

cons(讀作控死)、car(讀作卡) 和 cdr(讀作酷得兒)

翻譯成 js 風格的偽**就是

z = cons x y

car z // 值為 x

cdr z // 值為 y

複製**

有沒有可能 cons、car 和 cdr 其實是三個過程(也就是函式)呢?

只要 cons、car 和 cdr 三個函式滿足上面的要求即可,下面是這三個函式的寫法:

(define

(cons

x y)

(define

(dispatch m)

(cond

((=m 0) x)

((=m 1) y)

(else

(error

"argument not 0 or 1 -- cons" m))))

despatch)

(define

(car

z) (z

0))(define

(cdr

z) (z

1))複製**

翻譯成 js 大概是這樣的:

function

cons(x, y)

if(m===1)

throw

newerror('argument not 0 or 1 -- cons' + m)

}}function

car(z)

function

cdr(z)

複製**

這裡令人驚奇的地方就在於 cons 直接返回了乙個函式,並沒有返回乙個陣列之類的玩意。

不過這只是一種模擬,語言內部並不是這樣實現的。這種程式設計風格叫做「訊息傳遞」。

還可以這樣定義 cons、car、cdr

(define

(cons

x y)

(lambda

(m) (m x y)))

(define

(car

z) (z (lambda

(a b) a)))

(define

(cdr

z) (z (lambda

(a b) b))

複製**

翻譯成 js 是這樣

cons = (x, y)=> 

car = z =>

cdr = z =>

複製**

寫成這樣還挺燒腦的。

上面的知識點說明其實可以拋棄復合資料結構,全用函式就行了。

但是如果我告訴你,連數字都可以不需要呢?(假設只考慮非負整數,而且這種語言允許我們對函式進行任何操作)

0 用乙個函式來表示

zero = f => x => x // 這裡的 f 看起來沒有意義,要到下面才能理解

複製**

加1操作用另乙個函式來表示

add1 = n => f => x => f(n(f)(x))

複製**

1、2 的表示方法見習題答案。

zero= f => x => x

one = f => x => f(x)

two = f => x => f(f(x))

複製**

這樣定義了之後,可以證明

add1(zero) 得到的函式跟 one 是一模一樣的(但不是同乙個函式);

add1(one) 得到的函式跟 two 是一模一樣的(但不是同乙個函式);

雖然我不知道這樣做有什麼意義,不過還是很震撼的。

一般來說,某種組合資料物件的操作滿足閉包性質是指:通過它組合起資料物件得到的結果本身還可以通過同樣的操作再進行組合。

換句話說:組合式的成員本身還可以是組合式的。

比如

(const (cons

12)

(cons

34))

複製**

cons 組合 1、2 得到的資料,還可以作為 cons 的元素,所以說 cons 滿足閉包性質。

(cons

1 (cons

2 (cons 3 (

cons 4 nil))))

複製**

通過 cons 的這種性質,很容易用 cons 表示乙個鍊錶。

這種語法可以簡化為

(list 12

34)複製**

注意 (list 1 2 3 4) 是乙個函式呼叫,其返回值為(1 2 3 4)。假設 one-to-four = (list 1 2 3 4)

(define

one-to-four (list 12

34))

複製**

car one-to-four 就是獲取表頭,cdr one-to-four 就是獲取表頭之外的節點。

我們可以用 cons 來在鍊錶中插入節點

(cons

10 one-to-four)

複製**

結果為(10 1 2 3 4)。

還挺有意思的。

未完待續……

第三章的筆記:juejin.im/post/5c04de…

用陣列表示多重性

用陣列表示多重性 練習目標 在類中使用陣列作為模擬集合操作 在本練習中,將用陣列實現銀行與客戶間的多重關係。任務對銀行來說,可新增bank類。bank 物件跟蹤自身與其客戶間的關係。用customer物件的陣列實現這個集合化的關係。還要保持乙個整數屬性來跟蹤銀行當前有多少客戶。1.建立 bank 類...

函式漸進性的O, , 的表示

對於任何函式f n 都可以用o,來表示當n 時的階的情況,可以把o,分別看成是 分別估計了函式的漸進上界,漸進下屆和準確界。定義表示如下 設函式f n 代表某一演算法在輸入大小為 n 的情況下的工作量 效率 假設f n g n 非負單調,且極限 n 趨於無窮的時候,我們將f n 與另一行為已知的函式...

Gartner表示Docker安全性「尚不成熟」

gartner公司的分析師發表乙份宣告,指出儘管這款容器化工具已經闖出了響亮的名號 但docker的安全性仍然不夠成熟。於上週發表的這篇 docker管理下的容器安全性評估 指出,linux容器在成熟程度方面已經足以應對私有以及公有paas的實際需求 但 在安全性管理與控制方面的表現卻令人失望,而且...