Part6: シンボル

果南「一昨日は千歌の誕生日だったんだよね」
花丸「おめでとうずらー!」
ダイヤ「あなたたち、千歌さんの誕生日も良いですけど・・・昨日今日が何の日かお分かりですの?」
花丸「ちなみに今日は8/3ずら」
果南「いや、えーと・・・」
ダイヤ「ぶっぶーっ!ですわ!」
花丸「なんかのスイッチ入っちゃったずら・・・」
ダイヤ「8/3はμ’sのリーダー高坂穂乃果の生誕祭!そして8/2はμ’sのプロデューサー、ランティスのキサラPの生誕祭ですわ!!」
果南「穂乃果ちゃんはともかく、キサラさんの誕生日なんて普通知らないって・・・」


ダイヤ「さて今回は、シンボルのお話をします。シンボルは変数や関数の識別子として使われる、ちょっと変わったデータ型ですわ」
花丸「なんかピンとこないずら」
ダイヤ「変数や関数をまだ扱っていないですから仕方ないですわね。今の時点では、文字列をアドレスで管理するデータ型と考えてください」
果南「それはそれでわかんないんだけど・・・」
ダイヤ「Schemeが扱うあらゆるデータは、メモリ上のどこかに格納されます。そのデータがどこにあるかを示すのがアドレスで、例えばeq?関数で比較ができたりしますわ」
果南「んで、普通の文字列とは何が違うの?」
ダイヤ「そうですわね、例えば・・・」

ダイヤ「同じ"Aqours"という文字列が2つあっても、eq?関数の結果は#fになる、つまり同じ値を持った2つの文字列が別々に存在するということですわ」
花丸「1つ目の"Aqours"と2つ目の"Aqours"はメモリ上の別の場所にある別のものっていうこと・・・かな」
ダイヤ「そういうことですわ。ですが、シンボル'Aqoursを比較すると#tになる、つまり2つのシンボルは同じ場所にある同じデータを示しているということです」
果南「同じ名前のシンボルは同じアドレスを持つことが保証されてる、つまり同一性が保証されてる、と」
ダイヤ「妙に飲み込みが早いですわね・・・まあ良いですわ。この性質を利用して、シンボルは識別子として使われます。また、文字列と比べて比較の速度が速いので連想リストやハッシュ表のキーにも使われますわ」


ダイヤ「シンボルの書き方ですけれど、先ほど出てきたとおり'Aqoursのように書きます。これは厳密には(quote Aqours)のショートカットですわ」
花丸「quote?」
ダイヤ「後々、Aqoursという名前の変数を定義するのに(define Aqours 9)のような書き方をすることになります。そのあたり含めREPLで試してみると」

ダイヤ「quoteしないAqoursは変数名として解釈されます。ですから、値をバインドしていない状態ではエラーとなりますわ」
果南「変数の値を見に行こうとしてるんだね」
ダイヤ「これに対して、(quote Aqours)あるいは'Aqoursはシンボルとして扱われますから、シンボル自体の値を参照できますわ」
花丸「む、難しいずら・・・」
ダイヤ「実はメタプログラミングに近い話ですから、難しいのは分かりますわ。今この場で完全に理解しなくても大丈夫でしょう」


ダイヤ「シンボルは文字列と相互変換が可能になっていますわ」

ダイヤ「使いどころは、またいずれ・・・といったところですわね」


ダイヤ「今回は少し感覚を掴みにくい内容でしたけれど、次回のベクタは理解しやすいと思いますわ」
果南「配列っぽいやつかな」
ダイヤ「そうですわね。そしてその後は、Schemeの肝であるリストが控えていますわ」


LINEで送る
Pocket


返信を残す

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