Part10: 変数と手続き

花丸「さっきゲーマーズ町田に寄ったら、6話を受けて『今週の松浦果南ちゃん。』コーナーが大勝利状態だったずら」
ダイヤ「花丸さんの家から部室へ来るのにどうやったら町田に寄れますの・・・?」
果南「先週の5話は・・・いや、別に私が悪いことしたわけじゃないんだけど、なんか、ごめん・・・」
花丸「人魚とゴスロリかわいかったですね!ずら」
ダイヤ「地元民しかわからないネタはお止めなさい」


ダイヤ「では変数と手続きの話に入りますわ。手続き(procedure)は多くの言語では関数(function)と呼ばれていますが、Schemeでは手続きという呼び方が公式ですのでそれを使います」
花丸「変数とか関数とかって何ずら?」
ダイヤ「変数は、これまでに出てきたようなデータを一時的に格納しておく名前付きの箱、といったところですわね。関数といいますか手続きは、+string-appendなどのようにある決まった処理を行うための仕組みですわ」


ダイヤ「今回は単純なグローバル変数の話をします。ローカル変数については別に回を設けますわ」

ダイヤ「これで、idolという名前の変数に"Aqours"という値が設定されました。REPLでidolと入力すると"Aqours"が返ってくるはずですわ」
果南「ふんふん・・・変数名を評価すると変数の値になると」
ダイヤ「その変数名idolはシンボルですから。この動きは前にも見ましたわね」
果南「'idolだとシンボル自身になるってやつだね」

ダイヤ「変数の値を変更するにはset!を使います。破壊的操作には!が付くのが通例ですわ」

ダイヤ「このようにして、変数の値を"μ's"から"Aqours"に変更できます」


ダイヤ「では手続きですわね。まずは、これまでに見てきた命令文も変数の値にできるというのを確認しておきますわ」

ダイヤ「REPLでcpと入力するとstring-appendが実行されて"youriko"が返されます」
果南「string-appendの文もリストだから変数に代入できるって話だよね」
ダイヤ「その通りですわ。このように、単純な値であるか命令文であるかを問わず、defineで変数に代入できるということはわかったと思います」
花丸「ここまでは大丈夫ずら」
ダイヤ「では、string-appendのような手続きを自分で定義するにはどうするか、という話に移ります。lambdaを使って定義ができますわ」

ダイヤ「引数xを取って、それを2つつなげて返す手続きです。これを実行するには」

ダイヤ「このように書きます。少々読みづらいのでdefineを使ってすっきりさせてみますわ」

ダイヤ「手続きにdoubleという名前を付けました。これで、'(double “maru”)’のようにして呼び出すことができますわ」
果南「組み込みの手続きと同じように扱えるようになった、ってことだね」
ダイヤ「はい。リストの最初の要素が命令、2つ目以降が引数、ですわ」


ダイヤ「これまで見てきた手続きの中には、引数の数が定まっていないものがありましたわね」
花丸「(+ 80 83 83)とか(+ 2 5 2 5 2)みたいに渡しただけ処理してくれる手続きがあったずら」
ダイヤ「その仕組みを見てみます」

ダイヤ「これは可変長の引数を取る手続きですわ。引数を(x . y)としていますが、これは第1引数をx、それ以降の引数をリストとしてyで受け取る書き方です」
果南「じゃあ、手続きの実装ではyをバラして処理すればいいんだ」
ダイヤ「そういうことですわ。(x y . z)のように書くと第1引数がx、第2引数がy、第3引数以降がzに入りますから、固定で受け取る引数と可変の引数をうまく使い分けるとよいですわね」


ダイヤ「次回は条件分岐、プログラムの3要素の1つですわね」
果南「まあ今まで、ひたすらデータ構造の説明だったからねえ」
花丸「やっとプログラムっぽいのが書けるようになりそうずら」


LINEで送る
Pocket


返信を残す

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