任何lisps支持嵌套的s表达式吗?例如
((f 2) 3 4)
(f 2)
可能评估为要在3 4
上应用的函数/宏。
是否可以让lisp支持这样的事情?或者是否有技术限制禁止这种做法/使其不切实际?
答案 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,通常对函数和参数有不同的行为。在评估参数的同时,查找函数。调用已评估函数的常用方法是使用funcall
或apply
。
(funcall (f 2) 3 4)
在Common Lisp中,如果你坚持要对运算符中的函数求值,你可以使用lambda form:
((lambda (&rest args) (apply (f 2) args)) 3 4)