common lisp の構造体の使い方がやっとわかったのでメモ

  • こんな感じで構造体を作ることができる
? (defstruct human
  (height 0)
  (weight 0))
HUMAN

? (make-human) ;; デフォルトのコンストラクタ名は make-<構造体名>
#S(HUMAN :HEIGHT 0 :WEIGHT 0)

? (make-human :height 999)
#S(HUMAN :HEIGHT 999 :WEIGHT 0)

? (make-human :weight 999)
#S(HUMAN :HEIGHT 0 :WEIGHT 999)

? (make-human :height 1 :weight 2)
#S(HUMAN :HEIGHT 1 :WEIGHT 2)
  • 引数 :constructor で 構造体を生成する関数名を指定することができる
?  (defstruct (keymap (:constructor aaa)) (a 1))
KEYMAP

? (aaa)
#S(KEYMAP :A 1)

? (aaa :a 100)
#S(KEYMAP :A 100)

? (make-keymap) ;; デフォルトの構造体コンストラクタは使えない
> Error: Undefined function MAKE-KEYMAP called with arguments () .
> While executing: CCL::TOPLEVEL-EVAL, in process listener(1).
> Type :GO to continue, :POP to abort, :R for a list of available restarts.
> If continued: Retry applying MAKE-KEYMAP to NIL.
> Type :? for other options.
1 >
  • 引数 :print-function で渡した関数で表示方法を規定することができる
(defun print-hoge (hoge stream depth)
  (format stream "#hoge<~Ahoge>" (hoge-hoge hoge)))
;Compiler warnings :
;   In PRINT-HOGE: Undefined function HOGE-HOGE
;   In PRINT-HOGE: Unused lexical variable DEPTH
PRINT-HOGE

?  (defstruct (hoge (:print-function print-hoge)) (hoge 0))
HOGE

? (make-hoge)
#hoge<0hoge>

? (make-hoge :hoge 1000)
#hoge<1000hoge>

参考

qiita.com