簡體   English   中英

缺陷指向相同的其他缺點

[英]Cons cells pointing to the same other cons

我想在Lisp中創建以下列表。

兩個cons單元的圖片,第一個中的兩個單元都指向第二個,其中包含A和B.

((lambda(x) (cons x x)) (cons'A 'B))

創建此列表,但是

((lambda(x y) (cons x y)) (cons'A 'B) (cons 'A 'B))

(cons (cons 'A 'B) (cons 'A 'B))

不要創建列表。

我的挑戰是為什么!? 第一個命令如何創建此列表而其他命令不創建? 任何細節?

每次(cons 'A 'B)被調用時,都會創建一個新的 cons單元格,因此你的第二個表達式會創建兩個 “相似”( equal但不是eql )的對象(A . B) eql (A . B)

你想創建一個A和B的cons

(cons 'A 'B)

然后你想從另一個缺點引用它兩次。 因此,如果x是對現有cons的引用,則需要

(cons x x)

結束,我們得到

(let ((x (cons 'A 'B)) (cons x x))

或者等價的

((lambda (x) (cons x x)) (cons 'A 'B))

如果你做兩次(cons 'A 'B)你會創建兩個單元格:

一個 B.

一個 B.

這些的cons將包含一個鏈接到第一個,另一個鏈接到第二個。

(使用lambda來引用它們是一種毫無意義的混淆;具有lambda形式的示例的要點是你使用x兩次。

((lambda (x y) (cons x y)) (cons 'A 'B) (cons 'A 'B))

寫作只是一種非常乏味的方式

(cons (cons 'A 'B) (cons 'A 'B))

而在最初的例子中,只有一個(cons 'A 'B)實例,你希望它能夠引用兩次。)

本練習的目的是說明“表面”對等與身份之間的區別。 包含相同值的兩個列表仍然是兩個不同的列表,而對同一列表的兩個引用是相同的。 正如@sde提示的那樣,這對理解比較有所幫助; 原型的例子是, equal為含有相同的值不同的列表真(以及相同列表,當然),而eql是僅當它的參數實際上是相同的真(即,它們是指相同的對象)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM