"lisp形式"的定义?

jos*_*osh 27 lisp scheme

究竟是什么定义了"Lisp形式"?

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

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

((lambda () 42))  ;; The answer to Life, the Universe and Everything.
Run Code Online (Sandbox Code Playgroud)

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

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

Zor*_*orf 47

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

(3 4 1)
Run Code Online (Sandbox Code Playgroud)

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

3
Run Code Online (Sandbox Code Playgroud)

是一个基准和一个形式,也称为"正常形式"或"自我评估基准",它评估自身.

(+ 3 4 1)
Run Code Online (Sandbox Code Playgroud)

是一种复合形式,将其评估为正常形式 8.

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

(if (oddp 2) (print "me") (print "or me"))
Run Code Online (Sandbox Code Playgroud)

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

((a 1) (b 2))
Run Code Online (Sandbox Code Playgroud)

不是Common Lisp中的表单,它可以是Scheme中的有效表单,但仅当表单(a 1)求值为过程数据时.所以:

(let ((a 1) (b 2)) (+ a b))
Run Code Online (Sandbox Code Playgroud)

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

请注意,特殊表单很可能仍会评估它们的所有参数,因此它们仍然不是过程调用,因为它们的头部是语法,并且过程可以作为参数传递给其他函数,语法不能,因此:

(func arg1 #'let)
Run Code Online (Sandbox Code Playgroud)

同样是一个错误:

(funcall let ((a 1) (b 2)) (+ a b))
Run Code Online (Sandbox Code Playgroud)

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


Pet*_*ham 14

来自常见的lisp hyperspec词汇表

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