使用Common Lisp创建一对对

时间:2014-12-23 23:49:08

标签: common-lisp cons

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

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

文献陈述(cons (cons 1 2) (cons 3 4))应该输出我需要的东西但是当我跑步时我得到:
((1 . 2) 3 . 4)

感谢任何帮助。

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单元配置: enter image description here

答案 1 :(得分:2)

CL-USER 4 > (equal '((1 . 2) . (3 . 4))
                   '((1 . 2)    3 . 4 ))
T

答案 2 :(得分:1)

#xA10完全相同,但在打印时,它的系统设置决定了如何打印数字。原因是fixnum没有基础,但可视化表示确实如此。正如#xA10相同,((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))

祝你好运!