gpt4 book ai didi

Clojure:命名空间和 -main

转载 作者:行者123 更新时间:2023-12-02 18:48:12 25 4
gpt4 key购买 nike

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

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

重现步骤

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

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

  • 运行它:

    lein run

最佳答案

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

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

关于Clojure:命名空间和 -main,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10267358/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com