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