Lispの構造体

かっこつけてちょっと大規模なプログラムを書きたくなったので,機械学習の初歩的なプログラムを実装しようとLispでかりかりしている.距離関数などの記述は非常に楽だなぁと思う.


データのインスタンスをどうやって書こうと思っていて構造体があれば楽だな,
と思ったらあった.


Common Lispでは構造体はdefstructで設計する.

(defstruct <struct name>
  (<slot name> [<default value>])
  ...)

default値は省略された場合にはnilが入るらしい.
というわけでインスタンスの構造体をつくってみた.

(defstruct instance
	(attributes nil)
	(label nil))

defstructすると以下の関数が自動生成される.

  • コンストラクタ make-
  • アクセサ -
  • コピー関数 copy-
  • データ型の判定述語 -p

やってみよう

;; 構造体の生成
(setq ins1 (make-instance :label 'positive :attributes '(4 6 4 9)))
=> #S(instance label positive attributes (4 6 4 9))

;; 構造体の値の確認・変更
(instance-label ins1)
=> positive
(instance-attributes ins1)
=>(4 6 4 9)

(setf (instance-label ins1) 'negative)
(instance-label ins1)
=> negative

;; 構造体のコピー
(setq ins2 (copy-instance ins1))
=> #S(instance label negative attributes (4 6 4 9))
(instance-p ins2)
=> t

さらに便利になりますた!

詳しくはM. Hiroiさんのページを参照