Thanks Alex.
I didn't know about picolisp's tolerance for nested symbols. Is there a
reason you chose this?
Like, it lets you write some cool code, or it makes the language more
robust?

On Tue, Dec 27, 2016 at 10:15 AM, Alexander Burger <a...@software-lab.de>
wrote:

> Hi all,
>
> while talking about 'set' and 'setq', let me clarify another issue. Quite
> often
> I see here - or in IRC - expressions like
>
>    (mapc 'set '(A B C) (1 2 3))
>
> or
>
>    (mapcar 'inc (4 5 6))
>
> While this certainly works, it is actually wrong, or at least unnecessary.
>
>
> The mapping functions want a *functional* first argument. If you look up
> in the
> reference (under "Evaluation", doc/ref.html#ev), it says that a function is
> either a number (a function pointer) or a cell (with parameter(s) in the
> CAR and
> a 'prg' body in the CDR).
>
> However, the above expressions pass a *symbol* to the mapping functions.
> So just
>
>    (mapc set '(A B C) (1 2 3))
> or
>    (mapcar inc (4 5 6))
>
> would be fine, because the first arguments are evaluated, resulting in
> proper
> numbers.
>
>
> The quoted calls (resulting in symbols) happen to work just due to a lucky
> coincidence:
>
> When PicoLisp evaluates a function call, it tries to be tolerant. Instead
> of
> throwing an error when hitting a symbol, it *evaluates* that symbol (or any
> expressions in general which show up, until it gets to a proper function.
> For
> example
>
>    (de square (N)
>       (* N N) )
>
>    (setq
>       F 'square )
>       L '(line square circle) )
>
>    : (F 7)
>    -> 49
>
>    : ((cadr L) 7)
>    -> 49
>
>    : ((val (cadr L)) 7)
>    -> 49
>
>
> One more note: In case of *message* calls on objects you *must* pass a
> symbol.
> They need a symbol to locate the right method in the class hierarchy
>
>    (mapc 'lose> (collect 'key '+Cls))
>
> so here the quote is correct.
>
> - Alex
> --
> UNSUBSCRIBE: mailto:picolisp@software-lab.de?subject=Unsubscribe
>

Reply via email to