2013-06-30 13 views
8

短いバッククォートと長いバッククォートとの間には多少の違いがあるようです。バッククォートと `in emacs lisp

(let ((x 123)) 
    (dolist (res (list `(a `(b ,x)) 
        `(a (backquote (b ,x))) 
        (backquote (a (backquote (b ,x)))) 
        (backquote (a `(b ,x))))) 
    (print res))) 

出力:

(a (\` (b (\, x)))) 

(a (backquote (b 123))) 

(a (backquote (b 123))) 

(a (\` (b (\, x)))) 

なぜそれがxにと異なる動作をしますか? 4つの結果のうちの2つが驚くべき結果になるとは確信していません。

+0

これらは実際にはバックティック –

+0

私はそれが 'backquote.el'のバグだと思います。以下の私のコメントを参照してください。 –

答えて

3

私はそれがバグか機能であるかどうかは分かりませんが、主に私はプログラマーがbackquote機能を使用することを許可されているかどうかわからないからです。関数。正しい出力は、最初と4番目の出力です。 backquotebackquote.el)のコードを見ると、「またはbackquote」内のいずれかが正しく展開されていないことが明らかです。このため、関連するコードは次のとおりです。backquote-backquote-symbolは\ `(引用バックスラッシュバッククォート)」として前に定義されて

((eq (car s) backquote-backquote-symbol) 
     (backquote-delay-process s (1+ level))) 

。そこにこのエラーを処理するにはいくつかの方法がありますが、行は、次のようになります。

((or (eq (car s) backquote-backquote-symbol) 
     (eq (car s) 'backquote)) 
     (backquote-delay-process s (1+ level))) 

(またはバッククォート非エイリアスのシンボルを指定するための他の変数を使用して)。

EDIT:さらに詳しく見ると、そのテストを追加する必要がある別の場所もありますが、これにはパッチの報告も含まれます。私はそれをどうやって行うのか分かります。その変更で:

ELISP> (macroexpand-all `(a (backquote (b ,x)))) 
(a 
(list 'b x)) 
ELISP> (macroexpand-all `(a `(b ,x))) 
(a 
(list 'b x)) 
関連する問題