キーを持つ値としていくつかのコードを持つマップを受け入れる必要がある Clojure マクロを作成しています。
後で、提供されたキーに基づいてコードを評価したいと思います。
マップ値が評価される前に評価されないようにするにはどうすればよいですか? キーを評価する必要があるため、マップ全体を引用したくありません。
引用されたコード構文を渡したくありません。
マップ内の値をマクロに引用させる方法はありますか?
キーを持つ値としていくつかのコードを持つマップを受け入れる必要がある Clojure マクロを作成しています。
後で、提供されたキーに基づいてコードを評価したいと思います。
マップ値が評価される前に評価されないようにするにはどうすればよいですか? キーを評価する必要があるため、マップ全体を引用したくありません。
引用されたコード構文を渡したくありません。
マップ内の値をマクロに引用させる方法はありますか?
まず、 2 日前の質問に対する私の回答で指摘したように、マクロが何らかの方法でマップ自体を変換する場合、たとえばマップに名前を付けるシンボルではなく、マップ リテラルとして受け取る必要があります。 -ローカルを保持しています。厳密に言えば、シンボルを受け入れて、それらのグローバルコンパイル時の値を評価することもできます。ただし、実行時の値を取得する方法はありません。
リテラル マップのみを受け入れる場合は、通常のマップ変換関数を使用できます。たとえば、このマクロは、渡されたマップ リテラルの値を引用符で囲み、キーを引用符で囲まないままにします。
(defmacro quote-vals [map-literal]
(zipmap (keys map-literal)
(map #(list 'quote %) (vals map-literal))))
REPL から:
(quote-vals {(+ 1 2) (+ 1 2) (+ 3 4) (+ 3 4)})
;= {7 (+ 3 4), 3 (+ 1 2)}