有没有任何Lisp方言的头部是s表达式,例如((f 2) 3 4)? 如果没有,为什么?

7
有没有Lisp支持在其头部嵌套s表达式?例如:
((f 2) 3 4)

(f 2) 可能会被计算为一个在 3 4 上应用的函数/宏。

是否有可能有一种支持这种功能的lisp语言?或者有没有技术上的限制使其不可行?

3个回答

12
在那些将变量和函数放在同一命名空间中的Lisp方言中,您的表达式是有效的。这些被称为Lisp-1。Scheme和Clojure是此类Lisp的示例。
在那些将变量和函数放在不同命名空间中的Lisp方言中,您的表达式将会是 (funcall (f 2) 3 4)。这些被称为Lisp-2。Common Lisp和Emacs Lisp是此类Lisp的示例。
在Lisp-2中,每个符号都有一个值槽和一个函数槽。要调用存储在值槽中的函数,您需要使用funcall关键字
更多信息请参见:http://www.dreamsongs.com/Separation.html 编辑:感谢Rainer Joswig纠正了答案。

示例现在可以了。解释不是很好。符号槽只是问题的一半。'Lisp-2'具有两个命名空间。值不存储在槽中。值是评估表达式的结果。 (让((a(lambda()'hi)))(funcall a))在这个Common Lisp示例中,没有涉及“符号值”。它是词法变量的查找。这不是对符号值的访问。符号只是源代码的产物,而不是实际执行的产物。 - Rainer Joswig
我认为你应该稍微改一下第二段的措辞。也许可以以“然而,在Lisp-2中,有独立的命名空间…”开头。一开始我很困惑,因为我以为你还在谈论第二段中的Lisp-1。尽管如此,我接受了。 - spacingissue

5
例如,在Common Lisp中,上述代码是无效的。Common Lisp的语法通常不允许列表作为函数调用的头部。您必须使用FUNCALL来调用返回的函数值。
(funcall (f 2) 3 4)

在其他一些Lisp方言中是允许的。Scheme是这样的一种Lisp方言。Scheme还会评估函数调用表达式的头部。


1

Lisp-1 Lisp,例如Scheme,通常会对函数形式的所有表达式进行评估,甚至包括函数本身。

Lisp-2 Lisp,例如Common Lisp,通常对函数和参数有不同的行为。虽然参数会被评估,但函数会被查找。调用已评估函数的常见方法是使用funcallapply

(funcall (f 2) 3 4)

在Common Lisp中,如果您坚持将某些东西评估为操作符中的函数,则可以使用lambda form
((lambda (&rest args) (apply (f 2) args)) 3 4)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接