% Accessor GET
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)
person)) => MAKE-PERSON
(defvar *john* (make-person "John" "Dow")) => *JOHN*
*john* => #:PERSON4603
(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)
married-name) => MARRY
(marry *john* *sally* "Dow-Jones") => "Dow-Jones"
(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
(age *john*) => THIRTY-SOMETHING
(age *john* 20) => 20
(setf (age *john*) 25) => 25
(age *john*) => 25
(age *john* 20) => 25
なし。
なし。
symbolがシンボルではないとき、
型type-error
のエラーが発生します。
(get x y) == (getf (symbol-plist x) y)
get
はindicatorのテストに
eql
ではなくeq
を用いるため、
移植しやすいコードとして、
indicatorに数と文字を使うことは推奨されません。
そのため、そのようなindicatorを使ったときの効果は
実装依存です。
get
を使用して、存在しないプロパティと
値がデフォルトであるプロパティを区別する方法はありません。
しかし、get-properties
を利用できます。