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
(
=> ALPHA
thing1 setq thing1 'ONE) => ONE
(=> (ONE BETA GAMMA)
*things* multiple-value-setq (thing2 thing3) (values 'two 'three)) => TWO
(=> THREE
thing3 => (ONE TWO THREE)
*things*
list thing2 (let ((thing2 2)) thing2)) => (TWO 2) (
なし。
symbolがすでにグローバル変数として定義されていたときは、 型program-error
のエラーが発生します。
なし。