首页 > 解决方案 > 如何编写 Clojure 宏来获取 var 的值?

问题描述

user=> (def v-1 "this is v1")
user=> (def v-2 "this is v2")
user=> (defmacro m [v] (symbol (str "v-" v)))
user=> (m 1)
"this is v1"
user=> (m 2)
"this is v2"
user=> (let [i 2] (m i))
CompilerException java.lang.RuntimeException: Unable to resolve symbol: v-i in this context, compiling:(NO_SOURCE_PATH:73:12)

我可以写一个宏让两者

(m 2)

(let [i 2] (m i))

得到“这是 v2”?

标签: clojure

解决方案


这在没有宏的情况下是可能的:

(defn m [v] (var-get (resolve (symbol (str "v-" v)))))

(m 1) ;; => "This is v1"
(let [i 2] (m i)) ;; => "This is v2"

如果需要,您也可以使用宏:

(defmacro m [v] `@(resolve (symbol (str "v-" ~v))))

推荐阅读