使用"Lein-run"和"Clojure-M"挂起运行脚本.在REPL中工作


$ lein --version
Leiningen 2.9.10 on Java 17.0.4.1 OpenJDK 64-Bit Server VM
$ clojure -version
Clojure CLI version 1.11.1.1155
$ java -version
openjdk version "17.0.4.1" 2022-08-12
OpenJDK Runtime Environment (build 17.0.4.1+1)
OpenJDK 64-Bit Server VM (build 17.0.4.1+1, mixed mode)

我有一些非常的基本代码正在尝试运行。

(use '[clojure.java.shell :only [sh]])
(defn -main [] (sh "echo" "Hello, World!"))
(-main)

在REPL中,这可预测地返回

{:exit 0, :out "Hello, World!n", :err ""}

然而,当这是脚本的内容(逐字逐句(时,clojure -M只是挂起。取消对ns的注释并尝试将其作为具有lein run的项目运行会产生相同的行为。

我还尝试过使用requires+:refer,并将其与命名空间一起使用。我尝试过用(print (:out (sh "echo" "stuff")))显式打印stdout。

我的项目.clj:

(defproject findbad "0.1.0-SNAPSHOT"
:description "FIXME: write description"
:url "http://example.com/FIXME"
:dependencies [[org.clojure/clojure "1.11.1"]]
:source-paths ["."]
:repl-options {:init-ns findbad}
:main findbad)

和.lein/profile.clj:

{:user {:plugins [
[lein-try "0.4.3"]
[flat-layout/lein-template "1.6.0"]
[simple-layout/lein-template "0.1.0"]]}}

我可以用clojure -M运行以下内容,但lein run -main现在会抛出错误(改进了吗?(。

(ns findbad
(:gen-class))
(use '[clojure.java.shell :only [sh]])
(defn -main [] (print "Hello, World"))
(-main)
{:clojure.main/message
"Execution error (ArityException) at user/eval140 (form-init17641850740462455309.clj:1).nWrong number of args (1) passed to: findbad/-mainn",
:clojure.main/triage
{:clojure.error/class clojure.lang.ArityException,
:clojure.error/line 1,
:clojure.error/cause
"Wrong number of args (1) passed to: findbad/-main",
:clojure.error/symbol user/eval140,
:clojure.error/source "form-init17641850740462455309.clj",
:clojure.error/phase :execution},
:clojure.main/trace
{:via
[{:type clojure.lang.Compiler$CompilerException,
:message
"Syntax error macroexpanding at (/tmp/form-init17641850740462455309.clj:1:74).",
:data
{:clojure.error/phase :execution,
:clojure.error/line 1,
:clojure.error/column 74,
:clojure.error/source "/tmp/form-init17641850740462455309.clj"},
:at [clojure.lang.Compiler load "Compiler.java" 7665]}
{:type clojure.lang.ArityException,
:message "Wrong number of args (1) passed to: findbad/-main",
:at [clojure.lang.AFn throwArity "AFn.java" 429]}],
:trace
[[clojure.lang.AFn throwArity "AFn.java" 429]
[clojure.lang.AFn invoke "AFn.java" 32]
[clojure.lang.Var invoke "Var.java" 384]
[user$eval140 invokeStatic "form-init17641850740462455309.clj" 1]
[user$eval140 invoke "form-init17641850740462455309.clj" 1]
[clojure.lang.Compiler eval "Compiler.java" 7194]
[clojure.lang.Compiler eval "Compiler.java" 7184]
[clojure.lang.Compiler load "Compiler.java" 7653]
[clojure.lang.Compiler loadFile "Compiler.java" 7591]
[clojure.main$load_script invokeStatic "main.clj" 475]
[clojure.main$init_opt invokeStatic "main.clj" 477]
[clojure.main$init_opt invoke "main.clj" 477]
[clojure.main$initialize invokeStatic "main.clj" 508]
[clojure.main$null_opt invokeStatic "main.clj" 542]
[clojure.main$null_opt invoke "main.clj" 539]
[clojure.main$main invokeStatic "main.clj" 664]
[clojure.main$main doInvoke "main.clj" 616]
[clojure.lang.RestFn applyTo "RestFn.java" 137]
[clojure.lang.Var applyTo "Var.java" 705]
[clojure.main main "main.java" 40]],
:cause "Wrong number of args (1) passed to: findbad/-main",
:phase :execution}}

我是如何获得";错误的参数数量"?我不向一个不需要任何东西的函数传递任何东西。

即使我能让(print "Hello, World")的例子发挥作用,那也不是我感兴趣的

编辑:好吧,我不确定我做了什么不同,但我可以让它与(print (:out (sh "echo" "stuff")))一起工作。并用(shutdown-agents)固定悬吊。

您的主函数不接受任何参数([](。Clojure使用导致arity异常的命令行参数列表从cli调用-main。尝试将& args添加到-main参数向量:

(defn -main [& args] (print "Hello, World"))

最新更新