ダイヤ「初っぱなの小咄もネタがなくなってきましたわね」
花丸「5話の果南さんかわいかったずら・・・とか」
果南「・・・マル、おねーさんさすがに怒るよ?」
花丸「ひっ・・・ご、ごめんなさい・・・」
ダイヤ「果南さん、それは花丸さんなりに気を遣ったんですわよ」
ダイヤ「では今回はベクタというものを見てみます。まあ、ぶっちゃけ配列ですわね」
果南「データに順序をつけて並べたもの、ってやつだね」
ダイヤ「ベクタは1次元の固定長配列、つまり後から長さを変更したりはできません」
1 2 |
(vector "dia" "kanan" "maru") '#("dia" "kanan" "maru") |
ダイヤ「書き方は2つありますが、どちらも同じベクタの記法ですわ」
果南「これで3要素のベクタ、と・・・」
ダイヤ「ベクタにできることは単純で、要素を取り出すことと、要素を置き換えることくらいですわ」
1 2 3 4 |
(vector-ref '#("dia" "kanan" "maru") 1) ; "kanan" (define azalea '#("dia" "kanan" "maru")) (vector-set! azalea 2 "hanamaru") ; azaleaは#("dia" "kanan" "hanamaru") になる |
花丸「シンボルみたいに'
が付いてるずら」
ダイヤ「ベクタはシンボルと同じように『自己評価的ではない』という言い方をしますが、ともかくリテラルとしてベクタを書く場合は'
が必要になりますわ」
果南「これquote
でもいいのかな」
ダイヤ「(quote #("dia" "kanan" "maru"))
でも構いませんが、長いですしあまり使いませんわね」
ダイヤ「ただ、このクォートについては処理系によって動作に差があります。Schemeの本来の仕様では今説明したようにクォートが必要ですが、Gaucheではクォートなしでも動きますわ」
果南「処理系による差、って最初に言ってたのはこういうことなんだね」
花丸「とりあえずクォートしておく方がよさそうずら」
ダイヤ「要素数を指定して空のベクタを作ることもできます」
1 |
(make-vector 3) ; #(#<undef> #<undef> #<undef>) |
ダイヤ「これに対してvector-set!
で値を入れていく使い方ですわね」
ダイヤ「ここまでの例では文字列のベクタを扱ってきましたが、データの種類に制約はありませんわ」
1 |
#(25 'nico "にー") |
花丸「にこちゃんの汎用性」
ダイヤ「さすにこですわ」
果南「ダイヤはそういう知識どっから仕入れてくるのさ・・・」
ダイヤ「さて、次回からがこのScheme入門の要ですわ。リストについて、何回かに分けて見ていきます」
花丸「ベクタと違うずら?」
ダイヤ「一見似たように見えますが、リストはLisp語族の基礎にして根幹、宇宙にも等しい・・・」
果南「はいはい、話半分に聞いとけばいいからね」