setf マクロ ¶setf マクロは、一般化変数を操作するための最も基本的な方法です。setf 形式は setq
と同様ですが、各ペアの第1引数(左引数)に、単なるシンボルではなく任意のプレイス形式を受け付ける点が異なります。例えば、(setf (car a) b) は a の car を
b に設定し、(setcar a b)
と同じ操作を行いますが、この種のプレイスの設定と参照に2つの別々の関数を使う必要はありません。
This macro evaluates form and stores its value in
place, which must be a valid generalized variable
form. If there are several place and form pairs, the assignments are done sequentially just as
with setq. setf returns
the value of the last form.
以下のLispフォームは、Emacsにおいて一般化変数として機能するフォームであり、そのためsetfのplace引数に現れることがあります:
(setf x y)は(setq x
y)と完全に等価であり、setq自体はsetfが存在する以上、厳密に言えば冗長です。とはいえ、多くのプログラマーは、スタイル上の理由や歴史的な経緯から、単純な変数の設定には引き続きsetqを好むでしょう。マクロ(setf x
y)は実際には(setq x
y)に展開されるため、コンパイル済みコードで使用してもパフォーマンス上のペナルティはありません。
aref cddr symbol-function car elt symbol-plist caar get symbol-value cadr gethash cdr nth cdar nthcdr
alist-get overlay-start default-value overlay-get face-background process-buffer face-font process-filter face-foreground process-get face-stipple process-sentinel face-underline-p terminal-parameter file-modes window-buffer frame-parameter window-dedicated-p frame-parameters window-display-table get-register window-hscroll getenv window-parameter keymap-parent window-point match-data window-start overlay-end
(substring subplace n [m]) という形式の呼び出し。ここで subplace
自体は有効な一般化変数であり、その現在の値は文字列であり、また格納されている値も文字列である。新しい文字列は、宛先文字列の指定された部分に挿入される。例えば:
(setq a (list "hello" "world"))
⇒ ("hello" "world")
(cadr a)
⇒ "world"
(substring (cadr a) 2 4)
⇒ "rl"
(setf (substring (cadr a) 2 4) "o")
⇒ "o"
(cadr a)
⇒ "wood"
a
⇒ ("hello" "wood")
if および cond
の条件式は、汎用変数として機能します。例えば、これにより foo または bar のいずれかの変数に zot が設定されます:
(setf (if (zerop (random 2))
foo
bar)
'zot)
setf は、処理方法が不明な place
フォームが渡された場合にエラーを通知します。
なお、nthcdr の場合、関数のリスト引数自体が有効な place 形式である必要があります。例えば、(setf (nthcdr 0
foo) 7) は foo 自体を 7 に設定します。
マクロ push(リスト変数の変更を参照)および pop(リスト要素へのアクセスを参照)は、リストだけでなく一般化変数も操作できます。(pop place) は、place に格納されているリストの先頭要素を削除して返します。これは (prog1 (car place) (setf place (cdr place)))
と同様ですが、すべてのサブフォームを一度だけ評価する点が異なります。(push x place) は、place に格納されているリストの先頭に x
を挿入します。これはサブフォームの評価方法を除けば、(setf place (cons x place)) と同様です。なお、nthcdr
上の push および pop
を使用すると、リスト内の任意の位置への挿入や削除が可能です。
同様に、マクロ incf および decf(算術演算を参照)を使用して、数値である一般化変数をインクリメントまたはデクリメントできます。
cl-lib ライブラリは、追加の setf
プレースを含む、一般化変数向けのさまざまな拡張を定義しています。Common Lisp
Extensions の 一般化変数
を参照してください。