(quote x)MAKESは評価されないX、しかし、追加,の前でx内quoteになり、それが評価しました。その場合、次のように、カンマを前に付けた単一の引数で引用符を使用するポイントは何(quote ,x)ですか?
迷惑な矢印から59行目で動機付け:
(put (quote ,cmd) 'aa--alts ,alternatives)
なぜ(put cmd 'aa-alts ,alternatives)同様に良くないのですか?
(quote x)MAKESは評価されないX、しかし、追加,の前でx内quoteになり、それが評価しました。その場合、次のように、カンマを前に付けた単一の引数で引用符を使用するポイントは何(quote ,x)ですか?
迷惑な矢印から59行目で動機付け:
(put (quote ,cmd) 'aa--alts ,alternatives)
なぜ(put cmd 'aa-alts ,alternatives)同様に良くないのですか?
回答:
コンマは、逆引用符で囲まれた(準引用符で囲まれた)リストのコンテキストで使用されます。これにより、リストの一部を選択的に評価できます。バッククォートの使用例については、このスレッドも参照してください。
いくつかの簡単な例:
(setq a "a's value" b "b's value" c "c's value")
'(a b c) ; => (a b c)
`(,a b ,c) ; => ("a's value" b "c's value")
参照しているコンマはマクロ定義内にあり、逆引用符を使用していprognます:
(defmacro add-annoying-arrows-advice (cmd alternatives)
`(progn
(add-to-list 'annoying-commands (quote ,cmd))
(put (quote ,cmd) 'aa--alts ,alternatives)
(defadvice ,cmd (before annoying-arrows activate)
(when annoying-arrows-mode
(aa--maybe-complain (quote ,cmd))))))
,cmdバッククォート内cmdでは、シンボルではなくの値を適切な場所に置くことができますcmd。
(setq a "a's value" b "b's value" c "c's value")してから評価してみてください`(a '(,b c))。
それはマクロ内にあるからです。マクロはLispフォームを返す必要があり、それが次に評価されます。
たとえば、このマクロの最初の呼び出しを見ると:
(add-annoying-arrows-advice previous-line '(ace-jump-mode backward-paragraph isearch-backward ido-imenu smart-up))
以下を含む拡張が必要です。
(put 'previous-line 'aa-alts '(ace-jump-mode backward-paragraph isearch-backward ido-imenu smart-up))
それが(quote ,cmd)達成するものです。マクロがcmd代わりにプレーンを使用する場合、文字通り保持され、展開は次のようになります。
(put cmd 'aa-alts '(ace-jump-mode backward-paragraph isearch-backward ido-imenu smart-up))
cmdマクロが呼び出される環境で定義されていないため、これはエラーです。
prognを付けると、ネストする場所に関係なく、評価したいものの前にコンマを置く必要がありますか?(,cmdは直接ではなく、別のリスト内にあります(progn)。)