Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Clojure:名称空间和-main_Clojure_Namespaces_Scope_Main_Leiningen - Fatal编程技术网

Clojure:名称空间和-main

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

我试图理解-main及其名称空间设置。主函数中的默认名称空间似乎是“user”,但可以调用在同一文件中主函数“上方”定义的函数。他们被转介了吗?我运行此命令是为了发现:

(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”:主确认涂鸦)

  • 运行它:

    莱因润


看起来leiningen运行(-main)的方式是从用户名称空间调用它,如下所示:(ack.doodle/-main)。因此,*ns*被绑定到用户名称空间


尝试在项目根目录中运行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