我刚刚开始学习lisp并且有点疑惑为什么编译器不会将括号中的简单整数评估为该整数的值。
在REPL中,当我(+ 3 2)
时,我得到5
,但当我(+ 3 (2))
时,我收到错误,而我认为表达式(2)
的值也应该是2
。显然,这里有一些重要的事情我无法指出 - 2
和(2)
之间有什么区别?任何帮助都将非常受欢迎,因为这似乎是lisp工作方式的基础。
答案 0 :(得分:3)
列表表单支持的Common Lisp语法在此处指定:CLHS Section 3.1.2.1.2 Conses as Forms。
有四种受支持的列表类型:
(quote foo)
(defun foo (a1 a1) (+ a1 a2))
(+ 1 2)
((lambda (a) (+ a 1)) 2)
这就是全部。其他列表无法在Common Lisp中进行评估。
答案 1 :(得分: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)
计算为......没有,因为第一个元素是不是运营商。
顺便说一句,我觉得查看多本书和来源很有帮助,因为如果一个人以某种我不理解的方式陈述某些东西,我总是可以咨询另一本书,看看它是否更有意义。我建议这些:
希望有所帮助!