2024 State of Clojure 问卷调查 中分享您的想法!

欢迎!请参阅 关于 页面以获取更多关于如何使用此平台的信息。

0 投票
ClojureScript
我可以用符号 {{&}} 来命名某个东西,但如果尝试调用它,会出现以下异常


异常在 "main" 线程中产生: clojure.lang.ExceptionInfo: 编译文件失败:src/amp/core.cljs {:file #object[java.io.File 0x5e63cad "src/amp/core.cljs"]}, 编译:(/home/madstap/code/ampersand/build.clj:3:1)
    在 clojure.lang.Compiler.load(Compiler.java:7391)
    在 clojure.lang.Compiler.loadFile(Compiler.java:7317)
    在 clojure.main$load_script.invokeStatic(main.clj:275)
    在 clojure.main$script_opt.invokeStatic(main.clj:335)
    在 clojure.main$script_opt.invoke(main.clj:330)
    在 clojure.main$main.invokeStatic(main.clj:421)
    在 clojure.main$main.doInvoke(main.clj:384)
    在 clojure.lang.RestFn.invoke(RestFn.java:408)
    在 clojure.lang.Var.invoke(Var.java:379)
    在 clojure.lang.AFn.applyToHelper(AFn.java:154)
    在 clojure.lang.Var.applyTo(Var.java:700)
    在 clojure.main.main(main.java:37)
由:clojure.lang.ExceptionInfo: 编译文件失败:src/amp/core.cljs {:file #object[java.io.File 0x5e63cad "src/amp/core.cljs"]}
    在 clojure.core$ex_info.invokeStatic(core.clj:4617)
    在 cljs.compiler$compile_file$fn__3147.invoke(compiler.cljc:1406)
    在 cljs.compiler$compile_file.invokeStatic(compiler.cljc:1376)
    在 cljs.closure$compile_file.invokeStatic(closure.clj:430)
    在 cljs.closure$fn__4204.invokeStatic(closure.clj:497)
    在 cljs.closure$fn__4204.invoke(closure.clj:493)
    在 cljs.closure$fn__4146$G__4139__4153.invoke(closure.clj:389)
    在 cljs.closure$compile_sources$iter__4315__4319$fn__4320.invoke(closure.clj:829)
    在 clojure.lang.LazySeq.sval(LazySeq.java:40)
    在 clojure.lang.LazySeq.seq(LazySeq.java:49)
    在 clojure.lang.Cons.next(Cons.java:39)
    在 clojure.lang.RT.next(RT.java:688)
    在 clojure.core$next__4341.invokeStatic(core.clj:64)
    在 clojure.core$dorun.invokeStatic(core.clj:3033)
    在 clojure.core$doall.invokeStatic(core.clj:3039)
    在 cljs.closure$compile_sources.invokeStatic(closure.clj:826)
    在 cljs.closure$build.invokeStatic(closure.clj:1942)
    在 cljs.build.api$build.invokeStatic(api.clj:198)
    在 cljs.build.api$build.invoke(api.clj:187)
    在 cljs.build.api$build.invokeStatic(api.clj:190)
    在 cljs.build.api$build.invoke(api.clj:187)
    在 user$eval24.invokeStatic(build.clj:3)
    在 user$eval24.invoke(build.clj:3)
    在 clojure.lang.Compiler.eval(Compiler.java:6927)
    在 clojure.lang.Compiler.load(Compiler.java:7379)
    ... 11 个更多
原因:clojure.lang.ExceptionInfo: 多态方法 'parse' 中没有方法对应于分发值:& 在 src/amp/core.cljs 的第 5 行,:file "src/amp/core.cljs",:line 5,:column 1,:tag :cljs/analysis-error}
    在 clojure.core$ex_info.invokeStatic(core.clj:4617)
    在 cljs.analyzer$error.invokeStatic(analyzer.cljc:628)
    在 cljs.analyzer$analyze_seq_STAR__wrap.invokeStatic(analyzer.cljc:2871)
    在 cljs.analyzer$analyze_seq.invokeStatic(analyzer.cljc:2892)
    在 cljs.analyzer$analyze_form.invokeStatic(analyzer.cljc:3011)
    在 cljs.analyzer$analyze_STAR_.invokeStatic(analyzer.cljc:3056)
    在 cljs.analyzer$analyze.invokeStatic(analyzer.cljc:3073)
    在 cljs.compiler$emit_source.invokeStatic(compiler.cljc:1255)
    在 cljs.compiler$compile_file_STAR_$fn__3124.invoke(compiler.cljc:1325)
    在 cljs.compiler$with_core_cljs.invokeStatic(compiler.cljc:1159)
    在 cljs.compiler$compile_file_STAR_.invokeStatic(compiler.cljc:1316)
    在 cljs.compiler$compile_file$fn__3147.invoke(compiler.cljc:1396)
    ... 34 更多
原因:java.lang.IllegalArgumentException: multimethod 'parse' 中不存在用于分发的方法,分发值为: &
    在 clojure.lang.MultiFn.getFn(MultiFn.java:156)
    在 clojure.lang.MultiFn.invoke(MultiFn.java:251)
    在 cljs.analyzer$analyze_seq_STAR_.invokeStatic(analyzer.cljc:2867)
    在 cljs.analyzer$analyze_seq_STAR__wrap.invokeStatic(analyzer.cljc:2870)
    ... 43 更多

3 答案

0 投票
by

评论由:madstap 制作

更详细的解释如下,由于无法编辑描述: https://gist.github.com/madstap/c77581185afa7fea8bbf2556f2d9fafe

0 投票
by
_评论由:mfikes_ 制作

如果 ClojureScript 的符号遵循 Clojure 的约束(《 clojure.org/reference/reader#_symbols》),那么 {{&}} 不是一个有效的符号。

当然,(type (second (second '(fn [f & r])))) 的类型是 {{cljs.core/Symbol}},但这可能是一个例外,为 Clojure 保留使用。
0 投票
by
参考:https://clojure.atlassian.net/browse/CLJS-1889(由 alex+import 提出)
...