named-let

やっと、named-letの意味が分かった。
手続きの定義と最初の実行を同時にやっているような感じだ。
(使い道は、末尾再帰にする時の中部分の記述に使うくらいしか思いつかない)
例えば、与えたlistの要素を反転させる手続きreverseがあったとして、

(define (reverse l)
  (define (iter re rest)
    (if (null? rest)
        re
        (iter (cons (car rest) re) (cdr rest))))
  (iter '() l))

;; (reverse '(1 2 3 4)) ;; => (4 3 2 1)

これをnamed-letを使えばこのように記述できる。

(define (reverse l)
  (let iter ((re '()) (rest l))
    (if (null? rest)
        re
        (iter (cons (car rest) re) (cdr rest)))))

いや、でもこういう関数ならfoldを使った方が楽だけれど。

(define (reverse l)
  (fold (cut cons <> <>) '() l))