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 を埋め込むので、
(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 ;ぉー