我正在尝试理解-main及其命名空间设置。在-main函数中,默认命名空间似乎是“user”,但是在同一文件中“上方”定义的函数可以被调用。它们是否有所关联?我运行了以下代码来查找答案:
呼叫 (fo) 成功了,但显然符号“fo”在当前命名空间 *ns* 中未知。是怎么回事呢?
当我试图将某个函数的名称以及一些参数作为命令行参数传递给 -main 时,遇到了这个问题。
重现步骤:
- 将上述代码粘贴到文件./src/ack/doodle.clj中 - 创建./project.clj文件并添加以下内容: (defproject ack "1" :main ack.doodle) - 运行它: lein run
(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
呼叫 (fo) 成功了,但显然符号“fo”在当前命名空间 *ns* 中未知。是怎么回事呢?
当我试图将某个函数的名称以及一些参数作为命令行参数传递给 -main 时,遇到了这个问题。
重现步骤:
- 将上述代码粘贴到文件./src/ack/doodle.clj中 - 创建./project.clj文件并添加以下内容: (defproject ack "1" :main ack.doodle) - 运行它: lein run
*ns*
的运行时值与函数调用成功无关。在编译时,编译器看到你正在调用foo
,在*ns*
中查找它(这个时候 已 绑定),并发出对ack.doodle/foo
的引用。在运行时,该引用已经解析,因此*ns*
的值没有影响(这就是为什么它不再绑定的原因)。不过我不理解你澄清后的问题 -“如何确定对*ns*
中函数的调用是否会成功”对我来说没有意义。 - amalloy