2024 年 Clojure 状态调查!中分享您的想法。

欢迎!请参阅关于页面了解有关如何使用此站点的更多信息。

0
Clojure

我在遵循这个指南:https://www.clojure.org/guides/deps_and_cli,尝试运行一个简单的 Clojure 程序。

我的目录结构如下

└── test-project
	├── deps.edn
	└── src
		└── bar.clj

以及 bar.clj 看起来像这样

(ns bar)
(defn main []
	(printl "hello world"))

然而,当我运行 clj -X bar/main 时,我得到以下错误

Exception in thread "main" java.io.FileNotFoundException: -X (No such file or directory)
	at java.io.FileInputStream.open0(Native Method)
	at java.io.FileInputStream.open(FileInputStream.java:195)
	at java.io.FileInputStream.<init>(FileInputStream.java:138)
	at java.io.FileInputStream.<init>(FileInputStream.java:93)
	at clojure.lang.Compiler.loadFile(Compiler.java:7570)
	at clojure.main$load_script.invokeStatic(main.clj:452)
	at clojure.main$script_opt.invokeStatic(main.clj:512)
	at clojure.main$script_opt.invoke(main.clj:507)
	at clojure.main$main.invokeStatic(main.clj:598)
	at clojure.main$main.doInvoke(main.clj:561)
	at clojure.lang.RestFn.applyTo(RestFn.java:137)
	at clojure.lang.Var.applyTo(Var.java:705)
	at clojure.main.main(main.java:37)

我错在哪里了?

2 个答案

+1

被选定
 
最佳答案

您需要更新到支持 -X 的新版 clj。

并且将 main 改为接受一个参数,该参数是从 -X 调用中传递的 "exec args" 的哈希表

clojure -X bar/main :val 123

将使用 {:val 123} 作为单个参数调用您的 main 函数。
“-X”用于调用接收单个映射参数的功能。在您的示例代码中,您有一个 main 方法。如果您想使用 main 方法,它应该具有以下签名:

    (ns hello)
    (defn -main [& args] ...)

并且您应该这样调用它:

    clj -M -m hello
这里应该是 main 而不是 -main,因此它 _可以_ 仅接受单个参数时用 -X 调用它。

或者,如果将 main 改为 -main(以及可能根据是否需要它接受参数添加 & args),则可以使用 -M -m 来调用它。

我看见很多人用 -X 与 main 函数(而不是 -main 函数)一起使用,这肯定会有点让人困惑。
0

这很令人惊讶。我得到了一个不同、更符合预期的错误(传递给:bar/main 的参数数量不正确(1))。

您的 deps.edn 中有什么?如果您将它放在其中,并将 main 函数的签名更改为接受参数,例如

(defn main [opts]
  (println "Hello, world"))

(也更新你的当前函数中的 printlprintln),有结果吗?

...