Macro DEFINE-SYMBOL-MACRO

UP


Macro DEFINE-SYMBOL-MACRO

Macro DEFINE-SYMBOL-MACRO

構文

define-symbol-macro symbol expansion
=> symbol

引数と戻り値

symbol - シンボル
expansion - フォーム

定義

シンボルsymbolについて、 グローバルに影響するマクロ展開の仕組みを提供します。

symbolという名前のシンボルマクロの 展開関数をグローバルに確立します。

シンボルマクロの展開関数は、 ただフォームと環境が適用されたときに 正しい展開を返すことが保証されています。 (特に展開が概念的に、展開関数か環境かその両方かの、 どこに保存されるのかは実装依存です)

各グローバル下で参照されるsymbolは (ただし、同じ名前symbolの変数かシンボルマクロの 束縛によってシャドウされていないとき)、 通常のマクロ展開処理が行われます。 3.1.2.1.1. フォームとしてのシンボルをご確認ください。 シンボルマクロの展開は、通常のマクロと同様に、 シンボルマクロの参照先と同じレキシカル環境において、 さらにマクロ展開が行われます。

もしこのsymbolの定義 (ただし、同じ名前symbolの変数かシンボルマクロの 束縛によってシャドウされていないとき)のスコープ内で special宣言が行われたときの結果は未定義です。

この定義のスコープ内で setqを使ってsymbolに値をセットしたときは、 それはsetfを使ったかのように扱われます。 psetqでのsymbolは、psetfのように扱われ、 multiple-value-setqsetfvaluesのように扱われます。

シンボルマクロの束縛は、 letsymbol-macroletによってシャドウされます。

例文

(defvar *things* (list 'alpha 'beta 'gamma)) =>  *THINGS*

(define-symbol-macro thing1 (first *things*)) =>  THING1
(define-symbol-macro thing2 (second *things*)) =>  THING2
(define-symbol-macro thing3 (third *things*)) =>  THING3

thing1 =>  ALPHA
(setq thing1 'ONE) =>  ONE
*things* =>  (ONE BETA GAMMA)
(multiple-value-setq (thing2 thing3) (values 'two 'three)) =>  TWO
thing3 =>  THREE
*things* =>  (ONE TWO THREE)

(list thing2 (let ((thing2 2)) thing2)) =>  (TWO 2)

影響

なし。

例外

symbolがすでにグローバル変数として定義されていたときは、 型program-errorのエラーが発生します。

参考

symbol-macrolet, macroexpand

備考

なし。


TOP, Github