Part13: ローカル変数

ダイヤ「これまでdefineを使って定義したグローバル変数を扱ってきました」
果南「プログラムのどこからでも見える変数だよね」
ダイヤ「はい。ですが、変数の有効範囲を局所化することができます。名前の衝突を避けるなどの理由で、一般に変数はできるだけ狭いスコープで使うことが望ましいとされますわ」

ダイヤ「利用できる範囲の限定される変数については、触れはしませんでしたがすでに出てきていますわ。lambdaを思い出してください」

ダイヤ「グローバル変数xを定義し、また手続きdoubleを定義してその中で変数xを使っています」
花丸「それで、(double 5)ではxは5になるから(+ 5 5)で10ずら」
ダイヤ「ですが、最初に定義したグローバル変数xと、手続きdoubleが引数に取るxは別のものなのです」
果南「えーと、doubleの中でxの値が5に変更されるとしたら、最後の(double x)は10にならないとおかしいのか」
ダイヤ「はい。ですが実際には20になりますね。これはつまり、手続きdoubleで使われるxは手続きdoubleの中だけで有効なローカル変数ということです」
花丸「lambdaの中で何をしてもグローバル変数には影響しないってことかー」


ダイヤ「lambdaで手続きを作らなくてもローカル変数を利用する方法があります」

ダイヤ「・・・くっ」
果南「別にそんな自虐的にならなくても・・・」
ダイヤ「・・・ともかく。lambdaと同じように、letの本体部分だけで有効な変数を利用できます」
花丸「lambdaより簡単に書ける感じがするずら」
ダイヤ「では、この例を見てください」

花丸「同じ結果になりそうに見えるけど・・・エラーになるずら」
ダイヤ「ローカル変数の有効範囲はあくまでletの本体だけ。ですから、初期化の段階で他のローカル変数を参照することはできないのです」
果南「理屈は分かるけど、できた方が便利だったりしない?」
ダイヤ「そのための書き方も用意されていますわ」

ダイヤ「let*を使うと、前に初期化した変数を後から出てくる変数の初期化に使うことができます」
果南「kananの初期化のところでは初期化済みのdiaを使える、と」
ダイヤ「letlet*lambdaを使って書くこともできますから、お暇な方は試してみるとよいかと思いますわ」


ダイヤ「次回はSchemeにおける繰り返し、再帰について見ていきますわ」
花丸「ようやくプログラムらしいプログラムが書けるようになるずら」
果南「再帰・・・再帰か・・・」


LINEで送る
Pocket


返信を残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です