问题
Do any lisps support nested s-expression on their head? For example
((f 2) 3 4)
for which (f 2)
presumably evaluates to a function/macro to apply on 3 4
.
Is it possible to have a lisp supporting such a thing? Or are there technical limitations that prohibit this/make it impractical?
回答1:
In those Lisps, which have single namespace for variables and functions, your expression is valid. These are called Lisp-1. Scheme and Clojure are examples of such Lisps.
In those Lisps, which have separate namespaces for variables and functions, your expression would be (funcall (f 2) 3 4)
. These are called Lisp-2. Common Lisp and Emacs Lisp are examples of such Lisps.
In Lisp-2 every symbol has a value slot and a function slot. To call a function, that is stored in a value slot you need to use funcall keyword.
See more on this issue: http://www.dreamsongs.com/Separation.html
Edit: Thanks to Rainer Joswig i corrected the answer.
回答2:
For example in Common Lisp above is not valid. The syntax of Common Lisp does not generally allow lists as the head of a function call. You have to use FUNCALL
to call a returned function value.
(funcall (f 2) 3 4)
In some other Lisp dialects it is allowed. Scheme is such a Lisp dialect. Scheme also evaluates the head of a function call expression.
回答3:
Lisp-1 lisps, such as Scheme, usually have all expressions of a function form evaluated, even the function itself.
Lisp-2 lisps, such as Common Lisp, usually have different behaviour for the function and for the arguments. Whereas the arguments are evaluated, the function is looked up. The common way to invoke an evaluated function is to use funcall
or apply
.
(funcall (f 2) 3 4)
In Common Lisp, you can use a lambda form, if you insist on evaluating something to a function in the operator:
((lambda (&rest args) (apply (f 2) args)) 3 4)
来源:https://stackoverflow.com/questions/12906945/do-any-lisps-have-a-s-expression-as-their-head-e-g-f-2-3-4-if-not-why