是否有任何 lisp 支持嵌套的 s 表达式?例如
((f 2) 3 4)
大概评估为(f 2)
要应用于的函数/宏3 4
。
是否有可能有一个 lisp 支持这样的事情?或者是否有技术限制禁止/使其不切实际?
是否有任何 lisp 支持嵌套的 s 表达式?例如
((f 2) 3 4)
大概评估为(f 2)
要应用于的函数/宏3 4
。
是否有可能有一个 lisp 支持这样的事情?或者是否有技术限制禁止/使其不切实际?
在那些对变量和函数具有单一命名空间的 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 ,我更正了答案。
例如在上面的 Common Lisp 中是无效的。Common Lisp 的语法通常不允许列表作为函数调用的头部。您必须使用FUNCALL
来调用返回的函数值。
(funcall (f 2) 3 4)
在其他一些 Lisp 方言中,它是允许的。Scheme 就是这样一种 Lisp 方言。Scheme 还计算函数调用表达式的头部。
Lisp-1 lisp,例如 Scheme,通常会评估函数形式的所有表达式,甚至函数本身。
Lisp-2 lisp,例如 Common Lisp,通常对函数和参数有不同的行为。在评估参数的同时,查找函数。调用评估函数的常用方法是使用funcall
or apply
。
(funcall (f 2) 3 4)
在 Common Lisp 中,如果您坚持对运算符中的函数求值,则可以使用lambda 形式:
((lambda (&rest args) (apply (f 2) args)) 3 4)