我需要使用 Common Lisp 创建一个包含两个对的对。
输出需要是:
((1 . 2) . (3 . 4))
文献状态(cons (cons 1 2) (cons 3 4))
应该输出我需要的东西,但是当我运行时,我得到:
((1 . 2) 3 . 4)
任何帮助表示赞赏。
我需要使用 Common Lisp 创建一个包含两个对的对。
输出需要是:
((1 . 2) . (3 . 4))
文献状态(cons (cons 1 2) (cons 3 4))
应该输出我需要的东西,但是当我运行时,我得到:
((1 . 2) 3 . 4)
任何帮助表示赞赏。
在 Lisp 中
((1 . 2) . (3 . 4))
和
((1 . 2) 3 . 4)
是完全一样的东西。您可以通过评估来检查'((1 . 2) . (3 . 4))
。
如果您考虑一下,它3
是 cdr 的汽车,因此它是不正确列表的第二个元素,因此该对(1 . 2)
是第一个元素,3
作为第二个元素,它具有4
而不是 NIL 来终止它。
它们只是查看相同 cons 单元配置的两种方法:
CL-USER 4 > (equal '((1 . 2) . (3 . 4))
'((1 . 2) 3 . 4 ))
T
#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))
。
这将做到:(cons (cons 1 2) (cons (cons 3 4) empty))
祝你好运!