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
(=> (PROP1 VAL1)
x
;; この例は実装による変化が許されている
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
(=> (A B E F)
foo
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))
(=> (COUNT 1) plist)