2

我需要使用 Common Lisp 创建一个包含两个对的对。

输出需要是: ((1 . 2) . (3 . 4))

文献状态(cons (cons 1 2) (cons 3 4))应该输出我需要的东西,但是当我运行时,我得到:
((1 . 2) 3 . 4)

任何帮助表示赞赏。

4

4 回答 4

8

在 Lisp 中

((1 . 2) . (3 . 4))

((1 . 2) 3 . 4)

是完全一样的东西。您可以通过评估来检查'((1 . 2) . (3 . 4))

如果您考虑一下,它3是 cdr 的汽车,因此它是不正确列表的第二个元素,因此该对(1 . 2)是第一个元素,3作为第二个元素,它具有4而不是 NIL 来终止它。

它们只是查看相同 cons 单元配置的两种方法: 在此处输入图像描述

于 2014-12-24T00:06:12.547 回答
2
CL-USER 4 > (equal '((1 . 2) . (3 . 4))
                   '((1 . 2)    3 . 4 ))
T
于 2014-12-24T01:45:55.193 回答
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))

于 2014-12-24T18:36:08.353 回答
-2

这将做到:(cons (cons 1 2) (cons (cons 3 4) empty))

祝你好运!

于 2014-12-23T23:54:27.513 回答