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)
(1 2 3)) => (A B C D E F 1 2 3)
(appendf x '(d e f) '(=> (A B C D E F 1 2 3)
x => (A B C)
y 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. ドキュメント文字と宣言の文脈的な作用
なし。