見出し画像

Retro-gaming and so on

RE: プログラミング日記 2022-04-05~

星田さんの記事に対するちょっとした補足。


累乗の計算を末尾再帰で行うのに、名前付き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++でしたね。
ちと残念だったかも。
  • Xでシェアする
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

最近の「RE: プログラミング日記」カテゴリーもっと見る

最近の記事
バックナンバー
人気記事