list とか vector を使う structure

defstruct の NAME-AND-OPTIONS で :type を指定するとなんかできるっぽいので。

:type を指定する

インスタンスが structure のインスタンスではなくて、指定された type になる。type は sequence の subtype であればいいみたい。

;;; 実体が list な structure
(defstruct (example%1 (:type list))
  foo bar baz)
=> #<structure-definition: example%1>

(setq * (make-example%1 :foo 1 :bar 2 :baz 3))
=> (1 2 3) ;どう見てもただの list です

(type-of *)
=> cons

(example%1-foo *)
=> 1

(example%1-bar *)
=> 2

(example%1-p *)
=> nil

(typep * 'example%1)
=> nil ;これはちょっと痛いような
;;; 実体が vector な structure
(defstruct (example%2 (:type vector))
  foo bar baz)
=> #<structure-definition: example%2>

(setq * (make-example%2 :foo 1 :bar 2))
=> #(1 2 nil) ;どう見てもただの vector です

(type-of *)
=> simple-vector

(example%2-foo *)
=> 1

(setf (example%2-baz *) :baz)
=> :baz

*
=> #(1 2 :baz)

(typep * 'example2)
=> nil

:named を指定する

先頭に structure name を埋め込むので、-p を使えるようになる。

(defstruct (example%3 (:type list) :named)
  foo bar)
=> #<structure-definition: example%3>

(setq * (make-example%3 :foo "hello" :bar "world"))
=> (example%3 "hello" "world") ;car が structure の名前になった

(typep * 'example%3)
=> nil ;ぇー

(example%3-p *)
=> t ;ぉー