3 ms·
I'm unclear about function invocation here... FTA: A function invocation. This comprises a list where the first element is the function and the rest of
by escherize 9y ago
I'm unclear about function invocation here... FTA:
A function invocation. This comprises a list where the first element
is the function and the rest of the elements are the arguments. first
takes one argument, (1 2), and returns 1.
My problem is, the same way in every lisp I've seen, (1 2) qualifies as a function invocation. I'm not sure how the interpreter would know not to invoke 1 on 2, in these examples:
(1 2)
or
(first (1 2))
- deleted 9y ago[deleted]
- hencq 9y agoIn most (all?) lisps that's actually exactly what would happen. It would try to call the function '1' (and throw an error since 1 is not a valid function). If you want to have a list you'd typically have something like (list 1 2) or you could quote it '(1 2). In this case it seems to actually check if the first element of the list is a function and only treat it as a function call in that case.
- ambulancechaser 9y agobut you're not passing it the argument '(1 2). Lisps are usually (always?) strict evaluation, so the form `(list 1 2)` or `(quote (1 2))` would return the form (1 2). First applied to this form would return 1. The specification is correct that first applied to (1 2) would return 1. The fact that this means most invocations would look like `(first '(1 2))` is irrelevant since the argument to first here is not '(1 2) but is actually (1 2).
- asdlllkasdasd 9y agoYou are actually in violent agreement with the parent. The grandparent poster was confused why the syntax (foo (1 2)) can be used to apply FOO to (1 2). As the parent points out, for typical Lisps this would actually give an error; instead, (foo '(1 2)) would be the appropriate syntax to apply FOO to the form (1 2). Indeed, when strictly evaluating (foo '(1 2)), first the arguments are evaluated. Since functions self-evaluate, FOO evaluates to itself, while '(1 2) evaluates to (1 2). Then, FOO is applied to (1 2). This is in complete agreement with what you said and what the specification says. However, the Lisp interpreter at hand actually self-evaluates lists whose head is not a function. Thus (1 2) self-evaluates and (foo (1 2)) has the same effect as (foo '(1 2)).
- aktau 9y agoFantastic comment, this cleared up one or two headscratchers I encountered while patterning a Lisp I was writing in Lua with LPeg (I had just encountered LPeg and wanted to do something fun with it) on Peter Norvig's Lis.py. It didn't 100% square with what I recalled from other Lisps.
- lispm 9y ago> Since functions self-evaluate, FOO evaluates to itself No, in Lisp FOO is a name of a function, not a function itself. Thus FOO evaluates to a function (otherwise it would be an error) in a Lisp-1 like Scheme. In a Lisp-2 like Common Lisp, one would say that the function value of FOO is retrieved. > Indeed, when strictly evaluating (foo '(1 2)), first the arguments are evaluated Actually not. In Lisp the first item needs to be looked at first. If it is determined to name a function, then we can evaluate the arguments, of which there is only one in this case.
- asdlllkasdasd 9y agoYou are right about both points! PS: The second you quoted out of order. If you reread, you will see that I was referring to FOO as the first "argument" (a typo for "element"..).
- vertex-four 9y agoIn this particular lisp's case, the interpretList function contains: if (list[0] instanceof Function) { return list[0].apply(undefined, list.slice(1)); } else { return list; } Or in other words, a list is interpreted as a call if it starts with a function, or else it's interpreted as just the list as data. (1 2) is the latter case, since 1 is not a function.
- jhbadger 9y agoThat's actually how Picolisp functions, and is quite convenient.