Newbie Clojure和leiningen问题:
鉴于我的项目中的代码片段,这可以从lein repl开始:
==> (-main "something")
产生预期的“命令:某些东西......正在运行...已完成”,但在命令行中无效:
me pallet1]lein run "something"
生成“命令:某事......错误:未解析为命令”
为什么? / 我如何解决它?
重现:
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")
工作(即打印“Something!”),但lein运行的东西没有(即打印“错误:未解决”消息)
2 回答
问题是当你从lein运行它时你的默认命名空间是“user”命名空间:
打印
#<Namespace user>
. 所以它不包含something
函数,因为它来自另一个命名空间 . 你有几个选择:传递完全限定的函数名称:
your-namespace/something
而不是something
.使用
your-namespace
而不是*ns*
:(ns-resolve 'your-namespace (symbol commandname))
在
-main
中将名称空间更改为your-namespace
.方法3的示例:
如果你想逐个调用几个函数,你应该使用do:
不只是像
( (println "hello") (println "World"))
这样的牙套lein exec plugin对于在项目上下文中编写此类内容非常有用 . 我已经广泛使用它在clojure和其他脚本编写情况下编写Jenkins工作