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用于调用具有单个map参数的函数。在您的示例代码中,您有一个main方法。如果您想使用main方法,则它应有如下签名

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

并且您应该像这样调用它

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

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

我已经看到很多人使用 -X 与main函数(而不是 -main 函数)进行操作,这可能会令人困惑。
0
by

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

您的 deps.edn 中有什么?如果您在它中放置 {},并更改 main 函数的签名以接受参数,如下

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

(并且更新当前函数中的 printlprintln),有什么帮助吗?

...