最近CommonLispの勉強をはじめた.
その中で可変長配列を作成したいなと思った時に案外ややこしかったので備忘録を書いておく.
Lisperの方たちどころか,ちょっと勉強した方にとっては当たり前かもしれないがあくまで自分のために.
#可変長配列の生成
可変長の配列は,JavaならArrayListを使って特に患うことなく定義できるが,CommonLispの場合は少しだけややこしいような気がする.
とは言っても大して難しいものでもない.以下のコードで作成できる.
CL-USER> (make-array 5 :fill-pointer 0 :adjustable t)
各要素を簡単に解説する.
##make-array
この関数は名前の通り,配列を作る関数.
固定長の配列を作るだけなら以下のように,配列の大きさと初期値を渡すだけでいい.
CL-USER> (make-array 5 :initial-element nil)
1つ目の引数が配列の大きさで,2つ目にあるキーワードが初期値を設定するためのキーワード,3つ目の引数がその初期値.
よって上のコードでは要素数5でその全てがnilである配列が生成される.
####:fill-pointer
このキーワード引数は次に要素を追加する位置(インデックス)を表す.
初めのコードでは0番目,つまり一番初めの位置に挿入することを意味している.
配列にデータを挿入する関数は後ほど.
###:adjustable
このキーワード引数が今回の可変長配列作成のキモ.
というかこれだけ知ってれば問題ないのか.
tに設定すれば可変長の配列を定義できる.
#可変長配列への要素の追加
上のようなコードで生成した配列に要素を追加するにはvector-push-extend関数を用いる.
逆に配列から要素を取り出すにはvector-popを用いる.
vector-pushという関数も存在するが,それらは要素数が最初に定義した数より大きい場所には追加できない.
-extend がついていると元々定義していた要素数を超過した際に自動的に配列を拡張してくれる.
CL-USER> (defparameter *sample-vector* (make-array 5 :fill-pointer 0 :adjustable t))
*SAMPLE-VECTOR*
CL-USER> (vector-push-extend 'sample1 *sample-vector*)
0
CL-USER> *sample-vector*
#(SAMPLE1)
CL-USER> (vector-pop *sample-vector*)
SAMPLE1
これだけ.