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 函数。
by
"-X" 是用来调用带有一个映射参数的函数。在你的示例代码中,你有 `main` 方法。如果你想使用 `main` 方法,它应该具有类似的签名,比如:

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

并且应该像这样调用它:

    clj -M -m hello
函数名是 main 而不是 -main,因此它 _可以_ 通过 -X 调用它,如果它接受单个参数的话。

或者,它也可以通过 -M -m 调用它,如果它修改 main 为 -main(并且可能根据是否需要接受参数添加 & args)。

我见过很多的人使用 -X 与 main 函数(非 -main 函数)配合使用,这肯定会导致混淆。
0

这确实令人惊讶。我遇到了一个不同、更令人期待的错误(将错误的参数数(1)传递给:bar/main)。

你在 `deps.edn` 中放什么?如果你放入 {},并改变你的 `main` 函数签名以接受参数,比如:

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

(以及更新当前函数中的 printlprintln), 你有什么运气?

...