我想从函数中获取函数外部定义的var的名称.该名称应该是我在原始定义范围内使用的名称,而不是我实际上尝试使用该名称的任何嵌套绑定.
所以我想做一些像(学术范例)的事情:
(defn f1 [x1] (println "hello, you passed var name >>" (get-var-name x1) "<<")
(defn f2 [x2] (f1 x2))
(defn f3 [x3] (let [zzz x3] (f2 zzz))
(def my-var 3.1414926)
(f3 my-var)
user> hello, you passed var name >>my-var<<
Run Code Online (Sandbox Code Playgroud)
我能够根据我发现的一些东西做这个宏:
(defmacro get-var-name [x]
`(:name (meta (var ~x))))
Run Code Online (Sandbox Code Playgroud)
这在例如从REPL调用时起作用,但是当从"内部"范围调用时编译器会阻塞,例如
(defn another-func [y]
(get-var-name y))
Run Code Online (Sandbox Code Playgroud)
编译器说"说无法解决var y". (macroexpand...)显示它试图在当前命名空间中找到局部变量y,而不是当前命名空间中的原始变量.我认为(var...)只查找命名空间变量,因此这可以防止宏在函数或其他绑定中工作let.
我想我不得不从我定义变量的相同范围手动获取变量名称并将其作为额外参数传递.有没有更优雅的方法通过一系列绑定将var名称信息传递到它所使用的点?那将是坏事.
谢谢