新手Clojure和leiningen问题:
给定以下代码片段,这可以从lein repl中工作:
==> (-main "something")
生成预期的“命令:something ……运行……完成”,但无法从命令行中使用:
me pallet1]lein run "something"
会产生"Command: something ... error: not resolved as a command"的错误。
为什么?/ 我该如何解决?
复现步骤:
lein new eg
接下来编辑生成的项目文件,添加:main eg.core
来定义主函数,并编辑生成的src/eg/core.clj文件,将以下内容粘贴到其中:
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")
运行works(即打印“Something!”),但是运行lein run something不起作用(即打印“错误:未解析”消息)
something
?你在哪里定义它?如果它不在你的 clj 文件中,并且你在 repl 中定义了它,那么运行lein run
的时候它是不知道它的存在的,因为它只会读取你的 clj 文件。 - Mikita Belahlazau