Next: Problems with Macros, Previous: Defining Macros, Up: Macros
マクロでは、定数部分と非定数部分を組み合わせた大きなリスト構造を 構築する必要がしばしばあります。 これを簡単に行うためには、 (通常、バッククォート(backquote)と呼ばれる)‘`’構文を 使います。
バッククォートにより、リストの要素を選択に評価しつつ、
リストをクォートできます。
もっとも単純な場合、これはスペシャルフォームquote
(see Quoting)と
等価です。
たとえば、つぎの2つのフォームは等価な結果になります。
`(a list of (+ 2 3) elements) (a list of (+ 2 3) elements) '(a list of (+ 2 3) elements) (a list of (+ 2 3) elements)
バッククォートの引数の内側にある特別な印‘,’は、 値が定数ではないことを表します。 バッククォートは、リスト構造の中の‘,’の引数を評価し、 値で置き換えます。
(list 'a 'list 'of (+ 2 3) 'elements) (a list of 5 elements) `(a list of ,(+ 2 3) elements) (a list of 5 elements)
‘,’による置き換えは、リスト構造の深いレベルでも許されます。 たとえば、つぎのとおりです。
(defmacro t-becomes-nil (variable) `(if (eq ,variable t) (setq ,variable nil))) (t-becomes-nil foo) == (if (eq foo t) (setq foo nil))
特別な印‘,@’を使って、 評価結果を結果となるリストに繋ぎ合わせる(splice)こともできます。 繋ぎ合わせたリストの要素は、結果となるリストの他の要素と同じレベルになります。 ‘`’を使わない等価なコードはしばしば読み難くなります。 例をあげましょう。
(setq some-list '(2 3)) (2 3) (cons 1 (append some-list '(4) some-list)) (1 2 3 4 2 3) `(1 ,@some-list 4 ,@some-list) (1 2 3 4 2 3) (setq list '(hack foo bar)) (hack foo bar) (cons 'use (cons 'the (cons 'words (append (cdr list) '(as elements))))) (use the words foo bar as elements) `(use the words ,@(cdr list) as elements) (use the words foo bar as elements)
19.29版よりまえのEmacsの旧版では、 ‘`’の構文は異なっていて、 バッククォート構文全体を囲む括弧の余分なレベルが必要でした。 同様に、‘,’や‘,@’の置換でも、 ‘,’や‘,@’、および後続の式を囲む括弧の余分なレベルが1つ必要でした。 古い構文では、‘`’、 ‘,’、‘,@’と後続の式とのあいだには 空白が必要でした。
この構文も受け付けますが、これはEmacsの旧版との互換性のためであり、 新しいプログラムでは使わないことを勧めます。