【问题标题】:Definition of "lisp form"?“lisp 形式”的定义?
【发布时间】:2011-02-22 01:43:20
【问题描述】:

“Lisp 表单”的具体定义是什么?

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

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

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

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

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

【问题讨论】:

  • 这实际上是一个有效的 lisp 表单和程序。我想我下面的定义会和你得到的一样详细,不确定我是否忘记了什么,但我相信它是详尽的。
  • 在 Clojure 中:((fn [] 42))

标签: lisp scheme


【解决方案1】:

来自common lisp hyperspec glossary

form n. 1. 任何要评估的对象。 2. 一个符号、一个复合形式或一个自我评价的对象。 3.(对于运算符,如<<operator>> form'') a compound form having that operator as its first element.A引号形式是常量形式。''

【讨论】:

    【解决方案2】:

    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 中的表单,它可能是 Scheme 中的有效表单,但前提是表单 (a 1) 评估为过程数据。所以:

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

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

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

    (func arg1 #'let)
    

    是一个错误,同理:

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

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

    【讨论】:

    • 你将如何声明你自己的if 表单,你能发布一个my-if 表单的语法示例吗?
    • 恐怕lisp datum 的措辞不正确,因为 Lisp 中的 datum 定义为“a-list 是对的列表,一对中的汽车称为键,并且cdr 在 p431 Common Lisp 2nd edition 中被称为 datum。
    • 为明确引用特定类型的表单点赞
    • 有人可能会说 if 不是语法,而是一个要求解释器执行一次惰性求值的函数(而它通常不会出于性能和简单性的原因以及确定性的原因,尤其是副作用)。但让我们保持实际。
    • “形式”和“表达”有区别吗?我的意思是所有形式都有值,即使是 nil,对吧?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-17
    • 2014-09-23
    相关资源
    最近更新 更多