On Wed, May 29, 2013 at 10:20 PM, Patrick Li <patrickli.2...@gmail.com> wrote:
> Hi Michele,
>
> I realized after posting my version of named-let*, that you actually
> *cannot* use it to accomplish all of what you want. For that you do need
> loop to be a syntactic extension, as mentioned by Jorg.
>
> For instance, my named-let* macro would not simplify the example you posted
> earlier:
>
> (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)))))
>
> The key issue underlying this is, when you call (loop), would you like to
> call it with one or two arguments?
>

Two. Your macro seems good to me. For example, let's say I want to
print a string starting from a random position:

(define buf "foobar")

(named-let* loop ((i (random (string-length buf))) (ch (string-ref buf i)))
  (display ch)
    (if (< (+ i 1) (string-length buf))
      (loop (+ i 1) (string-ref buf (+ i 1)))))


or even better:

(named-let* loop ((len (string-length buf)) (i (random len)) (ch
(string-ref buf i)))
  (display ch)
    (if (< (+ i 1) len)
      (loop len (+ i 1) (string-ref buf (+ i 1)))))


Michele

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

Reply via email to