[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: something *very* strange (to *me*). Please help!



>      Sorry about such a non-descriptive subject. I really have no idea 
>      about
>      what's going on!
>      In CLISP:
>      
>      (let ((l (do ((i 0 (1+ i)) r) ((= i 3) (nreverse r))
>              (push #'(lambda () i) r))))
>        (mapcar #'funcall l))
>      
>      ==> (3 3 3)
>      
>      I would expect (0 1 2)
>      
>      What is going on?
>      How do I get the desired result?
>      (declaring i special doesn't change anything)
>      Thanks.

To understand what's going on, try macroexpanding the DO form.

Whether the variables in the DO are SETQed or rebound is
implementation dependent.  It appears that in Clisp one variable is
shared by all the functions.  

If you want a different behaviour, you should write exactly what you want.

e.g. (not tested)

(let ((l (labels ((fun (i r)
                   (if (= i 3)
                       (nreverse r)
                       (fun (+ i 1) (cons (lambda () i) r)))))
           (fun 0 '()))))
 (mapcar #'funcall l))
      


>      
>      -- 
>      Sam Steingold
> 
> 
> 

Poka,
Pierpaolo.