これらの関数は、シンボルに付けられた属性に作用するように、標準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を使うことに注意せよ。