% Accessor GETF
Accessor GETF
getf plist indicator &optional default => value
(setf (getf place indicator &optional default) new-value)
plist - プロパティリスト
place - place、プロパティリストの値
indicator - オブジェクト
default - オブジェクト、デフォルトはnil
value - オブジェクト
new-value - オブジェクト
getfは、plistのプロパティリストから
indicatorと同一の標識のプロパティを探し、
対応するプロパティの値を返却します。
標識に対して複数のプロパティがあるときは、
getfは最初のプロパティを使います。
標識に対するプロパティが存在しないときは、
defaultが返却されます。
getfのsetfは、placeに保存されているプロパティリストに、
すでに標識が存在するときは、
新しいオブジェクトを関連付けます。
もし存在しなかったときは、新しい関連を作成します。
標識に対して複数のプロパティがあるときは、
getfのsetfは最初のプロパティにnew-valueを関連付けます。
getfフォームをsetfのplaceで使うとき、
引数defaultが通常の左から右へ評価されるルールに従って評価され、
valueは無視されます。
getfのsetfは、
place自身の値を書き込むのか、
placeに保存されているリスト構造のcarとcdrの
どの部分でも修正することが許されます。
(setq x '()) => NIL
(getf x 'prop1) => NIL
(getf x 'prop1 7) => 7
(getf x 'prop1) => NIL
(setf (getf x 'prop1) 'val1) => VAL1
(eq (getf x 'prop1) 'val1) => true
(getf x 'prop1) => VAL1
(getf x 'prop1 7) => VAL1
x => (PROP1 VAL1)
;; この例は実装による変化が許されている
(setq foo (list 'a 'b 'c 'd 'e 'f)) => (A B C D E F)
(setq bar (cddr foo)) => (C D E F)
(remf foo 'c) => true
foo => (A B E F)
bar
=> (C D E F)
OR=> (C)
OR=> (NIL)
OR=> (C NIL)
OR=> (C D)
なし。
なし。
なし。
get,
get-properties,
setf,
5.1.2.2. placeとしての関数呼び出しフォーム
getfを使用した場合、
プロパティフォームの不在と
デフォルト値の区別をつけることができません。
get-propertiesをご確認ください。
setfの状況下で、
getfのdefault引数を指定することは、
あまり興味が持たれません。
これが重要になるのは、pushやincfのようなマクロであり、
place引数で読み込みと書き込みの両方が求められるときです
そのような文脈において、default引数は、
読み込みの状況によって供給され、
それは書き込む状況によっても同様に
構文として有効でなければなりません。
例えば下記の通り。
(let ((plist '()))
(incf (getf plist 'count 0))
plist) => (COUNT 1)