2

我试图准确地确定函数调用者的命名空间。看起来*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=>

是否有其他一些我可以依赖的元数据或者我需要手动指定它?

4

2 回答 2

1

这是不可能的。在repl中,*ns*总是设置为repl所在的命名空间;在运行时它通常是 clojure.core,除非有人不厌其烦地设置它,这并不常见。

于 2013-11-11T23:46:01.340 回答
1

我不确定您的完整用例是什么,但从您的示例来看,您希望 #'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"

希望这可以帮助!

于 2013-11-12T19:49:11.453 回答