Subject: Re: about functions that return functions. From: Erik Naggum <erik@naggum.net> Date: Wed, 13 Mar 2002 17:49:36 GMT Newsgroups: comp.lang.lisp Message-ID: <3225030587448391@naggum.net> * Jordan Katz | Everyone who responded seems to think I'm thinking in Scheme, and, as far | as I can tell it seems to be rooted in what I wrote above, but I don't | see why. You have asked a very typical Scheme question, and people are somewhat sensitive to this sort of question because Scheme victims keep asking it over and over. It seems that this one-namespace thing acts like a virus that takes over the host system to produce more of its own kind. The problem is one of faulty reasoning and muddy thinking, and this is also typical of Scheme victims. | CMUCL groks ((lambda (x) (+ x 1)) 1) for me just like a Scheme would, it | doesn't only accept (funcall (lambda (x) (+ x 1)) 1). Is that a liberty | taken by CMUCL authors to make it more friendly for Schemers, or is that | in accordance with CL specs? This has already been asnwered with a reference to the Hyperspec. Please pay attention, or you just annoy people. Perhaps you did not understand the answer you got. Let ma assume you did not, and try a different angle: (foo ...) calls the function named foo. ((lambda ..) ...) calls the "anonymous" function that _is_ (lambda ...). Kent calls the function itself its name, but I find that confusing -- your name is _not_ your identity, it is a label on your identity. An anonymous function has its own identity as a function, but no name. Specifically, it _is_ a function. Now, you can call the function directly, or you can call it by its name, which the compiler will resolve for you to either be the lexically defined functionn or the globally defined function that is the value of the symbol with the name you gave. The first position in a form either _is_ a function or _names_ a function. (In addition to all the other types of operators, of course.) Now, how is this different from Scheme and from your faulty reasoning? Suppose you think that (lambda ...) _evaluates_ to a function when it is in the first position of a form. This is clearly not how Common Lisp does it, because it expressly does _not_ evaluate the first position, but it _is_ how Scheme does things. If you did not pay much attention to the differences in evaluation rules between Scheme and Common Lisp -- and it seems you have not really studied the evaluation rules of either language just sort of adopted them by osmosis (example) -- you would perhaps think that the operator is somehow evaluated in a different way in Common Lisp. But Common Lisp does expressly _not_ evaluate the operator. The operator either is a function or names a function. So if you place something there that would need to be _evaluated_ to produce a function, it is just not how Common Lisp does things. In summary, ((lambda ...) ...) works because it _is_ a function, not because it _evaluates_ to a function. In (funcall (lambda ...) ...), (lambda ...) evaluates to a function, and the _function_ funcall is called with a regular evaluated value. I quote from the standard and its entry on funcall: The difference between funcall and an ordinary function call is that in the former case the function is obtained by ordinary evaluation of a form, and in the latter case it is obtained by the special interpretation of the function position that normally occurs. Note the special interpretation. /// -- In a fight against something, the fight has value, victory has none. In a fight for something, the fight is a loss, victory merely relief.