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

欢迎各位!请访问关于页面了解有关如何使用本问答的更多信息。

0投票
Clojure

我试图按照这里的指南运行简单的 Clojure 程序:https://www.clojure.org/guides/deps_and_cli

我的目录结构如下

└── 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 调用传递进来的。

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)。

我见很多人使用 -X 与 main 函数(而不是 -main 函数)相混淆。
0投票
作者:

这真是令人惊讶。我遇到了一个不同、更预期的错误(《bar/main 接收到的参数数量不正确(1)》)。

你的 deps.edn 中是什么?如果你的它是 {},并且修改 main 函数的签名以接受一个参数,比如

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

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

...