dar*_*ode 5 lisp common-lisp cons
我试图弄清楚如何使用缺点来做到这一点:
((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))
知道怎么做到这一点?
Lau*_*ves 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)
Run Code Online (Sandbox Code Playgroud)
记住列表是一个利弊细胞."car"是列表的头元素或cons单元的前半部分,cdr是列表的其余部分,或cons单元的第二个元素.
另一种验证它们是等效的方法:
1 ]=> '((a . b) . (c . d))
;Value 14: ((a . b) c . d)
Run Code Online (Sandbox Code Playgroud)
只要看看你输入文字时得到的东西((A . B) . (C . D)):
* '((a . b) . (c . d)) ((A . B) C . D)
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))
尽管如此,如果你习惯于阅读默认行为,那么从长远来看它会更好.
我不太确定你的意思...我同意上面的评论,即你的代码的最后一行类似于你要匹配的第一行。
无论如何,这里有一个不错的通用资源:http ://www-2.cs.cmu.edu/~dst/LispBook/