(-main "something") 产生预期的“命令:某事......正-6ren">
gpt4 book ai didi

clojure - lein repl (-main "something") 和 lein run "something"之间的区别

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

新手 Clojure 和 leiningen 问题:

鉴于我下面项目中的代码片段,这适用于 lein repl :

==> (-main "something")

产生预期的“命令:某事......正在运行......完成”
但在命令行中不起作用:
me pallet1]lein run "something"

产生“命令:某事......错误:未解析为命令”

为什么?/我如何解决它?

重现:
lein new eg

然后编辑生成的项目文件,添加 :main eg.core定义主函数,并编辑生成的 src/eg/core.clj 文件,并将其粘贴到:

核心文件
(ns eg.core)
(defn something [] (println "Something!"))

(defn run-command-if-any [^String commandname]
(printf "Command: %s ..." commandname)
(if-let [cmd (ns-resolve *ns* (symbol commandname))]
(
(println "running ...") (cmd) (println "done.")
)
(println "error: not resolved as a command.")
))
(defn -main [ commandname ] (run-command-if-any commandname))

然后
lein repl
eg.core=> (-main "something")

有效(即打印 "Something!) ,但是
莱恩跑东西
不(即打印“错误:未解决”消息)

最佳答案

问题是当你从 lein 运行它时,你的默认命名空间是“user”命名空间:

(defn -main [ commandname ] (println *ns*))

版画 #<Namespace user> .所以它不包含 something函数,因为它来自另一个命名空间。您有多种选择:
  • 传递完全限定的函数名称:your-namespace/something而不是 something .
  • 使用 your-namespace而不是 *ns* :(ns-resolve 'your-namespace (symbol commandname))
  • 将命名空间更改为 your-namespace-main .

  • 方法 3 的示例:
    (defn -main [ commandname ] 
    (in-ns 'your-namespace)
    (run-command-if-any commandname))

    另外,如果您想一个一个地调用多个函数,您应该使用:
    (do (println "Hello")
    (println "World"))

    不仅仅是像 ( (println "hello") (println "World")) 这样的大括号

    关于clojure - lein repl (-main "something") 和 lein run "something"之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14363998/

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