これらの関数は、シンボルに付けられた属性に作用するように、標準Emacs
Lisp関数get
やput
を増加させる。特定のシンボルに
付けられていない、ファーストクラスデータ構造としての属性リストに
作用する関数もある。
この関数はget
に似ているが、属性がみつからない場合、
default引数が戻り値を提供する点が異なる(Emacs Lispのget
は
常にnil
を既定として使う; このパッケージのget*
はCommon
Lispのget
と同等である)。
get*
関数はsetf
可能である; このように使われる場合、
default引数は許されるが無視される。
この関数は、symbolの属性リストから、propertyのための
エントリを取り除く。属性が実際に見つかって取り除かれた場合は真の値を
戻し、そのような属性がない場合はnil
を戻す(この関数は、
get
はdefaultを許さなかったので、属性が
見つからないこととその値がnil
である属性を区別することが
難しかったために、おそらく元のEmacsから省略されたのだろう;
したがって、属性をnil
へ設定することは、ほとんどの用途で
remprop
と十分に近かった)。
この関数は、リストplaceを属性リスト、すなわち属性名と値の
交替するリストであるかのように走査する。propertyとeq
であるplaceの偶数番目の要素が見つかった場合、続く奇数番目の
要素が戻される。さもなければ、default(既定が与えられていない
場合はnil
)が戻される。
特に、
(get sym prop) ≡ (getf (symbol-plist sym) prop)
getf
をsetf
場所として使うことは正しい。その場合、
place引数はそれ自身正しいsetf
場所でなければならない。
default引数は、もしあれば、このコンテキストでは無視される。その
効果は、propertyに対応するリスト中の値セルを(setcar
によって)変えるか、属性がまだ存在しない場合は、新しい属性と値の対を
リスト上にコンスする。
(put sym prop val) ≡ (setf (getf (symbol-plist sym) prop) val)
get
やget*
関数もまたsetf
可能である。default
が無視されるという事実はときには有用になり得る:
(incf (get* 'foo 'usage-count 0))
ここでは、シンボルfoo
のusage-count
属性が、存在する場合は
1だけ増やされ、そうでなければ1(1だけ増やされた0)が設定される。
setf
フォームとして使われない場合、getf
は単に正規の関数で
あり、そのplace引数は実際にどんなLisp式であってもよい。
このマクロは、placeに格納された属性リストから、propertyの
属性と値の対を取り除く。placeは任意のsetf
可能な場所の
式である。属性が見つかった場合は真を戻す。propertyがたまたま
リストの先頭の場合、実際に(setf place (cddr place))
を行なうが、もっと後で生じた場合は、属性と値のセルをつなぐために単に
setcdr
を使うことに注意せよ。