【Common Lisp】構造体の基本
lispの構造体の勉強をしたのでメモを残しておきます。基本的な使い方です。
構造体とは
データ型の1つ。複数の属性を持つオブジェクトをうまく表現することができます。
属性のことをスロットと呼びます。
構造体を作る
defstructコマンドで宣言します。
CL-USER> (defstruct person name age waist-size favorite-color) PERSON
スロットname, age, waist-size, favorite-colorを持つ構造体personを定義しました。 構造体は1つの型であり、構造体personの定義に従って構造体を作る(実体化する)と、personという型のオブジェクトを作ったことになります。
実体化するには、次のようにします。
CL-USER> (defparameter *bob* (make-person :name "Bob" :age 35 :waist-size 32 :favorite-color "blue")) *BOB* CL-USER> *bob* #S(PERSON :NAME "Bob" :AGE 35 :WAIST-SIZE 32 :FAVORITE-COLOR "blue")
defstructコマンドを用いて構造体を定義すると、上のように、make-構造体名 という関数が使えるようになります。各スロットの値をキーワード引数を使って指定します。 頭についている #S はそのオブジェクトが構造体であることを示します。
インスタンスを次のように作ることもできます。上で見たオブジェクトの出力と同じ表記を用いることができます。
(defparameter *that-guy* #S(person :name "Bob" :age 36 :waist-size 32 :favorite-color "blue")) *THAT-GUY*
スロットにアクセス・変更する
各スロットにアクセスする関数も、defstructによって作られます。例えば次のようにアクセスします。
CL-USER> (person-age *bob*) 35
値を変更するには次のようにします。
CL-USER> (setf (person-age *bob*) 36) 36 CL-USER> (person-age *bob*) 36
スロットの初期値を設定する
スロットにデフォルトの値を与えることができます。
CL-USER> (defstruct bike (distance 0)) BIKE CL-USER> (defparameter *bike* (make-bike)) *BIKE* CL-USER> (bike-distance *bike*) ;; 走る前 0 CL-USER> (setf (bike-distance *bike*) 100) 100 CL-USER> (bike-distance *bike*) ;; 走行後 100
上の例ではbike構造体で走行距離distanceの初期値を0に設定しています。
構造体と型
構造体を定義すると、それは新しい型を作ったことになります。上の例ではbikeという型ができます。
CL-USER> (type-of *bike*) BIKE
参考
コンラッド・バルスキ(2013)「Land of Lisp」 川合史郎訳 オライリー・ジャパン