Why doesn't this work?
( ((lambda () (lambda (x) (funcall #'1+ x)))) 2)
; yields Compile-time error: illegal function call
I ran into a situation like this and it later turned out that a funcall
fixes it, i.e.
(funcall ((lambda () (lambda (x) (funcall #'1+ x)))) 2) ; => 3
I'm confused because it seems like the first one should work, because I actually have a function I'm calling, not just a symbol that may belong to either namespace (i.e. (type-of ((lambda () #'1+))) ; => FUNCTION
). I thought it would be kind of like how you don't need to funcall
a lambda for example, e.g.((lambda (x) x) :HI) ; => :HI
. What am I missing?
The syntax of Common Lisp requires that, everytime you want to call a function through a compund form of the type:
the first element of the list,
f
, must be a symbol denoting a function name, or a list denoting a lambda expression, i.e. (see the manual):So, this basically means that you cannot have as first element any expression that returns a function as value. In those cases, you must use
funcall
.So, in your second example, the first argument of the
funcall
is((lambda () (lambda (x) (funcall #'1+ x))))
, which is a correct coumpound form, in which the first element of the list is the lambda expression(lambda () (lambda (x) (funcall #'1+ x)))
(applied to an empty list of arguments).In the first example, instead, you have as first element of the list an expression returning a function, so that you must use
funcall
.