Next: , Previous: Defining Macros, Up: Macros


12.5 バッククォート

マクロでは、定数部分と非定数部分を組み合わせた大きなリスト構造を 構築する必要がしばしばあります。 これを簡単に行うためには、 (通常、バッククォート(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の旧版との互換性のためであり、 新しいプログラムでは使わないことを勧めます。