(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)
。)