【问题标题】:Lisp: difference between 2 and (2)Lisp:2和(2)之间的区别
【发布时间】:2017-06-14 19:57:14
【问题描述】:

我刚开始学习 lisp,有点困惑为什么编译器不将括号中的简单整数计算为该整数的值。

在 REPL 中,当我执行 (+ 3 2) 时,我得到 5,但是当我执行 (+ 3 (2)) 时,我得到一个错误,而我认为表达式 (2) 的值也应该是 2。很明显,这里有一些重要的事情我无法指出 - 2(2) 之间有什么区别?任何帮助将不胜感激,因为这似乎是 lisp 工作方式的基础。

【问题讨论】:

  • 不幸的是,这完全没有意义,因为 Lisp 没有也不应该像你描述的那样表现。
  • 是的,你是对的。我在问题的一部分中犯了一个错误:第一部分 [我写了关于 (2) 返回 2 的地方] 是在不同的 lisp 中。我错误地认为,由于第二部分的行为 [(+ 3 (2)) 不同于 (+ 3 2)] 在两个 lisps 中是一致的,因此第一部分的行为也必须相同。为混乱道歉。我现在已经删除了第一部分。尽管如此,问题的核心仍然(相同)。
  • I think the value of the expression (2) should also be 2 - 你为什么会“这么想”?为什么不阅读 Lisp 介绍来获得基础知识呢?这是一个很好的初学者介绍,我会推荐:cs.cmu.edu/~dst/LispBook 该页面上可以免费下载这本书。
  • 我实际上是在阅读一本书(Paul Graham 的书)。在第二章,他实际上是从语言开始的,我看到了我写的形式的陈述,所以我尝试了一些我自己的——包括那个不起作用的。该章接下来的几节没有讨论为什么(2)2 不同,因此我提出了关于SO 的问题。
  • 为什么不阅读那本书的第 8 页和第 9 页(Paul Graham 的那本书)?

标签: lisp


【解决方案1】:

您还应该注意列表表单之间的区别。所有表单(+ 1 2) 都是列表,但并非所有列表(2) 都是表单。

当您在提示符下键入内容时,它需要是一个表单。表单的第一部分几乎总是需要某种运算符。

如果你有 REPL 提示,并且你输入以下内容,你会得到一个错误,因为它只是一个列表,而不是一个表单:

(2)

起作用的是告诉 REPL 构造一个列表:

'(2)
'(aardvark)

...真的只是以下的简写:

(quote (2))
(quote (aardvark))

这意味着它实际上仍然是一个以运算符开头的列表,因此是一个表单。

以下示例将返回结果:

(+ 1 2)
(+ 1 (+ 2 3))

基本上,考虑它的方式是评估列表中的每个元素(第一个元素除外),然后在这些元素上执行第一个元素。所以(+ 1 (+ 2 3))首先被评估为1,结果为1,然后(+ 2 3)再次在运算符执行之前首先评估参数,这意味着2和3被馈送到+,结果为5,并且然后将 1 和 5 馈送到 +。

你是说(+ 1 (2)),它试图在第一个元素之后评估每个元素,1 评估为 1,但 (2) 评估为......什么都没有,因为第一个元素不是运算符。

顺便说一句,我发现查看多本书和资料很有帮助,因为如果有人以我不理解的方式陈述某事,我总是可以咨询另一人,看看它是否更有意义。我建议这些:

希望有帮助!

【讨论】:

  • 1) '(aardvark)(quote (aardvark)) 的简写,表示文字数据。对数据使用反引号是不寻常的。反引号仅用于数据模板。 2)Lisp不使用command这个词,它是一个operator
  • 即使有反引号 `(aardvark) 也不是 (list 'aardvark) 的简写,因为后者总是会创建一个新列表。
  • 啊,谢谢@RainerJoswig。我仍然了解记号和反引号之间的区别。
【解决方案2】:

列表形式支持的 Common Lisp 语法在此处指定:CLHS Section 3.1.2.1.2 Conses as Forms

有四种受支持的列表类型作为表单:

  1. 特殊形式如(quote foo)
  2. (defun foo (a1 a1) (+ a1 a2))这样的宏形式
  3. 函数形式如(+ 1 2)
  4. ((lambda (a) (+ a 1)) 2)这样的lambda形式

就是这样。其他列表无法在 Common Lisp 中计算。

【讨论】:

    猜你喜欢
    • 2011-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-20
    • 1970-01-01
    • 2018-05-29
    相关资源
    最近更新 更多