[plt-scheme] to define, or to let

From: Mike T. Machenry (dskippy at ccs.neu.edu)
Date: Sat Mar 20 00:14:04 EST 2004

Just to add my two-cents. I typically like to use let for values and define
for functions. This is because as mentioned earlier when I see let, I know
there's nothing fishy going on with the scope of the expressions in the
bindings. However, I think parameters are easier to read when they're in
a define rather than a let.

(lambda ()
  (define (foo a b)
    ...)
  (foo ...))

(lambda ()
  (let ([foo
         (lambda (a b)
          ...)])
    (foo ...)))

Also there was a discussion a while back regarding the web-sever having
problems with letrec bound page results. (Define works the same way with
respect to the example) This is probably beyond what you're asking for but
essentially the functions whose results were being defined had
continuations which could be invoked multiple times later in the program.
Since define and letrec are destructive, the program had bug which would
not have existed had the values been bound in a let. So I guess I'm saying
the unforeseeable issues is a good reason to favor the most restrictive
construct.

-mike

On Thu, Mar 18, 2004 at 10:31:01PM -0700, Richard Cleis wrote:
>  For list-related administrative tasks:
>  http://list.cs.brown.edu/mailman/listinfo/plt-scheme
> 
> Thanks.  That is why I try to use let-lists instead of 
> define-statements.  A compiler might also try to optimize 
> define-statements, but it seems that, in scheme, define-statements mean 
> something very specific.  That is what I am trying to figure out.
> 
> BTW, using (time) and looping over the two functions shows that the let 
> form is about 10 percent faster than the define-form.  Ie, it looks 
> like the compiler *is* smart.
> 
> rac
> 
> 
> On Mar 18, 2004, at 9:58 PM, Zhu Chongkai wrote:
> >			
> >Yes, a smart compiler will treat let without creating storage.
> >
> >For example:
> >
> >(let ((one-variable 3)
> >      (another-variable 4))
> >  (list one-variable another-variable))
> >
> >will first be converted to
> >
> >((lambda (one-variable another-variable)
> >   (list one-variable another-variable))
> > 3 4)
> >
> >and then the code will be further optimized to
> >
> >(list 3 4)
> >
> >
> >regards,
> >Zhu Chongkai
> 


Posted on the users mailing list.