请分享您的想法2024 State of Clojure 调查!

欢迎!请查阅关于页面以获取更多关于如何操作的信息。

+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提供的那个。对CIDER一无所知。
...