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))