【问题标题】:How is each of the things different in cons of LISP?LISP 的缺点有什么不同?
【发布时间】:2014-09-19 05:23:41
【问题描述】:

这些是 cons 的不同参数组合的输出。我刚开始学习lisp。有人可以帮我理解这些吗?

Break 80 [81]> (CONS '(A) 'B) 
((A) . B)
Break 80 [81]> (CONS '(A) '(B)) 
((A) B)
Break 80 [81]> (CONS 'A 'B) 
(A . B)
Break 80 [81]> (CONS 'A '(B)) 
(A B)
Break 80 [81]> 

【问题讨论】:

  • +1 用于自行试验并有条不紊地尝试输入组合的排列(这很好!),但 -1 表示缺乏研究工作(您没有尝试找到任何关于conses,列表等)。
  • 另见Dot notation in scheme。 Scheme 和 Common Lisp 并不完全相同,但这个问题适用于 Lisp 家族中的许多(全部?)不同语言。您现在需要的关键可能是所有 conses 都是相同的,但是 conses 的某些“组合”以特殊方式打印

标签: lisp cons


【解决方案1】:

cons 函数总是做同样的事情:它产生一个 cons 单元格 的参数。一个 cons 单元只是一对。您可以使用 car 获取该对的第一个元素,使用 cdr 获取第二个元素。

对于编写文字单元格,您可以引用并使用符号 (x . y) 其中 x汽车ycdr。使用这种表示法,您可以将示例编写如下(但不要只相信我的话,在 REPL 中尝试一下):

> '((A) .  B ) ;=> ((A) . B)
> '((A) . (B)) ;=> ((A) B)
> '( A  .  B ) ;=> (A . B)
> '( A  . (B)) ;=> (A B)

但为什么第二个和第四个案例的结果打印的方式与我们编写它们的方式不同呢? cons 单元格有特殊的打印约定,因为我们使用 cons 单元格来实现链表。

阅读14.1.2 Conses as Lists 了解详细信息,但列表是一个 cons 单元,其 car 是列表的第一个元素,其 cdr 是列表的其余部分(即另一个列表)。这意味着列表 (1 2 3) 与(使用文字点对符号)(1 . (2 . (3 . nil))) 相同。您可以在 REPL 中尝试:

> '(1 . (2 . (3 . nil))) ;=> (1 2 3)

对于列表如此基础的语言来说,这是一个非常有用的打印(和输入)约定。我也在其他问题的回答中写了更多关于此的内容:

【讨论】:

  • @WillNess 对不起!评论已删除。
  • 为什么要道歉?不要提它==不客气,不是吗? :) 这个评论会在你的评论之后自毁。 :)
  • @WillNess 只是个玩笑。你说“不要提”所以我删除了我的评论。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-09-24
  • 2011-04-26
  • 2011-02-28
  • 1970-01-01
  • 1970-01-01
  • 2021-04-19
  • 2020-04-23
相关资源
最近更新 更多