是否有任何 lisp 以 s 表达式作为它们的头部,例如 ((f 2) 3 4)?如果没有,为什么



是否有任何 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,通常对函数和参数具有不同的行为。在计算参数时,将查找函数。调用已评估函数的常用方法是使用 funcallapply

(funcall (f 2) 3 4)

在Common Lisp中,如果你坚持要计算运算符中的函数的某些东西,你可以使用lambda形式:

((lambda (&rest args) (apply (f 2) args)) 3 4)

相关内容

最新更新