% Macro DEFINE-MODIFY-MACRO
Macro DEFINE-MODIFY-MACRO
define-modify-macro name lambda-list function [documentation] => name
name - シンボル
lambda-list - define-modify-macroラムダリスト
function - シンボル
documentation - 文字列。評価されません。
define-modify-macroは、nameという名前で
placeに読み書きを行うマクロを定義します。
新しいマクロの引数は、最初はplaceであり、
続く引数は指定されたlambda-listです。
define-modify-macroによって定義されたマクロは、
get-setf-expansionへ正しく環境パラメーターが渡されます。
マクロが起動されると、
functionが古い内容のplaceとlambda-listを引数に適用され、
そしてplaceは結果の値で更新されます。
多重評価(下記を参照)を回避する問題を除けば、
define-modify-macroの展開は下記と同等になります。
(defmacro name (reference . lambda-list)
documentation
`(setf ,reference
(function ,reference ,arg1 ,arg2 ...)))
ここで、arg1, arg2, ...はlambda-listに現れるパラメーターであり、
restパラメーターが適切に規定されているものとしています。
define-modify-macroによって定義された
マクロ呼び出しのサブフォームは、
5.1.1.1. placeのサブフォームの評価によって記載されている通りに評価されます。
documentationはドキュメント文字の種別functionとして、
そのマクロ関数へ割り当てられます。
もしdefine-modify-macroフォームがトップレベルフォームに現れたとき、
コンパイラーはコンパイル時にマクロ定義を保存しなければならないので、
ファイル内でその後に現れたマクロを正しく展開できます。
(define-modify-macro appendf (&rest args)
append "Append onto list") => APPENDF
(setq x '(a b c) y x) => (A B C)
(appendf x '(d e f) '(1 2 3)) => (A B C D E F 1 2 3)
x => (A B C D E F 1 2 3)
y => (A B C)
(define-modify-macro new-incf (&optional (delta 1)) +)
(define-modify-macro unionf (other-set &rest keywords) union)
マクロ定義がnameにアサインされます。
なし。
なし。
defsetf,
define-setf-expander,
documentation,
3.4.11. ドキュメント文字と宣言の文脈的な作用
なし。