我需要使用Common Lisp创建一对包含两对的对。
输出需要是:
((1 . 2) . (3 . 4))
文献陈述(cons (cons 1 2) (cons 3 4))
应该输出我需要的东西但是当我跑步时我得到:
((1 . 2) 3 . 4)
感谢任何帮助。
答案 0 :(得分:8)
在Lisp中
((1.2)。(3.4))
和
((1.2)3.4。
完全是一回事。您可以通过评估'((1 . 2) . (3 . 4))
进行检查。
如果你考虑一下,3
是cdr的车,所以它是不正确列表的第二个元素,所以对(1 . 2)
是第一个元素,3
as第二个元素,它有4
而不是NIL来终止它。
他们只是两种方式来查看相同的cons单元配置:
答案 1 :(得分:2)
CL-USER 4 > (equal '((1 . 2) . (3 . 4))
'((1 . 2) 3 . 4 ))
T
答案 2 :(得分:1)
#xA
与10
完全相同,但在打印时,它的系统设置决定了如何打印数字。原因是fixnum没有基础,但可视化表示确实如此。正如#xA
与10
相同,((1 . 2) . (3 . 4))
与((1 . 2) 3 . 4)
相同。
幻想是我们有名单。为了做到这一点,我们显示与nil或一对作为尾巴的对不同于具有其他值作为尾巴的对。列表(1 2)
被建模为(1 . (2 . ()))
。规则是这样的:每当尾部为零或一对时,您可以省略该对点和尾部的第一个括号。递归地应用它,(1 . (2 . ()))
显示为(1 2)
,((1 . 2) . (3 . 4))
显示为`((1.2)3 .4)。
为了使幻觉完整,读者会反过来,所以当它在(1 2)
中读取时会在内存中创建(1 . (2 . ()))
。
要真正成为一名优秀的Lisp程序员(在任何方言中),您需要能够在(1 2)
中看到省略的点和圆括号。当您这样做时,您需要使用(a (b c) d)
来检索c
(显然是(cadadr '(a (b c) d))
)。掌握了这一点后,您将“看到”((1 . 2) . (3 . 4))
。
答案 3 :(得分:-2)
这样做:(cons (cons 1 2) (cons (cons 3 4) empty))