【问题标题】:Creating a pair of pairs using Common Lisp使用 Common Lisp 创建一对
【发布时间】:2014-12-23 23:49:08
【问题描述】:

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

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

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

感谢任何帮助。

【问题讨论】:

  • 可能与Dot notation in scheme 重复该问题是在询问Scheme 中的情况,但Common Lisp 和Scheme 的conses 和打印约定是相同的。它可能不是重复的(注意“可能”),但我在那里解释了 cons 单元格和点的打印约定的答案将解释为什么 ((1 . 2) 3 . 4)((1 . 2) . (3 . 4)) 只是同一事物的不同视觉表示。跨度>

标签: common-lisp cons


【解决方案1】:

在 Lisp 中

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

((1 . 2) 3 . 4)

完全一样。你可以通过评估'((1 . 2) . (3 . 4))来检查。

如果你仔细想想,3 是 cdr 的汽车,所以它是不正确列表的第二个元素,所以对 (1 . 2) 是第一个元素,3 作为第二个元素并且有 @ 987654326@ 而不是 NIL 来终止它。

它们只是查看相同缺点单元配置的两种方式:

【讨论】:

  • 谢谢,这很有道理。节日快乐。
【解决方案2】:
CL-USER 4 > (equal '((1 . 2) . (3 . 4))
                   '((1 . 2)    3 . 4 ))
T

【讨论】:

    【解决方案3】:

    #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))

    【讨论】:

      【解决方案4】:

      这样就可以了:(cons (cons 1 2) (cons (cons 3 4) empty))

      祝你好运!

      【讨论】:

      • 谢谢,这更接近我的需要,但它仍然没有提供分开两对的点
      • empty 应该是'() 还是nil
      • 这是((1 . 2) (3 . 4)),这不是@Higgins 要求的结构。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多