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)