花丸「さっきゲーマーズ町田に寄ったら、6話を受けて『今週の松浦果南ちゃん。』コーナーが大勝利状態だったずら」
ダイヤ「花丸さんの家から部室へ来るのにどうやったら町田に寄れますの・・・?」
果南「先週の5話は・・・いや、別に私が悪いことしたわけじゃないんだけど、なんか、ごめん・・・」
花丸「人魚とゴスロリかわいかったですね!ずら」
ダイヤ「地元民しかわからないネタはお止めなさい」
ダイヤ「では変数と手続きの話に入りますわ。手続き(procedure)は多くの言語では関数(function)と呼ばれていますが、Schemeでは手続きという呼び方が公式ですのでそれを使います」
花丸「変数とか関数とかって何ずら?」
ダイヤ「変数は、これまでに出てきたようなデータを一時的に格納しておく名前付きの箱、といったところですわね。関数といいますか手続きは、+
やstring-append
などのようにある決まった処理を行うための仕組みですわ」
ダイヤ「今回は単純なグローバル変数の話をします。ローカル変数については別に回を設けますわ」
1 |
(define idol "Aqours") |
ダイヤ「これで、idol
という名前の変数に"Aqours"
という値が設定されました。REPLでidol
と入力すると"Aqours"
が返ってくるはずですわ」
果南「ふんふん・・・変数名を評価すると変数の値になると」
ダイヤ「その変数名idol
はシンボルですから。この動きは前にも見ましたわね」
果南「'idol
だとシンボル自身になるってやつだね」
ダイヤ「変数の値を変更するにはset!
を使います。破壊的操作には!
が付くのが通例ですわ」
1 2 |
(define idol "μ's") (set! idol "Aqours") |
ダイヤ「このようにして、変数の値を"μ's"
から"Aqours"
に変更できます」
ダイヤ「では手続きですわね。まずは、これまでに見てきた命令文も変数の値にできるというのを確認しておきますわ」
1 |
(define cp (string-append "you" "riko")) |
ダイヤ「REPLでcp
と入力するとstring-append
が実行されて"youriko"
が返されます」
果南「string-append
の文もリストだから変数に代入できるって話だよね」
ダイヤ「その通りですわ。このように、単純な値であるか命令文であるかを問わず、define
で変数に代入できるということはわかったと思います」
花丸「ここまでは大丈夫ずら」
ダイヤ「では、string-append
のような手続きを自分で定義するにはどうするか、という話に移ります。lambda
を使って定義ができますわ」
1 |
(lambda (x) (string-append x x)) |
ダイヤ「引数x
を取って、それを2つつなげて返す手続きです。これを実行するには」
1 |
((lambda (x) (string-append x x)) "maru") ; "marumaru" |
ダイヤ「このように書きます。少々読みづらいのでdefine
を使ってすっきりさせてみますわ」
1 2 |
(define double (lambda (x) (string-append x x))) (double "maru") ; "marumaru" |
ダイヤ「手続きにdouble
という名前を付けました。これで、'(double “maru”)’のようにして呼び出すことができますわ」
果南「組み込みの手続きと同じように扱えるようになった、ってことだね」
ダイヤ「はい。リストの最初の要素が命令、2つ目以降が引数、ですわ」
ダイヤ「これまで見てきた手続きの中には、引数の数が定まっていないものがありましたわね」
花丸「(+ 80 83 83)
とか(+ 2 5 2 5 2)
みたいに渡しただけ処理してくれる手続きがあったずら」
ダイヤ「その仕組みを見てみます」
1 |
((lambda (x . y) (list x y)) "dia" "kanan" "maru") ; ("dia" ("kanan" "maru")) |
ダイヤ「これは可変長の引数を取る手続きですわ。引数を(x . y)
としていますが、これは第1引数をx
、それ以降の引数をリストとしてy
で受け取る書き方です」
果南「じゃあ、手続きの実装ではy
をバラして処理すればいいんだ」
ダイヤ「そういうことですわ。(x y . z)
のように書くと第1引数がx
、第2引数がy
、第3引数以降がz
に入りますから、固定で受け取る引数と可変の引数をうまく使い分けるとよいですわね」
ダイヤ「次回は条件分岐、プログラムの3要素の1つですわね」
果南「まあ今まで、ひたすらデータ構造の説明だったからねえ」
花丸「やっとプログラムっぽいのが書けるようになりそうずら」