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を利用できます。