内部定義

内部定義(internal definition)

Schemeの面白い記法の一つがinternal-definitionです。

(define (fact n)
  (define (fact-2 n m)
    (if (= n 1) m
                (fact-2 (- n 1) (* m (- n 1)))))
  (fact-2 n n))

ボディの先頭でのみ、defineを使うことで局所的な定義を行うことができます。
意味的にはletrecと等価なので、以下のように置き換え可能です。

(define (fact n)
  (letrec ( (fact-2 (lambda (n m)
                      (if (= n 1) m
                                  (fact-2 (- n 1) (* m (- n 1)))))))
    (fact-2 n n)))

internal-defineは括弧の入れ子を深くすることなく、
局所変数や内部関数を記述することができるため好みの記法です。