我想从函数内部获取在函数外部定义的 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<<
我可以根据我发现的一些东西来做这个宏:
(defmacro get-var-name [x]
`(:name (meta (var ~x))))
这在例如从 REPL 调用时有效,但是当从“内部”范围调用时编译器会阻塞,例如
(defn another-func [y]
(get-var-name y))
编译器说“说无法解析 var y”。 (macroexpand...)
表明它试图在当前命名空间中查找局部变量 y,而不是当前命名空间中的原始变量。我认为(var...
) 仅查找命名空间变量,因此这会阻止宏在函数或其他绑定(例如let
.
我想我不得不从定义变量的同一范围手动获取变量名称并将其作为额外参数传递。有没有更优雅的方法通过绑定链将变量名称信息传递到使用它的位置?那将是坏事。
谢谢