Macro DEFINE-MODIFY-MACRO

UP


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が古い内容のplacelambda-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. ドキュメント文字と宣言の文脈的な作用

備考

なし。


TOP, Github