是否有任何 Lisp 支持在它们的头上嵌套 s 表达式? 例如
((f 2) 3 4)
对于它,(f 2)
大概计算为一个函数/宏以应用于3 4
。
是否有可能有一个 lisp 支持这样的事情? 还是有技术限制禁止这样做/使其不切实际?
在那些具有单个变量和函数命名空间的 Lisp 中,您的表达式是有效的。这些被称为Lisp-1。Scheme和Clojure就是这种Lisps的例子。
在那些具有变量和函数的单独命名空间的 Lisp 中,您的表达式将(funcall (f 2) 3 4)
。这些被称为Lisp-2。Common Lisp 和 Emacs Lisp 就是这种 Lisp 的例子。
在 Lisp-2 中,每个符号都有一个值槽和一个函数槽。要调用存储在值槽中的函数,您需要使用funcall
关键字。
查看有关此问题的更多信息: http://www.dreamsongs.com/Separation.html
编辑:感谢Rainer Joswig,我纠正了答案。
在上面的Common Lisp中是无效的。Common Lisp 的语法通常不允许列表作为函数调用的头部。您必须使用 FUNCALL
来调用返回的函数值。
(funcall (f 2) 3 4)
在其他一些Lisp方言中,这是允许的。Scheme就是这样一种Lisp方言。方案还计算函数调用表达式的头部。
Lisp-1 Lisp,如 Scheme,通常计算函数形式的所有表达式,甚至函数本身。
Lisp-2 Lisp,如 Common Lisp,通常对函数和参数具有不同的行为。在计算参数时,将查找函数。调用已评估函数的常用方法是使用 funcall
或 apply
。
(funcall (f 2) 3 4)
在Common Lisp中,如果你坚持要计算运算符中的函数的某些东西,你可以使用lambda形式:
((lambda (&rest args) (apply (f 2) args)) 3 4)