“lisp形式”的定义?

时间:2010-05-20 19:59:35

标签: lisp scheme

“Lisp形式”的定义究竟是什么?

据我所知,它是“一个原子或一个符号作为其第一个元素的列表”。

但是,这(在Scheme中)不会是一种形式:

((lambda () 42))  ;; The answer to Life, the Universe and Everything.

因为列表的第一个元素本身就是另一个列表。在评估之后,它将是一个程序(而不是符号)。

我可以找到几个不同的网站和教程来讨论Lisp表单,但没有一个提供完整和详细的定义。我在哪里可以找到一个?

2 个答案:

答案 0 :(得分:47)

lisp表单是一个lisp数据,也是一个程序,也就是说,它可以在没有错误的情况下进行评估。

(3 4 1)

是一个lisp数据,它是一个3,4和1的列表。但这不是一个形式,因为尝试评估它不会导致另一个数据。而是一个错误。

3

是一个基准和一个形式,也称为“正常形式”或“自我评估基准”,它会对自身进行评估。

(+ 3 4 1)

复合形式,将其评估为正常形式 8

除了普通形式和复合形式之外,复合形式可以细分为过程调用和特殊形式(也称为语法)但更恰当的是,特殊形式的头部是语法,如:

(if (oddp 2) (print "me") (print "or me"))

这是一种特殊形式,因为它的头是语法,而不是一个程序,的过程调用和特殊形式之间的不同之处在于过程调用看到所有形式的参数作为表单本身并尝试先评估它,特殊形式不一定要这样做。据我们了解,只有这个复合形式的第二和第四个成员得到评估,第一个成员是语法,第三个成员在这种情况下被丢弃。正如我们所知道的那样:

((a 1) (b 2))

不Common Lisp中一种形式,它的是在方案的有效形式,但只有当表单(a 1)计算结果为基准程序。所以:

(let ((a 1) (b 2)) (+ a b))

特殊表单,它不评估其第二个成员,并以不同于非特殊形式的预期方式评估其第三个成员。也就是说,a和b作为其第三种形式的子形式具有不同的绑定。在这种情况下,let是一个语法关键字,表示特殊形式。

请注意,这很可能是特殊形式还是评估所有他们的论据,他们仍然不是过程调用的话,因为他们的头是语法和程序可以传递给其他函数作为参数,语法不行,这样的:

(func arg1 #'let)

同样是错误:

(funcall let ((a 1) (b 2)) (+ a b))

是错误,表明它与过程调用不同。

答案 1 :(得分:14)

来自common lisp hyperspec glossary

  

形式n。 1.任何要评估的对象。 2.符号,复合形式或自我评估对象。 3.(对于操作员,如<<operator>> form'') a compound form having that operator as its first element.中的报价形式是一种常数形式。''