Clojure:namespace和-main

时间:2012-04-22 10:59:31

标签: clojure namespaces scope main leiningen

我正在尝试了解-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时,这个问题就出现了。

重现

的步骤
  • 将上面的代码粘贴到文件./src/ack/doodle.clj
  • 使用以下内容创建./project.clj:

      

    (defproject ack“1”:main ack.doodle)

  • 运行它:

      莱恩跑了

2 个答案:

答案 0 :(得分:2)

我没有为你解答last night in #clojure吗?如果对答案有些不满意,你必须澄清你的问题。

答案 1 :(得分:0)

看起来leiningen通过从用户命名空间中调用它来运行(-main):( ack.doodle / -main)。因此* ns *绑定到用户名称空间。

尝试在项目根目录中运行lein repl。然后运行(-main)并查看会发生什么。 :)