Part8: コンスセル

ダイヤ「今回からリストの解説に入ります。Schemeに限らずLisp語族の根幹になる概念ですから、耳の穴かっぽじってよく聞くとよいですわ」
果南「うわー・・・」
ダイヤ「・・・失礼、私にあるまじき発言でしたわね」
花丸「いや、わりと平常運転だと思うずら」


ダイヤ「はじめにコンスセル(cons cell)というものの話から始めます。簡単に言うと2つのデータをペアにしたもの、ですわ」
果南「2要素のベクタみたいなもの?」
ダイヤ「いえ、もう少し特別な性質を持っています。まずはコンスセルを作るコードを見てみますわね」

ダイヤ「REPLで実行すると、("you" . "riko")という形の結果が得られるのが分かると思います。これがコンスセルとかドット対と呼ばれるものですわ」
花丸「よーりこかあ」
ダイヤ「人の趣味に口を出さないでいただきたいですわ!」
果南「で、#("you" "riko")と何が違うの?」
ダイヤ「メモリの中身の話になるので、プログラミング初心者は一旦聞き流していただいてよいかとは思うのですけど・・・メモリ上のデータの持ち方に差がありますわ」
果南「ちょっと込み入った話になりそうだね」
ダイヤ「ベクタの場合は、メモリ上に連続した領域を確保してそこにデータが格納されます。一方コンスセルは、格納されるのはデータではなく、データのアドレスになりますわ」
果南「ポインタ2つがペアになってる」
ダイヤ「話が早いですわね」
花丸「マルにはちょっと難しいずら」
ダイヤ「大きい本棚に目当ての本が2冊あって、ベクタだったら空いてるところに2冊並べる、コンスセルは2冊がそれぞれ上から何段目の左から何番目にあるか覚えておく、ですわ」
花丸「おお、なんとなくわかったずら!」


ダイヤ「コンスセルの1番目のセルをcar、2番目のセルをcdrと呼びます。それぞれcarcdr関数で取り出せますわ」

花丸「また'付いてるずら」
ダイヤ「シンボルやベクタと同様、コンスセルやリストも自己評価的ではないからです」
果南「ベクタと違って、'付けないとGaucheでもエラーになるね」


ダイヤ「このコンスセルは、複数繋げることができますわ」

ダイヤ「("chika" "you" . "riko")という結果になるはずですが、これは("chika" . ("you" . "riko"))の省略形です。ここでコンスセルは2つ、1つは("you" . "riko")ですが、もう1つのcarcdrは・・・はい、花丸さん!」
花丸「ずら!?・・・なんかマルばっかりな気がするずら・・・ええと、car"chika"で、cdrは、えーと・・・("you" . "riko")?」
ダイヤ「正解ですわ。つまり、1つ目のコンスセルのcdrが2つ目のコンスセルを指している、こうやって数珠つなぎにできるというわけです」
果南「これ、たとえば"you"が欲しいとしたら、(car (cdr '("chika" "you" . "riko")))みたいに掘っていけばいいのかな」
ダイヤ「それでも構いませんけど、少し楽な方法もありますわね」

ダイヤ「cadrcdrcarcddrcdrcdrですわ。caddrとかcdaddrとかまで結構頑張ってくれるみたいですわね」
花丸「ちょっと頭痛いずら」


ダイヤ「ここまで文字列を扱ってきましたが、コンスセルにはどんな値でも入れることができます、より正確にはどんな値のアドレスでも扱うことができます」

ダイヤ「全部妥当なコンスセルができますわ」


ダイヤ「ここまでがリストを理解する下準備ですわ。リストはこのコンスセルから構成されるデータ構造です」
花丸「コンスセルだけだと何のためにあるのかよくわかんないずら・・・」
ダイヤ「次回扱うリストを考える上で必要となる知識ですわ」
果南「しかしマル、最近遠慮なくずらずら言い始めたね」
花丸「最初は抑えてたずら・・・凛ちゃんだってそんなににゃーにゃー言ってないからって。けど、アニメの台本に情け容赦なくずらずら書いてあるから、開き直ったずら・・・」
果南「あるよね、アニメでキャラ変って・・・あるよね・・・」
ダイヤ「果南さんが言うと重みが違いますわね・・・」


LINEで送る
Pocket


返信を残す

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