次: Problems with Macros, 前: Defining Macros, 上: 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の旧版との互換性のためであり、 新しいプログラムでは使わないことを勧めます。