Thanks, Tohmas and Alex!

I think I understand that simple code-walking does not help,
in many cases, for example, a loop.

  (lazy-let ((a (get-a)))
    (letrec ([b (lambda () (when (condition) (print a) (b)))])
      (b)))

OK, I would not need a general solution,
let me think about it for a while.

Thanks for comments, and any more comments are welcome.
Daishi

At Thu, 17 Nov 2005 19:19:46 -0600,
Alex Shinn wrote:
> 
> At Fri, 18 Nov 2005 08:18:11 +0900, Daishi Kato wrote:
> > 
> > Would it be worth improving the lazy-let macro
> > so that it understands at least let and quote forms?
> 
> Not let forms.  Analyzing subforms of a macro is called code-walking,
> and the first thing you then need to do is sc-expand the body or
> lazy-let won't play well with other macros.  At that point there are
> no let's remaining, and everything is in terms of lambda.
> 
> But I think the problem you're trying to solve is in general
> unsolvable.  Consider the form:
> 
>   (lazy-let ((a (get-a)))
>     (list (if (condition-1) a #f)
>           (if (condition-2) a #f)))
> 
> If you expand this to
> 
>   (list (if (condition-1) (get-a) #f)
>         (if (condition-2) (get-a) #f))
> 
> then you may end up calling get-a twice.  However, if you compute the
> value once outside the nearest enclosing form for all occurances:
> 
>   (let ((a (get-a)))
>     (list (if (condition-1) a #f)
>           (if (condition-2) a #f)))
> 
> then you always compute get-a even when it may not be needed.
> 
> -- 
> Alex


_______________________________________________
Chicken-users mailing list
Chicken-users@nongnu.org
http://lists.nongnu.org/mailman/listinfo/chicken-users

Reply via email to