defstruct(構造体定義) について
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>
参考
moremagic
2018-11-09