$ clj
Clojure 1.10.1
user=> (-> :hmm (fn [x] x))
Syntax error macroexpanding clojure.core/fn at (REPL:1:1).
:hmm - failed: vector? at: [:fn-tail :arity-1 :params] spec: :clojure.core.specs.alpha/param-list
:hmm - failed: (or (nil? %) (sequential? %)) at: [:fn-tail :arity-n] spec: :clojure.core.specs.alpha/params+body
$ clj --main cljs.main --repl
cljs.user=> (-> :hmm (fn [x] x))
Unexpected error (IllegalArgumentException) macroexpanding cljs.core/fn at (<cljs repl>:1:11).
Parameter declaration :hmm should be a vector
一种解决方法是在 lambda 外面再包一层括号,例如 ((fn [x] x))
我尝试用 git 中的最新版 spec.alpha 运行 clojure,但它没有启动。因此,我不确定如何尝试调试这个问题。
deps.edn
{:deps {org.clojure/clojure {:mvn/version "1.10.1"
:exclusions [org.clojure/spec.alpha]}
org.clojure/clojurescript {:git/url "https://github.com/clojure/clojurescript"
:sha "dcc8e61c79bfc701fe9e1414fe5db93edf6f1853"}
org.clojure/spec.alpha {:git/url "https://github.com/clojure/spec.alpha"
:sha "cd4aeb7edccbf7a881dcdc3c947313359508db3a"}}}
交互式环境
$ clj
Exception in thread "main" java.lang.ExceptionInInitializerError
at java.base/java.lang.Class.forName0(Native Method)
at java.base/java.lang.Class.forName(Class.java:398)
at clojure.lang.RT.classForName(RT.java:2211)
at clojure.lang.RT.classForName(RT.java:2220)
at clojure.lang.RT.loadClassForName(RT.java:2239)
at clojure.lang.RT.load(RT.java:449)
at clojure.lang.RT.load(RT.java:424)
at clojure.core$load$fn__6839.invoke(core.clj:6126)
at clojure.core$load.invokeStatic(core.clj:6125)
at clojure.core$load.doInvoke(core.clj:6109)
at clojure.lang.RestFn.invoke(RestFn.java:408)
at clojure.core$load_one.invokeStatic(core.clj:5908)
at clojure.core$load_one.invoke(core.clj:5903)
at clojure.core$load_lib$fn__6780.invoke(core.clj:5948)
at clojure.core$load_lib.invokeStatic(core.clj:5947)
at clojure.core$load_lib.doInvoke(core.clj:5928)
at clojure.lang.RestFn.applyTo(RestFn.java:142)
at clojure.core$apply.invokeStatic(core.clj:667)
at clojure.core$load_libs.invokeStatic(core.clj:5985)
at clojure.core$load_libs.doInvoke(core.clj:5969)
at clojure.lang.RestFn.applyTo(RestFn.java:137)
at clojure.core$apply.invokeStatic(core.clj:667)
at clojure.core$require.invokeStatic(core.clj:6007)
at clojure.core.server$loading__6721__auto____8842.invoke(server.clj:9)
at clojure.core.server__init.load(Unknown Source)
at clojure.core.server__init.<clinit>(Unknown Source)
at java.base/java.lang.Class.forName0(Native Method)
at java.base/java.lang.Class.forName(Class.java:398)
at clojure.lang.RT.classForName(RT.java:2211)
at clojure.lang.RT.classForName(RT.java:2220)
at clojure.lang.RT.loadClassForName(RT.java:2239)
at clojure.lang.RT.load(RT.java:449)
at clojure.lang.RT.load(RT.java:424)
at clojure.core$load$fn__6839.invoke(core.clj:6126)
at clojure.core$load.invokeStatic(core.clj:6125)
at clojure.core$load.doInvoke(core.clj:6109)
at clojure.lang.RestFn.invoke(RestFn.java:408)
at clojure.core$load_one.invokeStatic(core.clj:5908)
at clojure.core$load_one.invoke(core.clj:5903)
at clojure.core$load_lib$fn__6780.invoke(core.clj:5948)
at clojure.core$load_lib.invokeStatic(core.clj:5947)
at clojure.core$load_lib.doInvoke(core.clj:5928)
at clojure.lang.RestFn.applyTo(RestFn.java:142)
at clojure.core$apply.invokeStatic(core.clj:667)
at clojure.core$load_libs.invokeStatic(core.clj:5985)
at clojure.core$load_libs.doInvoke(core.clj:5969)
at clojure.lang.RestFn.applyTo(RestFn.java:137)
at clojure.core$apply.invokeStatic(core.clj:667)
at clojure.core$require.invokeStatic(core.clj:6007)
at clojure.core$require.doInvoke(core.clj:6007)
at clojure.lang.RestFn.invoke(RestFn.java:408)
at clojure.lang.Var.invoke(Var.java:384)
at clojure.lang.RT.doInit(RT.java:491)
at clojure.lang.RT.init(RT.java:467)
at clojure.main.main(main.java:38)
Caused by: Syntax error macroexpanding clojure.core/defn at (clojure/spec/alpha.clj:85:1).
at clojure.lang.Compiler.checkSpecs(Compiler.java:6972)
at clojure.lang.Compiler.macroexpand1(Compiler.java:6988)
at clojure.lang.Compiler.macroexpand(Compiler.java:7075)
at clojure.lang.Compiler.eval(Compiler.java:7161)
at clojure.lang.Compiler.load(Compiler.java:7636)
at clojure.lang.RT.loadResourceScript(RT.java:381)
at clojure.lang.RT.loadResourceScript(RT.java:372)
at clojure.lang.RT.load(RT.java:459)
at clojure.lang.RT.load(RT.java:424)
at clojure.core$load$fn__6839.invoke(core.clj:6126)
at clojure.core$load.invokeStatic(core.clj:6125)
at clojure.core$load.doInvoke(core.clj:6109)
at clojure.lang.RestFn.invoke(RestFn.java:408)
at clojure.core$load_one.invokeStatic(core.clj:5908)
at clojure.core$load_one.invoke(core.clj:5903)
at clojure.core$load_lib$fn__6780.invoke(core.clj:5948)
at clojure.core$load_lib.invokeStatic(core.clj:5947)
at clojure.core$load_lib.doInvoke(core.clj:5928)
at clojure.lang.RestFn.applyTo(RestFn.java:142)
at clojure.core$apply.invokeStatic(core.clj:667)
at clojure.core$load_libs.invokeStatic(core.clj:5985)
at clojure.core$load_libs.doInvoke(core.clj:5969)
at clojure.lang.RestFn.applyTo(RestFn.java:137)
at clojure.core$apply.invokeStatic(core.clj:667)
at clojure.core$require.invokeStatic(core.clj:6007)
at clojure.main$loading__6721__auto____8974.invoke(main.clj:11)
at clojure.main__init.load(Unknown Source)
at clojure.main__init.<clinit>(Unknown Source)
... 55 more
Caused by: java.lang.Exception: #object[clojure.spec.alpha$and_spec_impl$reify__1049 0x1292071f "clojure.spec.alpha$and_spec_impl$reify__1049@1292071f"] is not a fn, expected predicate fn
at clojure.spec.alpha$dt.invokeStatic(alpha.clj:769)
at clojure.spec.alpha$dt.invoke(alpha.clj:759)
at clojure.spec.alpha$dt.invokeStatic(alpha.clj:760)
at clojure.spec.alpha$dt.invoke(alpha.clj:759)
at clojure.spec.alpha$deriv.invokeStatic(alpha.clj:1534)
at clojure.spec.alpha$deriv.invoke(alpha.clj:1528)
at clojure.spec.alpha$deriv.invokeStatic(alpha.clj:1542)
at clojure.spec.alpha$deriv.invoke(alpha.clj:1528)
at clojure.spec.alpha$deriv$fn__1291.invoke(alpha.clj:1544)
at clojure.core$map$fn__5866.invoke(core.clj:2755)
at clojure.lang.LazySeq.sval(LazySeq.java:42)
at clojure.lang.LazySeq.seq(LazySeq.java:51)
at clojure.lang.RT.seq(RT.java:535)
at clojure.core$seq__5402.invokeStatic(core.clj:137)
at clojure.core$map$fn__5873.invoke(core.clj:2763)
at clojure.lang.LazySeq.sval(LazySeq.java:42)
at clojure.lang.LazySeq.seq(LazySeq.java:51)
at clojure.lang.RT.seq(RT.java:535)
at clojure.core$seq__5402.invokeStatic(core.clj:137)
at clojure.core$filter$fn__5893.invoke(core.clj:2809)
at clojure.lang.LazySeq.sval(LazySeq.java:42)
at clojure.lang.LazySeq.seq(LazySeq.java:51)
at clojure.lang.RT.seq(RT.java:535)
at clojure.core$seq__5402.invokeStatic(core.clj:137)
at clojure.core$map$fn__5866.invoke(core.clj:2746)
at clojure.lang.LazySeq.sval(LazySeq.java:42)
at clojure.lang.LazySeq.seq(LazySeq.java:51)
at clojure.lang.RT.seq(RT.java:535)
at clojure.core$seq__5402.invokeStatic(core.clj:137)
at clojure.core$seq__5402.invoke(core.clj:137)
at clojure.spec.alpha$filter_alt.invokeStatic(alpha.clj:1431)
at clojure.spec.alpha$filter_alt.invoke(alpha.clj:1425)
at clojure.spec.alpha$alt_STAR_.invokeStatic(alpha.clj:1435)
at clojure.spec.alpha$alt_STAR_.invoke(alpha.clj:1434)
at clojure.spec.alpha$deriv.invokeStatic(alpha.clj:1544)
at clojure.spec.alpha$deriv.invoke(alpha.clj:1528)
at clojure.spec.alpha$deriv.invokeStatic(alpha.clj:1542)
at clojure.spec.alpha$deriv.invoke(alpha.clj:1528)
at clojure.spec.alpha$deriv.invokeStatic(alpha.clj:1543)
at clojure.spec.alpha$deriv.invoke(alpha.clj:1528)
at clojure.spec.alpha$deriv.invokeStatic(alpha.clj:1543)
at clojure.spec.alpha$deriv.invoke(alpha.clj:1528)
at clojure.spec.alpha$re_conform.invokeStatic(alpha.clj:1669)
at clojure.spec.alpha$re_conform.invoke(alpha.clj:1660)
at clojure.spec.alpha$regex_spec_impl$reify__1375.conform_STAR_(alpha.clj:1710)
at clojure.spec.alpha$conform.invokeStatic(alpha.clj:171)
at clojure.spec.alpha$conform.invoke(alpha.clj:167)
at clojure.spec.alpha$macroexpand_check.invokeStatic(alpha.clj:708)
at clojure.spec.alpha$macroexpand_check.invoke(alpha.clj:704)
at clojure.lang.AFn.applyToHelper(AFn.java:156)
at clojure.lang.AFn.applyTo(AFn.java:144)
at clojure.lang.Var.applyTo(Var.java:705)
at clojure.lang.Compiler.checkSpecs(Compiler.java:6970)
... 82 more