setf

Title
setf
Type
Macro
Arguments
setf {PLACE NEW-VALUE}*
Package
lisp
Section
変数と定数
File
setf.l
このマクロは、変数にアクセスし、その値を変更するために使われます。従来用
いられてきたsetqよりも汎用的であり、setqと全く置き換えて使用することがで
きます。PLACEは、アクセスしようとするデータオブジェクトのある場所を指し、
NEW-VALUEを評価した値がその場所に書き込まれます。

setfは、いくつでもPLACEやNEW-VALUEの対でも受け付けます。そして、同時にで
はなく、順番に値を割り当てます。つまり、最初の引数の対は、二番目の対が評
価される前に評価され、PLACEによって示される場所に値が書き込まれています。
このように、二番目の引数の対は、最初の対の評価によって割り当てられた値を
使うことが可能です。setfは、最後に評価された引数の対によって割り当てられ
た値、あるいは、まったく引数が与えられなかった場合は、nilを返します。

PLACEの形式は以下のどのようなものも可能です:

(1)変数名(レキシカル変数でもスペシャル変数でもよい)

  (setf hoge 1); 変数hogeに1を代入する
  => 1
  hoge
  => 1

(2)アクセス関数
 * 構造体(構造体名+変数)

  (defstruct foo a b c); 構造体fooを宣言する
  => #<structure-definition: foo>
  (setf hoge (make-foo)); hogeに空のfoo構造体を代入する(ここのsetfはsetqでもよい)
  => #S(foo a nil b nil c nil)
  (setf (foo-a hoge) 10); hogeのスロットaに10を代入する
  => 10
  hoge
  => #S(foo a 10 b nil c nil)

 * 配列(aref, svref, fill-pointer)

  (setf hoge (make-array 3)); hogeに空のベクタを代入する(ここのsetfはsetqでもよい)
  => #(nil nil nil)
  (setf (aref hoge 1) 5); hogeベクタの2番目の数値を5にする
  => 5
  hoge
  => #(nil 5 nil)

 * リスト(car, cdr, first, rest, etc...)

  (setf hoge '("a" "b" "c"))
  => ("a" "b" "c")
  (setf (car (cdr hoge)) "d")
  => "d"
  hoge
  =>("a" "d" "c")

 * 属性リスト(get, getf, symbol-plist)

  (setf (get 'Japan 'language) "Japanese")
  => "Japanese"
  (setf (get 'Japan 'population) 120000000)
  => 120000000
  (symbol-plist 'Japan)
  => (population 120000000 language "Japanese")

 * その他(symbol-value, gethash, symbol-function, documentation, macro-function)
Seealso
setq