% 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. ドキュメント文字と宣言の文脈的な作用
なし。