Part12: 直列化

果南「・・・・・・」
花丸「か、果南さん、その・・・待てば海路の日和あり、ずら」
果南「・・・・・・」
ダイヤ「・・・わ、私だって、今の状況は本意ではありませんわ・・・」
果南「・・・・・・」
花丸「・・・・・・」
ダイヤ「・・・・・・」
果南「・・・出番」
ダイヤ「ひっ!」
果南「出番がしいたけ以下だとか、7話までで映った時間が9分とか、Aqoursの一員なのに実況勢に名前認知されてないとか」
花丸「は、はわわ・・・」
果南「これはもう、『花田』って書いた紙入れた藁人形と五寸釘持って淡島神社に丑の刻参り・・・」
花丸「そ、その前にうちのお寺に来るずら!そしたらもうちょっと穏当に、こう・・・」


ダイヤ「気を取り直して、今日は直列化について見てみますわ。手っ取り早く終わる内容ですから、そうしたら皆で花丸さんのお寺に・・・」
花丸「ダイヤさん、気を取り直せてないずら」
ダイヤ「あー、こほん。では以前取り上げたこのコードを思い出すのです」

果南「標準出力に『ハラショー』って出力するやつだね」
ダイヤ「displayはコンソールへの出力、newlineは改行の手続きですが、この2つの文をbeginを使ってシーケンシャルに実行させているのがこの例です」
花丸「確かにREPLで改行付き出力するにはセットになってないと困るずら」
ダイヤ「それだけではありません。Schemeでは『手続きを引数に取る手続き』が多用されますから、そういう考え方を理解するためにも必要ですわ」
果南「高階関数、みたいなものかな」
ダイヤ「そのものですわね。まあ実際は、そういう場合にはlambdaが用いられることが多いですが」
花丸「そういえばlambdaと似てる気がするずら」
ダイヤ「beginlambdaの本体部分に相当しますから、lambdaを使うときは知ろうが知るまいがbeginを使っていることになりますわ」


ダイヤ「beginが使われるのは、副作用を伴う式を扱う場合の方が多いかもしれません」
花丸「副作用?」
ダイヤ「手続きが評価される際、評価結果を戻す以外の影響が発生すること・・・変数の値が変更される、コンソールに何か出力される、などですわ」
果南「それとbeginとどう関係が?」
ダイヤ「副作用のある手続きは一般に評価結果を戻しません。正確には、仕様上未定義になっているので戻り値が処理系に依存します。たとえば」

ダイヤ「この(set! x 74)が何を戻すかは、実はどこにも定義されていません。Gaucheで試してみると74が返ってきますが、この結果にも何の保証もありませんわ」
花丸「それ、どうしてちゃんと決めないのかな?」
ダイヤ「確かに言語によっては、例えばJavaScriptなら未定義値を表すundefinedみたいなキーワードが用意されていますわね。ですがSchemeの場合は、本質的に意味のない値に意味を持たせないために『未定義』で通していると聞きましたわ」
果南「set!は変数の値を変更するだけだから、本来値を返す必要はない、けど言語仕様上何か返さないといけないから、それは適当にやってね、ってことか」
ダイヤ「さて前説はここまでですわ。こういう評価結果が未定義の手続きを他の手続きの中で使う、というケースを考えてみましょう」

ダイヤ「まず、これは問題ないですわね?」
花丸「普通の足し算ずら」
ダイヤ「ではここで、ありがちなインクリメント処理を加えてみましょう。ループの中で変数の値を増やしながら処理していくイメージですが、繰り返しはまだやっていませんので、とりあえずyを1増やしてから足し算するようにしてみます」
果南「C言語系なら++yみたいなやつだね」
ダイヤ「ピュアなCにインクリメント演算子ありましたかしら?」
果南「いやまあ、そこはC++とかJavaとか・・・」

ダイヤ「Gaucheだと期待通り61になってしまうのですが・・・先ほど話した通り、set!の結果は未定義ですから、これは偶然動いているだけということになります。ですので、支離滅裂な値が返ってくるものとして話を進めましょう」
花丸「そうなると、ちゃんと足し算できなくなるずら」
ダイヤ「そこでbeginを使ってみます」

ダイヤ「beginの評価結果は、その中の最後の評価結果、この場合はyになります。まずbeginの最初の引数、(set! y (+ y 1))が評価され、yの値が1増えます。そして、beginの最後の引数、yが評価結果となります」
果南「なるほど、それで1増えた21がbeginの結果になるから、合計61ってちゃんと計算できるわけだ」
ダイヤ「例えは少しわかりにくかったかもしれませんけれど、複数の手続きを1つにまとめる、という点と、最後の評価結果がbegin自身の評価結果になる、という点を理解すればまずは大丈夫ですわ」


ダイヤ「手っ取り早くと言ったわりには長くなってしまいましたが、果南さんの出番確保のため神頼みとまいりましょう」
花丸「うちは仏ずら」
果南「いやもう、神でも仏でも悪魔でもなんでもいいから・・・」
善子「話は聞かせてもらったわ!」
善子「←だからヨハネよっ!」
花丸「なんで善子ちゃんがここにいるずら・・・」
善子「果南のたっての頼みとあっては、この堕天使ヨハネ、見過ごすわけにはいかないわね」
ダイヤ「花丸さん、あの頭の羽根引っこ抜きなさい」
花丸「ううん、善子ちゃんは、このままでいいずら」
果南「ああもう、わかったよ。じゃあそこに立ってて」
善子「ふっ、いいわよ。どんな願いでもこのヨハネが、万能の願望器の力をもって・・・」
果南「来週も出番がありませんように」
善子「な、なんでよーーーーーーーっ!?」


LINEで送る
Pocket


返信を残す

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