On Thu, Feb 23, 2012 at 09:48:14PM -0300, José Romero wrote:
> Your problem is using the quote function instead of making a copy of
> the list on return, this rewritten version should work:
> 
> (de lazy Prg
>    (list NIL
>       (list 'job (list 'quote (cons 'Value "delayed"))
>          (list 'if '(== Value "delayed")
>             (list 'setq 'Value (cons 'run Prg))
>             'Value ) ) ) )

That's right.


A slight simplification might be directly using 'prog' instead of 'run'

   (list 'setq 'Value (cons 'prog Prg))

This has the advantage that instead of

> (setq foo (lazy
>             (prog
>               (prinl "!")
>               2)))

You can write

   (setq foo (lazy (prinl "!") 2))

or even better

   (def 'foo (lazy (prinl "!") 2))

   : (pp 'foo)
   (de foo NIL
      (job '((Value . "delayed"))
         (if (== Value "delayed")
            (setq Value (prog (prinl "!") 2))
            Value ) ) )
   -> foo
   : (foo)    
   !
   -> 2
   : (foo)
   -> 2

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

Reply via email to