如何编写Clojure宏来获取var的值?

jam*_*qiu 1 clojure

user =>(def v-1"this is v1")

user =>(def v-2"这是v2")

user =>(defmacro m [v](symbol(str"v-"v)))

user =>(m 1)

"这是v1"

user =>(m 2)

"这是v2"

user =>(让[i 2](mi))

CompilerException java.lang.RuntimeException:无法在此上下文中解析符号:vi,编译:(NO_SOURCE_PATH:73:12)

我可以写两个宏

(m 2)

(让[i 2](mi))

得到"这是v2"?

Tay*_*ood 6

没有宏可以这样做:

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

(m 1) ;; => "This is v1"
(let [i 2] (m i)) ;; => "This is v2"
Run Code Online (Sandbox Code Playgroud)

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

(defmacro m [v] `@(resolve (symbol (str "v-" ~v))))
Run Code Online (Sandbox Code Playgroud)