Clojure 确定函数的名称空间';来电者

Clojure 确定函数的名称空间';来电者,clojure,Clojure,我试图准确地确定函数调用方的名称空间。看起来*ns*是由调用堆栈顶部的名称空间决定的 user=> (ns util) nil util=> (defn where-am-i? [] (str *ns*)) #'util/where-am-i? util=> (ns foo (:require [util])) nil foo=> (util/where-am-i?) "foo" foo=> (ns bar) nil bar=> (defn ask [] (u

我试图准确地确定函数调用方的名称空间。看起来
*ns*
是由调用堆栈顶部的名称空间决定的

user=> (ns util)
nil
util=> (defn where-am-i? [] (str *ns*))
#'util/where-am-i?
util=> (ns foo (:require [util]))
nil
foo=> (util/where-am-i?)
"foo"
foo=> (ns bar)
nil
bar=> (defn ask [] (util/where-am-i?))
#'bar/ask
bar=> (ask)
"bar"
bar=> (ns foo)
nil
foo=> (util/where-am-i?)
"foo"
foo=> (bar/ask)
"foo"
foo=>

是否有其他元数据可以依赖或需要手动指定?

这是不可能的。在repl中,
*ns*
始终设置为repl所在的命名空间;在运行时,它通常是clojure.core,除非有人不辞辛劳地设置它,这是不常见的。

我不确定您的完整用例是什么,但从您的示例判断,您希望#'bar/ask返回它自己的名称空间,而不是返回解析当前名称空间的函数。您可以简单地使用def而不是defn。以下是您所做工作的一个示例:

util=> (in-ns 'bar)
#<Namespace bar>
bar=> (def tell (util/where-am-i?))
#'bar/tell
bar=> (in-ns 'foo)
#<Namespace foo>
foo=> (refer 'bar :only '[tell])
nil
foo=> tell
"bar"
util=>(在ns'栏中)
#
bar=>(def tell(util/where-am-i?)
#“酒吧/告诉
条形图=>(在ns'foo中)
#
foo=>(请参阅“仅限酒吧”[告知])
无
foo=>tell
“酒吧”

希望这有帮助

你的第二个断言似乎不正确。我观察到,如果我在
(ns..)
之后立即检查
*ns*
,就会将其设置为当前名称空间。另请参阅“当前名称空间,ns可以而且应该仅通过在ns或ns宏中调用来设置,如果名称空间不存在,这两个宏都会创建名称空间。”。无论如何,我认为你是对的,这似乎是不可能的。所有这些都发生在编译时,正如我所说的,这显示了repl所在的名称空间。尝试编写一个检查
*ns*
的函数,并从一些非repl源调用它,例如处理web请求,或者从编译的jar中的
-main
调用它。在运行时,设置
*ns*
的repl细节不会发生。我想它发生在编译时,但它不在repl中。它是在一个
莱因运行