On Sun, May 23, 2021 at 08:44:32PM -0500, polifemo wrote:
> `(let @ 1 (let @ 10 (let @ 20 (up 2 @))))`

This are two misunderstandings in this example:

1. It has not a good idea to bind '@' in a 'let' expression. '@' is set
   implicitly by flow- and logic-functions, so a correct usage would be

      (and 1 (or 10 (while 20 (up 2 @))))

   or - more realistically -

      (and (foo) (or (bar) (while (zup) (up 2 @))))

2. 'up' does not care about 'let', 'use', 'for' etc. They are ignored. An up
   "enclosing environment" always means the enclosing *function* environment. So
   all the above 'let's all run in the same environment. The same rule applies
   to the environment offsets to 'eval' and 'run'.


> returns 1, as I expected, if I enclose the 'up expression inside a function

This return value of '1' just happens because the environment setup in bindeng
'@' in 'let' is undefined.


Let me try to give an example.

   (when 7  # The result of 'when' is what we are interested in
      (extract
         '((N)  # Here we are in a function
            (when (num? N)  # 'when' sets '@'
               (+ N @) ) )  # so we add the wrong '@'
         (1 a 2 b 3)))
   -> (2 4 6)

   (when 7
      (extract
         '((N)  # in a function
            (when (num? N)
               (+ N (up 1 @)) ) )  # Here we get the '7'
         (1 a 2 b 3)))
   -> (8 9 10)

☺/ A!ex

-- 
UNSUBSCRIBE: mailto:picolisp@software-lab.de?subject=Unsubscribe

Reply via email to