4

我试图了解 -main 及其命名空间设置。-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) 成功,但显然符号 'fo 在当前命名空间 *ns* 中是未知的。这是怎么回事?

当我尝试将某些函数的名称以及一些参数作为命令行参数传递给 -main 时,这个问题就出现了。

重现步骤

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

    (defproject ack "1" :main ack.doodle)

  • 运行:

    来跑

4

2 回答 2

0

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

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

于 2012-04-22T11:46:17.783 回答
0

我昨晚不是在#clojure 中为你回答了这个问题吗?如果对答案有什么不满意的地方,你必须澄清你的问题。

于 2012-04-22T22:50:20.737 回答