我正在尝试了解-main及其命名空间设置。 -main函数中的默认命名空间似乎是“user”,但可以调用在同一文件中的main函数“上方”定义的函数。他们被提到了吗?我这样做是为了找出:
(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)成功,但显然在当前命名空间* ns *中不知道符号'fo'。发生了什么事?
当我尝试将某个函数的名称和一些参数作为命令行参数传递给-main时,这个问题就出现了。
使用以下内容创建./project.clj:
(defproject ack“1”:main ack.doodle)
运行它:
莱恩跑了
答案 0 :(得分:2)
我没有为你解答last night in #clojure吗?如果对答案有些不满意,你必须澄清你的问题。
答案 1 :(得分:0)
看起来leiningen通过从用户命名空间中调用它来运行(-main):( ack.doodle / -main)。因此* ns *绑定到用户名称空间。
尝试在项目根目录中运行lein repl。然后运行(-main)并查看会发生什么。 :)