Accessor GET

UP


Accessor GET

Accessor GET

構文

get symbol indicator &optional default => value
(setf (get symbol indicator &optional default) new-value)

引数と戻り値

symbol - シンボル
indicator - オブジェクト
default - オブジェクト。デフォルトはnil
value - もしプロパティが存在していたらその値のオブジェクトを、 それ以外の場合はdefault
new-value - オブジェクト

定義

getは、symbolのプロパティリストから indicatorと同一の標識のプロパティを探し、 対応するプロパティの値を返却します。 標識に対して複数のプロパティがあるときは、 getは最初のプロパティを使います。 標識に対するプロパティが存在しないときは、 defaultが返却されます。

getsetfは、symbolのプロパティリストに、 すでに標識が存在するときは、 新しいオブジェクトを関連付けます。 もし存在しなかったときは、新しい関連を作成します。 標識に対して複数のプロパティがあるときは、 getsetfは最初のプロパティにnew-valueを関連付けます。 getフォームをsetfplaceで使うとき、 引数defaultが通常の左から右へ評価されるルールに従って評価され、 valueは無視されます。

例文

(defun make-person (first-name last-name)
  (let ((person (gensym "PERSON")))
    (setf (get person 'first-name) first-name)
    (setf (get person 'last-name) last-name)
    person)) =>  MAKE-PERSON
(defvar *john* (make-person "John" "Dow")) =>  *JOHN*
*john* =>  #:PERSON4603
(defvar *sally* (make-person "Sally" "Jones")) =>  *SALLY*
(get *john* 'first-name) =>  "John"
(get *sally* 'last-name) =>  "Jones"
(defun marry (man woman married-name)
  (setf (get man 'wife) woman)
  (setf (get woman 'husband) man)
  (setf (get man 'last-name) married-name)
  (setf (get woman 'last-name) married-name)
  married-name) =>  MARRY
(marry *john* *sally* "Dow-Jones") =>  "Dow-Jones"
(get *john* 'last-name) =>  "Dow-Jones"
(get (get *john* 'wife) 'first-name) =>  "Sally"
(symbol-plist *john*)
>  (WIFE #:PERSON4604 LAST-NAME "Dow-Jones" FIRST-NAME "John")
(defmacro age (person &optional (default ''thirty-something)) 
  `(get ,person 'age ,default)) =>  AGE
(age *john*) =>  THIRTY-SOMETHING
(age *john* 20) =>  20
(setf (age *john*) 25) =>  25
(age *john*) =>  25
(age *john* 20) =>  25

副作用

なし。

影響

なし。

例外

symbolがシンボルではないとき、 型type-errorのエラーが発生します。

参考

getf, symbol-plist, remprop

備考

(get x y) ==  (getf (symbol-plist x) y)

getindicatorのテストに eqlではなくeqを用いるため、 移植しやすいコードとして、 indicatorに数と文字を使うことは推奨されません。 そのため、そのようなindicatorを使ったときの効果は 実装依存です。

getを使用して、存在しないプロパティと 値がデフォルトであるプロパティを区別する方法はありません。 しかし、get-propertiesを利用できます。


TOP, Github