Clojure:名称空间和-main
我试图理解-main及其名称空间设置。主函数中的默认名称空间似乎是“user”,但可以调用在同一文件中主函数“上方”定义的函数。他们被转介了吗?我运行此命令是为了发现:Clojure:名称空间和-main,clojure,namespaces,scope,main,leiningen,Clojure,Namespaces,Scope,Main,Leiningen,我试图理解-main及其名称空间设置。主函数中的默认名称空间似乎是“user”,但可以调用在同一文件中主函数“上方”定义的函数。他们被转介了吗?我运行此命令是为了发现: (ns ack.doodle) (定义为[]“酒吧”) (定义-主参数[&args] (println(fo));;bar (println*ns*)# (println(get(ns指*ns*)“排序映射”);#“clojure.core/sorted-map (println(get(ns指*ns*)'fo));无 (pr
(ns ack.doodle)
(定义为[]“酒吧”)
(定义-主参数[&args]
(println(fo));;bar
(println*ns*)#
(println(get(ns指*ns*)“排序映射”);#“clojure.core/sorted-map
(println(get(ns指*ns*)'fo));无
(println(get(ns-map*ns*)'fo));无
(println(get(ns publics*ns*)'fo));无
(println(get(ns实习生*ns*)'fo));无
(println(get(ns别名*ns*)'fo));nil
(println(ns resolve*ns*'fo));;无
调用(fo)成功,但显然当前命名空间*ns*中不知道符号'fo'。发生什么事了
当我试图将某些函数的名称以及一些参数作为命令行参数传递给-main时,遇到了这个问题
复制步骤
- 将上述代码粘贴到文件中。/src/ack/doodle.clj
- 使用以下内容创建./project.clj: (解除项目确认“1”:主确认涂鸦)
- 运行它: 莱因润
尝试在项目根目录中运行leinrepl。然后运行(-main)并查看发生了什么。:) 我不是替你回答了吗?如果答案有不满意的地方,你必须澄清你的问题。很抱歉,我昨天没能读到你的答案,我想我还没来得及读它就断开了连接。大约一个小时后,我回到频道,询问是否有人回答,但没有得到回应。我不知道在编译时和运行时可以使用不同的名称空间绑定。无论如何,我仍然不完全清楚为什么(fo)调用会在运行时成功,尽管在运行时当前名称空间中显然不知道“fo”。因此,也许问题应该是:如何确定对*ns*中函数的调用是否会成功?另外,我不知道通道日志。oops:d
*ns*
的运行时值与函数调用的成功无关。在编译时,编译器会看到您正在调用foo
,在*ns*
中查找它(此时已绑定),并发出对ack.doodle/foo
的引用。在运行时,该引用已经被解析,因此*ns*
的值没有区别(这就是它不再被绑定的原因)。不过,我不理解你澄清的问题——“如何确定调用*ns*
中的函数是否成功”对我来说没有意义。感谢你的解释,我想我已经开始更好地理解这一点了(是的,现在来看,我澄清的问题似乎有点毫无意义)。
(ns ack.doodle)
(defn fo [] "bar")
(defn -main [& args]
(println (fo)) ;; bar
(println *ns*) ;; #<Namespace user>
(println (get (ns-refers *ns*) 'sorted-map)) ;; #'clojure.core/sorted-map
(println (get (ns-refers *ns*) 'fo)) ;; nil
(println (get (ns-map *ns*) 'fo)) ;; nil
(println (get (ns-publics *ns*) 'fo)) ;; nil
(println (get (ns-interns *ns*) 'fo)) ;; nil
(println (get (ns-aliases *ns*) 'fo)) ;; nil
(println (ns-resolve *ns* 'fo))) ;; nil