星田さんの記事に対するちょっとした補足。
累乗の計算を末尾再帰で行うのに、名前付きletとそうじゃないのを見比べたりとか・・
ちなみに、今まであんま言わなかったんだけど、Racketにはオプショナル引数と言う機能があって、こういう風にも書けます。
(define (pow5 x n (acc 1))
(if (zero? n)
acc
(pow5 x (- n 1) (* acc x))))
オプショナル引数はパラメータリストに「デフォルト値を指定したリスト」を引数として与える方式で作成出来て、「特に関数呼び出しの際にそれを指定しない場合、デフォルト値が使われる」方式です(写真見れば分かるでしょうが、3引数で作った関数pow5は2引数でも平気で起動する)。
Schemeと言うよりはANSI Common Lispで良く使われる手で、それもこれもANSI Common Lispには名前付きletがないので、代わりに末尾再帰を書くショートカットとして良く使われるんで、まぁ、覚えておいて損はないでしょう。
もう1つ、余談としては、この「累乗の計算」は再帰を使わず、foldlを使えば一行で書ける、と気づけばこの辺は免許皆伝でしょう。
(define (pow6 x n)
(foldl * 1 (make-list n x)))
当然、foldlの中身は再帰関数なんだけど、もっとズルをすれば実はapplyが使える。
(define (pow7 x n)
(apply * (make-list n x)))
この辺の細かいテクニックを見るには、「新規の学習はせずにScheme入門的なサイトで復習」ってのは実に有効です。
あとはニコニコで(C言語だけど)テトリスを実況しつつ1時間で環境構築から作るってのをぼやーっと眺めたりとかしてました。
見てみました。
「C言語で」って謳ってたんだけど、実際はC++でしたね。
ちと残念だったかも。