Accessor GET
get
symbol indicator &optional default => value
(setf
(get
symbol indicator &optional default) new-value)
symbol - シンボル
indicator - オブジェクト
default - オブジェクト。デフォルトはnil
。
value - もしプロパティが存在していたらその値のオブジェクトを、 それ以外の場合はdefault。
new-value - オブジェクト
get
は、symbolのプロパティリストから indicatorと同一の標識のプロパティを探し、 対応するプロパティの値を返却します。 標識に対して複数のプロパティがあるときは、 get
は最初のプロパティを使います。 標識に対するプロパティが存在しないときは、 defaultが返却されます。
get
のsetf
は、symbolのプロパティリストに、 すでに標識が存在するときは、 新しいオブジェクトを関連付けます。 もし存在しなかったときは、新しい関連を作成します。 標識に対して複数のプロパティがあるときは、 get
のsetf
は最初のプロパティにnew-valueを関連付けます。 get
フォームをsetf
のplace
で使うとき、 引数defaultが通常の左から右へ評価されるルールに従って評価され、 valueは無視されます。
defun make-person (first-name last-name)
(let ((person (gensym "PERSON")))
(setf (get person 'first-name) first-name)
(setf (get person 'last-name) last-name)
(=> MAKE-PERSON
person)) defvar *john* (make-person "John" "Dow")) => *JOHN*
(=> #:PERSON4603
*john* defvar *sally* (make-person "Sally" "Jones")) => *SALLY*
(get *john* 'first-name) => "John"
(get *sally* 'last-name) => "Jones"
(defun marry (man woman married-name)
(setf (get man 'wife) woman)
(setf (get woman 'husband) man)
(setf (get man 'last-name) married-name)
(setf (get woman 'last-name) married-name)
(=> MARRY
married-name) "Dow-Jones") => "Dow-Jones"
(marry *john* *sally* get *john* 'last-name) => "Dow-Jones"
(get (get *john* 'wife) 'first-name) => "Sally"
(symbol-plist *john*)
(> (WIFE #:PERSON4604 LAST-NAME "Dow-Jones" FIRST-NAME "John")
defmacro age (person &optional (default ''thirty-something))
(get ,person 'age ,default)) => AGE
`(=> THIRTY-SOMETHING
(age *john*) 20) => 20
(age *john* setf (age *john*) 25) => 25
(=> 25
(age *john*) 20) => 25 (age *john*
なし。
なし。
symbolがシンボルではないとき、 型type-error
のエラーが発生します。
get x y) == (getf (symbol-plist x) y) (
get
はindicatorのテストに eql
ではなくeq
を用いるため、 移植しやすいコードとして、 indicatorに数と文字を使うことは推奨されません。 そのため、そのようなindicatorを使ったときの効果は 実装依存です。
get
を使用して、存在しないプロパティと 値がデフォルトであるプロパティを区別する方法はありません。 しかし、get-properties
を利用できます。