2010-12-15 63 views
5

我試圖找出如何做到這一點使用缺點:怎麼辦((AB)(CD)。)在口齒不清

((A . B) . (C . D))

其中(A . B)(C . D)在每個cons單元

我試着這樣做(cons (cons 'a 'b) (cons 'c 'd)),但它給了我這樣的:

((A.B) C . D)

我還TR滅蠅燈這樣的:(cons (cons 'a 'b) (cons (cons 'c 'd)()))但它給了我這樣的:

((A . B) (C . D))

任何想法如何實現這一目標?

+5

第二個看起來像你想要什麼。它不適合用什麼方式? – 2010-12-15 01:18:09

+0

@Anon:第二個沒有中間點。它實際上是一個不同的值,因爲那裏有一個空(空列表)。 – 2010-12-15 02:01:07

回答

0

我不太清楚你的意思......我同意上面的評論,你的代碼的最後一行類似於第一個,你正在匹配。

下面是你無論如何一個體面的一般資源:http://www-2.cs.cmu.edu/~dst/LispBook/

7

看看你得到什麼,當你在字面((A . B) . (C . D))輸入:

 
* '((a . b) . (c . d)) 

((A . B) C . D) 

有一個defined algorithm Lisp的打印機使用打印從成對構建出來的數據結構。基本上,當它是另一個缺點的CDR時,你永遠不可能把一個缺點打印成括號內的虛線對。

然而,可以重新配置打印機,使你得到你所尋求的行爲,通過SET-PPRINT-DISPATCH

 
(set-pprint-dispatch 'cons 
    (lambda (stream object) 
    (format stream "(~W . ~W)" (car object) (cdr object)))) 
 
* '((a . b) . (c . d)) 

((A . B) . (C . D)) 
* (cons (cons 'a 'b) (cons 'c 'd)) ;The same object 

((A . B) . (C . D)) 

雖然儘管它將坦言是更好如果您對閱讀默認行爲感到滿意,可以長時間運行。

0

由於Lisp中的列表如何表示,因此不可能找到您想要的內容。當你創建一個列表時,你正在創建一系列的cons單元,其中單元格的車是列表中元素的值,而cdr是對下一個單元格的引用。您所需的電池,((A . B) . (C . D))的意思是「創建一個汽車是(A . B)和cdr是(C . D)」的缺點。這相當於一個列表,其中第一個元素是(A . B),第二個元素是C,列表的尾部是D((A . B) C . D)

+0

我低估了,因爲你說這是不可能的,那麼解釋爲什麼它等於他的第一次嘗試! – 2010-12-24 17:58:08

+0

一般。我在說,翻譯不可能給出他想要的結果。 – 2010-12-24 19:44:58

15

第一個是你想要的。它們是相同的。您可以驗證這樣的:

1 ]=> (cons (cons 'a 'b) (cons 'c 'd)) 

;Value 11: ((a . b) c . d) 

1 ]=> (car (cons (cons 'a 'b) (cons 'c 'd))) 

;Value 12: (a . b) 

1 ]=> (cdr (cons (cons 'a 'b) (cons 'c 'd))) 

;Value 13: (c . d) 

記住列表一個cons單元。 「car」是列表的頭元素或cons單元的前半部分,cdr是列表的其餘部分,或者是cons單元的第二個元素。

的另一種方式,以確認他們是等價的:

1 ]=> '((a . b) . (c . d)) 

;Value 14: ((a . b) c . d) 
+0

感謝您的幫助勞倫斯!如果它們相當,那這是一個很酷的竅門 – darkwingcode 2010-12-15 03:22:32