% 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-setqはsetfのvaluesのように扱われます。
シンボルマクロの束縛は、
letとsymbol-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のエラーが発生します。
なし。