は、構造物は、剛性と低レベルのレコードとして考えられています。彼らは派手な動的機能を持っていません。
構造でできることは、別の構造タイプを継承する新しい構造タイプを定義することです。利用できる単一の継承があります。
動的拡張性を処理するには、プロパティリストスロットを構造体に追加するのが一般的です。ジョシュアの答えを見てください。
次に、複数の継承を提供するCommon Lisp Object Systemがあり、実行時にクラスを変更することができます。したがって、クラスにスロットを追加すると、そのクラスのインスタンスが自動的に更新されます。オブジェクトのクラスを変更することもできます。スロットは追加または削除される可能性があります。それでも、通常、クラスのすべてのインスタンスは同じスロットセットを持ちます。ここでも、プロパティリストを持つスロットを追加して拡張性のために使用することができます。
Common Lispには、インスタンスベースごとにスロットを簡単に追加できるオブジェクトシステムがあります。しかし、それはかなり強力ですので、通常はそれを使うだけでは大変です。
CLOSとメタオブジェクトプロトコルを使用すると、非表示にすることができます。ここで私はLispWorksを使用しています:
私達は私達の性質のためのミックスインクラスを定義します。
(defclass property-mixin()
((plist :initform nil))
#+lispworks
(:optimize-slot-access nil))
設定とプロパティを読み:
(defmethod set-property ((object property-mixin) key value)
(setf (getf (slot-value object 'plist) key) value))
(defmethod get-property ((object property-mixin) key)
(getf (slot-value object 'plist) key))
は、今、私たちはSLOT-VALUE
受け入れて私たちのプロパティ名を作成する方法を書きます:
(defmethod (setf clos:slot-value-using-class)
(value (class standard-class) (object property-mixin) slot-name)
(declare (ignorable class))
(if (slot-exists-p object slot-name)
(call-next-method)
(progn
(set-property object slot-name value)
value)))
(defmethod clos:slot-value-using-class ((class standard-class)
(object property-mixin)
slot-name)
(declare (ignorable class))
(if (slot-exists-p object slot-name)
(call-next-method)
(get-property object slot-name)))
例。
(defclass automobile (property-mixin)
((company :initarg :company)
(motor :initarg :motor))
#+lispworks
(:optimize-slot-access nil))
今インスタンス:我々は2つのスロットに自動車のクラスを定義
CL-USER 45 > (setf a6 (make-instance 'automobile :company :audi :motor :v6))
#<AUTOMOBILE 402005B47B>
私たちは、通常のスロット値を得ることができますのはないスロットに書いてみましょう
CL-USER 46 > (slot-value c1 'motor)
:V6
を存在しますが、プロパティリストに追加されます:
CL-USER 47 > (setf (slot-value a6 'seats) 4)
4
我々は戻って値を取得することができます
いくつかの回、あなたが構造や必要だと思うとき:
CL-USER 48 > (slot-value c1 'seats)
4
ありがとうございます、これはほとんど私が探しているものです。しかし、あなたが置いたように、プロパティリストを 'node'の他のスロットとして持つ方法はありますか?言い換えれば、 '(SOME-LABEL :(1つの1:2)==(SOME-LABEL:ONE 1:TWO 2)'の代わりに ' ONE 1:TWO 2)) '? –
要するに、いいえ。 [Rainerの答え](http://stackoverflow.com/a/17556349/1281433)では、一般的な構造についてより深く掘り下げていますが、構造は固定数のスロットを持つ点が重要です。 '(:type list)'オプションで 'defstruct'を使って" poor man's records "を作成することはできますが、まだ固定数のスロットしか持たないでしょう(つまり、リストは固定数要素)。本当にあなたはプロパティリストがほしいと思うように思えます。 –
ええ、Rainerの答えを読んで、私はそれが私がやっていることに必要な以上の火力だと思う。助けてくれてありがとう、みんな! –