On Jan 25, Michael Sperber wrote:
> The fact that the convenient syntax for writing recursive procedures
> is part of `let' is a long-standing wart in the syntax of Scheme.

I disagree.


> It is unintuitive (it expands into `letrec', rather than a simpler
> form of `let), difficult to explain to newcomers to Scheme, and
> disconcerting to the casual reader.
> 
> How to fix:
> 
> If the syntax needs to be integrated with one of the standard
> binding forms, it should be `letrec', not `let'.  However, it would
> be much better to rename named `let' to something else such as
> `rec', `recur' or `recursive'.

If you view

  (let ([x v] ...) body ...)

as sugar for

  ((lambda (x ...) body ...) v ...)

then a named let makes a lot of sense -- it simply gives a name to
that function.  It just happens that this needs a letrec in the
expansion, but it's unrelated to the let bindings (now function
bindings) that are still bound in the same way.  An unnamed let can
expand to a similar letrec, except that the name is never used so it
can be skipped.

If you're suggesting:

  (letrec loop ([x ...]) body ...)

then I don't understand how it can work in any intuitive way.  Worse,
I find it very common to write

  (define (tree-foo foo tree)
    (let loop ([tree tree])
      ...))

which breaks if it was using a letrec.

-- 
          ((lambda (x) (x x)) (lambda (x) (x x)))          Eli Barzilay:
                  http://www.barzilay.org/                 Maze is Life!

_______________________________________________
r6rs-discuss mailing list
[email protected]
http://lists.r6rs.org/cgi-bin/mailman/listinfo/r6rs-discuss

Reply via email to