単一の引数とコンマを含む引用点は何ですか?(引用符、引数)


15

(quote x)MAKESは評価されないX、しかし、追加,の前でxquoteになり、それが評価しました。その場合、次のように、カンマを前に付けた単一の引数で引用符を使用するポイントは何(quote ,x)ですか?

迷惑な矢印から59行目で動機付け:

(put (quote ,cmd) 'aa--alts ,alternatives)

なぜ(put cmd 'aa-alts ,alternatives)同様に良くないのですか?

回答:


20

コンマは、引用符で囲まれた(準引用符で囲まれた)リストのコンテキストで使用されます。これにより、リストの一部を選択的に評価できます。バッククォートの使用例については、このスレッドも参照してください。

いくつかの簡単な例:

(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


1
Ackeyなので、前に引用符prognを付けると、ネストする場所に関係なく、評価したいものの前にコンマを置く必要がありますか?(,cmdは直接ではなく、別のリスト内にあります(progn)。)
Unfun Cat

これはテストする良い機会のようです!評価(setq a "a's value" b "b's value" c "c's value")してから評価してみてください`(a '(,b c))
ダン

その他のnewbs:評価するには、テキストをスクラッチバッファーに追加し、カーソルを行の最後に置いてからCxeを押します。
不愉快な猫

10

それはマクロ内にあるからです。マクロは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マクロが呼び出される環境で定義されていないため、これはエラーです。


これも素晴らしい説明です。綴ってくれてありがとう。
不愉快な猫
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.