如何解决* ns *使用'lein run'意外地评估为'user'命名空间,但使用'lein repl'时却没有
我正在尝试获取与实际运行的代码关联的名称空间。
我使用“在线新应用测试”创建了一个模板项目:
(ns test.core
(:gen-class))
(defn -main
[& args]
(println (ns-name *ns*)))
使用repl时,* ns *的值为test.core:
echo "(-main)" | lein repl
nREPL server started on port 37435 on host 127.0.0.1 - nrepl://127.0.0.1:37435
REPL-y 0.4.4,nREPL 0.7.0
Clojure 1.10.1
OpenJDK 64-Bit Server VM 1.8.0_265-b01
Docs: (doc function-name-here)
(find-doc "part-of-name-here")
Source: (source function-name-here)
Javadoc: (javadoc java-object-or-class-here)
Exit: Control+D or (exit) or (quit)
Results: Stored in vars *1,*2,*3,an exception in *e
test.core=> (-main)
test.core
nil
test.core=> Bye for now!
但是当使用lein run时,我得到了用户命名空间:
lein run
user
为什么这样的行为? 如何获得类似于repl中的一段代码的名称空间?
解决方法
一些注意事项:
-
*ns*
绑定到计算表达式的名称空间 -
user
是默认名称空间 - 从
(test.core/-main)
命名空间调用user
时,*ns*
绑定到user
而不是test.core
。
如果要打印定义了-main
的名称空间,可以使用顶级表达式:
(ns test.core)
(def current-ns *ns*)
(defn -main [& args]
(println (ns-name current-ns)))
或使用var元数据:
(ns test.core)
(defn -main [& args]
(println (ns-name (:ns (meta #'-main)))))
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。