如何在lisp中执行((A.B.。(C.D))

如何在lisp中执行((A.B.。(C.D)),lisp,common-lisp,cons,Lisp,Common Lisp,Cons,我正试图找出如何使用cons实现这一点: ((A.B.)(C.D)) 其中(A.B)和(C.D)在每个cons单元中 我尝试过这样做(cons(cons'a'b)(cons'c'd)),但它给了我这个: ((A.B)C.D) 我也试过这个:(cons(cons'a'b)(cons(cons'c'd)),但它给了我这个: ((A.B)(C.D)) 你知道如何做到这一点吗?我不太清楚你的意思。。。我同意上面的评论,即代码的最后一行与第一行相似,这是您要匹配的 无论如何,这里有一个不错的通用资源:只要

我正试图找出如何使用cons实现这一点:

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

其中
(A.B)
(C.D)
在每个cons单元中

我尝试过这样做(cons(cons'a'b)(cons'c'd)),但它给了我这个:

((A.B)C.D)

我也试过这个:
(cons(cons'a'b)(cons(cons'c'd))
,但它给了我这个:

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


你知道如何做到这一点吗?

我不太清楚你的意思。。。我同意上面的评论,即代码的最后一行与第一行相似,这是您要匹配的


无论如何,这里有一个不错的通用资源:

只要看看当你输入一个文本
((a.B.(C.D))
时,你会得到什么:

*“((a.b.)(c.d)) ((A.B)C.D) Lisp打印机有一个用于打印成对构建的数据结构的窗口。基本上,当一个cons是另一个cons的CDR时,你永远无法将它打印为括号内的点对

但是,可以通过以下方式重新配置打印机,以获得所需的行为:

(设置pprint调度“cons” (lambda(流对象) (格式化流“(~W.~W)”(汽车对象)(cdr对象))) *“((a.b.)(c.d)) ((A.B.)(C.D)) *(cons(cons'a'b)(cons'c'd));同一物体 ((A.B.)(C.D))
尽管如此,坦率地说,如果你对阅读默认行为感到满意,那么从长远来看会更好

由于列表是如何在Lisp中表示的,所以您所查找的内容是不可能的。创建列表时,您正在创建一系列cons单元格,其中单元格的car是列表中该元素的值,cdr是对下一个cons单元格的引用。您所需的单元格,
((A.B.)(C.D))
表示“创建一个cons单元格,其中汽车是
(A.B)
,cdr是
(C.D)
”。这相当于一个列表,其中第一个元素是
(a.B)
,第二个元素是
C
,列表的尾部是
D
,或者
((a.B)C.D)
,第一个元素就是您想要的。它们是等价的。您可以这样进行验证:

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)
记住,列表是一个单元格。“car”是列表的头元素或cons单元格的前半部分,cdr是列表的其余部分或cons单元格的第二个元素

验证其等效性的另一种方法:

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

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

第二个看起来像你想要的。在什么方面不合适?@Anon:第二个没有中间点。它实际上是一个不同的值,因为其中有一个空列表。谢谢你的帮助Laurence!这是一个很酷的把戏,如果他们被同等否决,因为你说这是不可能的,然后解释为什么这相当于他的第一次尝试!公平的我是说不可能让口译员给出他想要的输出。 * '((a . b) . (c . d)) ((A . B) . (C . D)) * (cons (cons 'a 'b) (cons 'c 'd)) ;The same object ((A . B) . (C . D))
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)
1 ]=> '((a . b) . (c . d))

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