プログラミング原人の進化ログ

プログラミング原人の進化論

オレ プログラミング ベンキョウ スル。マナンダ コト カク。

【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」 川合史郎訳 オライリー・ジャパン