Emacs:setとsetfとsetqの違い
setq
setq は変数へ値を代入する伝統的な形式。BASIC や C でいう「代入 = 」に相当するモノ。
(setq <var_name> <form>)
<var_name> は評価されない。setq の q は quote の q。
setq の実装は「特殊形式」なので、局所変数への代入にも使える。
set
set は quote の無い setq
(set <var_name> <form>)
<var_name> の部分が評価されて、代入先を動的に変えられる。
set の実装が「関数」になっているので、局所変数への代入には使うことができない。
setf
(setf <place> <form>)
第一引数 <place>を評価する。<place>には、特殊変数や局所変数の他に、任意の「場所」を指定してやることが可能。
例
(setf (nth 2 x) 9)
は、リスト x の3番目の要素への代入になる。
<place> に任意の場所を指定できるが、プログラマが独自の場所を指定してやりたい場合は、defsetf や define-setf-methodを使って、その場所への格納方法を Lisp に教えておいてやる必要がある。
上記の例の nth などの場合は、あらかじめ組み込まれている。
A call to any of the following standard Lisp functions: aref cddr symbol-function car elt symbol-plist caar get symbol-value cadr gethash cdr nth cdar nthcdr A call to any of the following Emacs-specific functions: default-value process-get frame-parameter process-sentinel terminal-parameter window-buffer keymap-parent window-display-table match-data window-dedicated-p overlay-get window-hscroll overlay-start window-parameter overlay-end window-point process-buffer window-start process-filter