named-let
名前付きletと訳されることもあるけど、
なんとなくかっこつけてnamed-letと呼んでます僕は。
まぁ、繰り返しのような再帰のようななんとも言い難い
曖昧な位置にある構文です。だがそれがいい。
この構文はSchemeオリジナルだと思う。
もっともシンプルな例はこんな感じ。
(let loop ((i 0))
(when (> i 5)
(display i)
(loop (+ i 1)))
Cで表現すると、
for (i = 0; i < 5; i++)
printf("%d", i);
Cの方が全然シンプルじゃん!とか言わないように。
named-letはそもそも局所束縛式letの拡張なんで。
letにラベル付けて繰り返しっぽく再帰できるようしたものです。
微妙にgotoチックで素敵な気がしない?
(let <変数> <束縛部> <本体>) ライブラリ構文
“名前付きlet” はlet の構文の一変種である。これはdoよりも一般性の高い繰返しコンストラクトを定めており,再帰を表現するために使うこともできる。その構文と意味論 は通常のlet と同じだが,ただし,<変数> が<本体> の中で,束縛変数を仮引数とし<本体> を本体とする手続きへと束縛される,という点が異なる。したがって<変数> を名前 としている手続きを呼び起こすことによって,<本体> の実行を繰り返すことができる。
-- R5RS 4.2.4項
R5RSからわかるようにnamed-letはシンタックスシュガーで、
さっきの例だと以下の関数が内部的に定義されてるってことですね。
(define (loop i)
(when (> i 5)
(display i)
(loop (+ i 1))))
つかなに現実逃避してんすか俺・・・
