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?
-Patrick