>> R5RS doesn't  specify this kind of syntax (nor Chicken supports it):
>>
>> (let* loop ((a <init>) (b a))
>>   <body>)
>>
>> To me it seems a missing piece of syntax. Am I wrong?
>
> I've missed it occasionally as well, but I'm not sure it's *that* useful.

Of course that's something we all can live without, but let me expose
a concrete example just for reference.

Let's say I want to traverse a string (or a vector). A nice way to
write that is:

(let loop ((i 0) (ch (string-ref buf 0)))
  (do-something)
  (if (some-condition-is-true)
    (loop (+ i 1)
          (string-ref buf (+ i 1)))))

So far so good... well, almost. If you need to change the starting
position (0) you have to remeber to change it in two locations. But
this is still a minor annoyance.

Now, let's suppose the starting position is not a literal value but
the result of an evaluation:

(let loop ((i (some-function)) (ch (string-ref buf (some-function))))
  (do-something)
  (if (some-condition-is-true)
    (loop (+ i 1)
          (string-ref buf (+ i 1)))))

This is unsatisfactory and might not be even viable if some-function
can't be evaluated twice (e.g. some-function = random).

So writing down the options, we have:

(let* loop ((i (random N)) (ch (string-ref buf i)))
  (do-something)
  (if (some-condition-is-true)
    (loop (+ i 1)
          (string-ref buf (+ i 1)))))

vs.

(let ((start (random N)))
  (let loop ((i start) (ch (string-ref buf start)))
    (do-something)
    (if (some-condition-is-true)
      (loop (+ i 1)
            (string-ref buf (+ i 1))))))

vs.

(let ((ch '()))
  (let loop ((i (random N)))
    (set! ch (string-ref buf i))
    (do-something)
    (if (some-condition-is-true)
      (loop (+ i 1)))))


Now, I guess each of us has its own preference but I don't see the
point to rule out the first option. As I already said defining a let*
syntax but not a named version of it give me a sense of
incompleteness.  :-(

Ciao,
Michele

_______________________________________________
Chicken-users mailing list
[email protected]
https://lists.nongnu.org/mailman/listinfo/chicken-users

Reply via email to