我试图弄清楚如何使用缺点来做到这一点:
((A . B) . (C . D))
每个缺点单元格的位置(A . B)
和位置(C . D)
我试过这样做,(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)
我试过这样做,(cons (cons 'a 'b) (cons 'c 'd))
但它给了我这个:
((A.B) C . D)
我也试过这个:(cons (cons 'a 'b) (cons (cons '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)
看看你输入文字时得到的结果((A . B) . (C . D))
:
* '((A B C D)) ((A B C D)
Lisp 打印机使用一种定义的算法来打印由对构建的数据结构。基本上,当它是另一个 cons 的 CDR 时,您永远无法将 cons 打印为圆括号内的虚线对。
但是,可以通过SET-PPRINT-DISPATCH重新配置打印机,以便获得所需的行为:
(set-pprint-dispatch '缺点 (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)
。
我不太清楚你的意思......我同意上面的评论,你的代码的最后一行类似于你正在匹配的第一行。
无论如何,这里有一个不错的通用资源:http ://www-2.cs.cmu.edu/~dst/LispBook/