任何lisps都有一个s表达式作为他们的头,例如((f 2)3 4)?如果没有,为什么?

时间:2012-10-16 03:04:08

标签: nested lisp head s-expression lisp-2

任何lisps支持嵌套的s表达式吗?例如

((f 2) 3 4)

(f 2)可能评估为要在3 4上应用的函数/宏。

是否可以让lisp支持这样的事情?或者是否有技术限制禁止这种做法/使其不切实际?

3 个答案:

答案 0 :(得分:12)

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

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

在Lisp-2中,每个符号都有一个值插槽和一个功能插槽。要调用存储在值插槽中的函数,您需要使用funcall keyword

有关此问题的详情,请参阅:http://www.dreamsongs.com/Separation.html

修改:感谢Rainer Joswig我更正了答案。

答案 1 :(得分:5)

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

(funcall (f 2) 3 4)

在其他一些Lisp方言中,它是允许的。 Scheme是一种Lisp方言。 Scheme还评估函数调用表达式的开头。

答案 2 :(得分:1)

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

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

(funcall (f 2) 3 4)

在Common Lisp中,如果你坚持要对运算符中的函数求值,你可以使用lambda form

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