我試圖找出如何做到這一點使用缺點:怎麼辦((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))
任何想法如何實現這一目標?
我試圖找出如何做到這一點使用缺點:怎麼辦((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))
任何想法如何實現這一目標?
我不太清楚你的意思......我同意上面的評論,你的代碼的最後一行類似於第一個,你正在匹配。
下面是你無論如何一個體面的一般資源:http://www-2.cs.cmu.edu/~dst/LispBook/
看看你得到什麼,當你在字面((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))
雖然儘管它將坦言是更好如果您對閱讀默認行爲感到滿意,可以長時間運行。
由於Lisp中的列表如何表示,因此不可能找到您想要的內容。當你創建一個列表時,你正在創建一系列的cons單元,其中單元格的車是列表中元素的值,而cdr是對下一個單元格的引用。您所需的電池,((A . B) . (C . D))
的意思是「創建一個汽車是(A . B)
和cdr是(C . D)
」的缺點。這相當於一個列表,其中第一個元素是(A . B)
,第二個元素是C
,列表的尾部是D
或((A . B) C . D)
。
我低估了,因爲你說這是不可能的,那麼解釋爲什麼它等於他的第一次嘗試! – 2010-12-24 17:58:08
一般。我在說,翻譯不可能給出他想要的結果。 – 2010-12-24 19:44:58
第一個是你想要的。它們是相同的。您可以驗證這樣的:
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)
感謝您的幫助勞倫斯!如果它們相當,那這是一個很酷的竅門 – darkwingcode 2010-12-15 03:22:32
第二個看起來像你想要什麼。它不適合用什麼方式? – 2010-12-15 01:18:09
@Anon:第二個沒有中間點。它實際上是一個不同的值,因爲那裏有一個空(空列表)。 – 2010-12-15 02:01:07