2024 年 Clojure 状态调查!中分享您的想法。

欢迎!有关此 Works 的更多信息,请参阅关于页面。

+5
错误

我意外地将`nth`的参数放置错误,并显示了以下错误和堆栈跟踪

  Show: Project-Only All 
  Hide: Clojure Java REPL Tooling Duplicates  (0 frames hidden)

2. Unhandled clojure.lang.Compiler$CompilerException
   Error compiling NO_SOURCE_FILE at (79:3)
   #:clojure.error{:phase :execution,
                   :line 79,
                   :column 3,
                   :source "NO_SOURCE_FILE"}
             Compiler.java: 3719  clojure.lang.Compiler$InvokeExpr/eval
             Compiler.java:  457  clojure.lang.Compiler$DefExpr/eval
             Compiler.java: 7199  clojure.lang.Compiler/eval
             Compiler.java: 7149  clojure.lang.Compiler/eval
                  core.clj: 3215  clojure.core/eval
                  core.clj: 3211  clojure.core/eval
    interruptible_eval.clj:   87  nrepl.middleware.interruptible-eval/evaluate/fn/fn
                  AFn.java:  152  clojure.lang.AFn/applyToHelper
                  AFn.java:  144  clojure.lang.AFn/applyTo
                  core.clj:  667  clojure.core/apply
                  core.clj: 1990  clojure.core/with-bindings*
                  core.clj: 1990  clojure.core/with-bindings*
               RestFn.java:  425  clojure.lang.RestFn/invoke
    interruptible_eval.clj:   87  nrepl.middleware.interruptible-eval/evaluate/fn
                  main.clj:  437  clojure.main/repl/read-eval-print/fn
                  main.clj:  437  clojure.main/repl/read-eval-print
                  main.clj:  458  clojure.main/repl/fn
                  main.clj:  458  clojure.main/repl
                  main.clj:  368  clojure.main/repl
               RestFn.java: 1523  clojure.lang.RestFn/invoke
    interruptible_eval.clj:   84  nrepl.middleware.interruptible-eval/evaluate
    interruptible_eval.clj:   56  nrepl.middleware.interruptible-eval/evaluate
    interruptible_eval.clj:  152  nrepl.middleware.interruptible-eval/interruptible-eval/fn/fn
                  AFn.java:   22  clojure.lang.AFn/run
               session.clj:  202  nrepl.middleware.session/session-exec/main-loop/fn
               session.clj:  201  nrepl.middleware.session/session-exec/main-loop
                  AFn.java:   22  clojure.lang.AFn/run
               Thread.java:  829  java.lang.Thread/run

1. Caused by java.lang.ClassCastException
   class clojure.lang.PersistentVector cannot be cast to class
   java.lang.Number (clojure.lang.PersistentVector is in unnamed module of
   loader 'app'; java.lang.Number is in module java.base of loader
   'bootstrap')

                      REPL:   82  advent-of-clerk.year-2023.day-04/fn
                      REPL:   79  advent-of-clerk.year-2023.day-04/fn
                  AFn.java:  152  clojure.lang.AFn/applyToHelper
                  AFn.java:  144  clojure.lang.AFn/applyTo
             Compiler.java: 3714  clojure.lang.Compiler$InvokeExpr/eval
             Compiler.java:  457  clojure.lang.Compiler$DefExpr/eval
             Compiler.java: 7199  clojure.lang.Compiler/eval
             Compiler.java: 7149  clojure.lang.Compiler/eval
                  core.clj: 3215  clojure.core/eval
                  core.clj: 3211  clojure.core/eval
    interruptible_eval.clj:   87  nrepl.middleware.interruptible-eval/evaluate/fn/fn
                  AFn.java:  152  clojure.lang.AFn/applyToHelper
                  AFn.java:  144  clojure.lang.AFn/applyTo
                  core.clj:  667  clojure.core/apply
                  core.clj: 1990  clojure.core/with-bindings*
                  core.clj: 1990  clojure.core/with-bindings*
               RestFn.java:  425  clojure.lang.RestFn/invoke
    interruptible_eval.clj:   87  nrepl.middleware.interruptible-eval/evaluate/fn
                  main.clj:  437  clojure.main/repl/read-eval-print/fn
                  main.clj:  437  clojure.main/repl/read-eval-print
                  main.clj:  458  clojure.main/repl/fn
                  main.clj:  458  clojure.main/repl
                  main.clj:  368  clojure.main/repl
               RestFn.java: 1523  clojure.lang.RestFn/invoke
    interruptible_eval.clj:   84  nrepl.middleware.interruptible-eval/evaluate
    interruptible_eval.clj:   56  nrepl.middleware.interruptible-eval/evaluate
    interruptible_eval.clj:  152  nrepl.middleware.interruptible-eval/interruptible-eval/fn/fn
                  AFn.java:   22  clojure.lang.AFn/run
               session.clj:  202  nrepl.middleware.session/session-exec/main-loop/fn
               session.clj:  201  nrepl.middleware.session/session-exec/main-loop
                  AFn.java:   22  clojure.lang.AFn/run
               Thread.java:  829  java.lang.Thread/run

由于我同时在更改几件事情,所以我很难发现问题。最终我意识到我放置了集合和`nth`的索引参数,但是堆栈跟踪对我帮助不大:没有提到对`nth`的调用,行号也没有直接指向有问题的行。

完整的示例代码在此:https://github.com/a1exsh/advent-of-clerk/blob/cddd42fcd60da2efcda37f222666328cd37fb616/src/advent_of_clerk/year_2023/day_04.clj#L84(这是正确的代码——要获得错误,请按以下方式交换参数:(nth i untouched)

我在使用CIDER(Emacs)的`C-x C-e`命令评估单个循环形式时遇到这个问题。

当然,在REPL中可以很容易地重现,就像这样

user> (nth 0 [])
Execution error (ClassCastException) at user/eval22783 (REPL:42).
class clojure.lang.PersistentVector cannot be cast to class java.lang.Number (clojure.lang.PersistentVector is in unnamed module of loader 'app'; java.lang.Number is in module java.base of loader 'bootstrap')

2 答案

+1

为此问题创建了 Jira 任务CLJ-2822

0

这与其说是答案,不如说是长笔记。是的,我同意如果行号精确,或者至少打印出实际的问题形式或至少函数名会更有帮助。

有些讽刺 - 我不能按照 README 中描述的那样开始你的项目,因为 Clerk 会给我无用的详细信息,引发 Unhandled java.util.concurrent.RejectedExecutionException。但没关系,我只是使用了一个常规的 REPL。

你看到的最顶部错误使用了“异常美化器”,这通常会使问题更难解决,所以我建议丢弃它。在我看来,它并没有多大帮助,因为它以特定方式格式化异常并省略了一些不很有用的帧,而且它省略了有用的东西,这肯定是无益的。

完整的异常包括以下这条信息: Syntax error macroexpanding at (day_04.clj:79:3).
这并不多,报告的行号“大致正确”而不是精确,但这可能是帮助你解决问题的细节。
在这种情况下,唯一接近该行的形式,既能与向量又能与数字一起使用的是 (nth ...),错误源于宏展开,因为 nth:inline 元数据。

我没有得到关于宏展开的错误,但这不是与 `loop` 有关吗?
尝试以顶级形式加载一个命名空间,使用 `(nth 0 [])` - 你将得到关于宏展开的异常。展开 `loop` 宏不会导致这种错误,因为它不关心 `nth` 的类型。
请注意,我不仅仅是将这段代码发送到REPL - 我加载了整个文件,据我所知,这相当于加载了该命名空间。我怀疑这就是为什么我看到了宏展开错误,而你却没有 - 如果我仅仅是评估 `(nth 0 [])`,我也看不到它。这也可能是因为不同的工具之间的差异 - 我使用的是普通的`clj`REPL或Cursive提供的REPL。CIDER一无所知。
...