7

是否有任何 lisp 支持嵌套的 s 表达式?例如

((f 2) 3 4)

大概评估为(f 2)要应用于的函数/宏3 4

是否有可能有一个 lisp 支持这样的事情?或者是否有技术限制禁止/使其不切实际?

4

3 回答 3

12

在那些对变量和函数具有单一命名空间的 Lisps 中,您的表达式是有效的。这些被称为 Lisp-1。Scheme 和 Clojure 就是这种 Lisp 的例子。

在那些对变量和函数有单独命名空间的 Lisps 中,你的表达式是(funcall (f 2) 3 4). 这些被称为 Lisp-2。Common Lisp 和 Emacs Lisp 就是这种 Lisp 的例子。

在 Lisp-2 中,每个符号都有一个值 slot和一个函数 slot。要调用存储在值槽中的函数,您需要使用funcall关键字

查看有关此问题的更多信息:http ://www.dreamsongs.com/Separation.html

编辑:感谢Rainer Joswig ,我更正了答案。

于 2012-10-16T03:09:44.443 回答
5

例如在上面的 Common Lisp 中是无效的。Common Lisp 的语法通常不允许列表作为函数调用的头部。您必须使用FUNCALL来调用返回的函数值。

(funcall (f 2) 3 4)

在其他一些 Lisp 方言中,它是允许的。Scheme 就是这样一种 Lisp 方言。Scheme 还计算函数调用表达式的头部。

于 2012-10-16T06:38:40.947 回答
1

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

Lisp-2 lisp,例如 Common Lisp,通常对函数和参数有不同的行为。在评估参数的同时,查找函数。调用评估函数的常用方法是使用funcallor apply

(funcall (f 2) 3 4)

在 Common Lisp 中,如果您坚持对运算符中的函数求值,则可以使用lambda 形式:

((lambda (&rest args) (apply (f 2) args)) 3 4)
于 2012-10-17T11:42:50.357 回答