Re: lazy-let & loop

<[email protected]>
Newsgroups gmane.lisp.clisp.devel
Message-ID <644a87b0a54f4b68999dd4b6bef61020@HE105658.emea1.cds.t-internal.com>
Hi,

Sam wrote:
>"lazy-binding": bind the variable but not initialize its value. until it is explicitly set,
>accessing it reaches up in the environment.
Interesting challenge :-)

> This would require something like `lazy-let` with the following test case:
--8<---------------cut here---------------start------------->8---
(let ((a 1))
  (lazy-let (a b)
    (print a) ; prints 1
    (print b) ; error - unbound variable
    (setq a 10) ; inner binding of a is activated
    (print a) ; prints 10
    (setq b 22)) ; binding of b is activated
  (print b) ; error - unbound variable
  (print a)) ; prints 1
--8<---------------cut here---------------end--------------->8---

>Alternatively, `lazy-let` can be implemented as something like
> (let ((a (if (boundp 'a) a (sys::%unbound))))  ...)
Certainly not, BOUNDP would only work with variables declared special.

Perhaps SYMBOL-MACROLET?
But that won't work either, because the problem remains that once `a becomes a symbol-macro,
one cannot express anymore "let me access `a from the outer environment". Didn't somebody once
post a bug report about similar infinite macro expansion about regular macros?

This makes me remember that there have been several past attempts at trying to make
the environment-access functions of CLtL2 fly. But Google turned up few references,
I must have been dreaming. :-(
http://clast.sourceforge.net/

Hmm, there's perhaps nothing that another level of delayed evaluation
in order to get the desired scoping couldn't solve, so here it is:

(defmacro lazy-let1 ((var) &body body)
  (let ((shadow (gensym (symbol-name var))))
    `(let ((,shadow 'unbound));(sys::%unbound)
       (flet ((access-a () (if (eq ,shadow 'unbound) ,var ,shadow))
	      ((setf access-a) (x) (setf ,shadow x)))
	 (symbol-macrolet ((,var (access-a))) .,body)))))

; bonus point 0: Add more required gensyms
; bonus point 1: Support a list of variables as per Sam's specification
; bonus point 2: See if LET can work with clisp's %unbound trick
; bonus point 3.5: See if you can make it work with special variables...

(let ((a 1))
  (lazy-let1 (a)
    (print a) ; prints 1
    (setq a 10) ; inner binding of a is activated
    (print a)) ; prints 10
  (print a)) ; prints 1

Regards,
	Jörg
------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot
_______________________________________________
clisp-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/clisp-devel
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.