IntelliJ Cursive Clojure 中的语法错误消息

Syntax Error Message in IntelliJ Cursive Clojure

我正在学习 Clojure。我第一次尝试计算斐波那契数。这是我的代码和随后的错误消息。 我不知道要纠正什么。我的问题是:错误消息试图说明什么?

(defn fibon
        (fn [n]
                (loop [loops n acc 1N acc2 0N]
                            (if (<= loops 0)
                                    acc                 ;; Return the summed F number.
                                    (recur (dec loops) (+ acc acc2) acc)))))

Syntax error macroexpanding clojure.core/defn at (form-init1248982153229513778.clj:1:1). fn - failed: vector? at: [:fn-tail :arity-n :bodies :params] spec: :clojure.core.specs.alpha/param-list (fn [n] (loop [loops n acc 1N acc2 0N] (if (<= loops 0) acc (recur (dec loops) (+ acc acc2) acc)))) failed: vector? at: [:fn-tail :arity-1 :params] spec: :clojure.core.specs.alpha/param-list

一般来说,如果有这样的野兽,有人能给我指点一些关于 Clojure in Cursive 的文档吗?这样我就可以自己破译这些错误消息了。谢谢。

您看到的错误消息是 clojure.spec 错误。它告诉您您的代码违反了 defn.

的规范

错误消息是神秘的,但如果您解压缩错误消息,您可以看到 param-list clojure.spec 失败,因为 (fn [n] (loop ... 不是 vector?

这是想告诉你 defn 期望在 fibon 之后看到一个 vector,而不是 (fn [n] (loop ... 这不是最直观的错误信息。

clojure spec guide 但它是针对规范的开发人员的。

还有其他 clojure 项目提供了更直观的规范错误消息。我在命令行中使用了 expound,它提供了更好的错误消息,但是我认为您不能将 expound 与 cursive 一起使用,但这可能值得探索。

当我看到你的代码时,我首先通过在 defn 上执行 ctrl-mouse-over 查看了 defn 宏的定义,或者你可以查看在线defn documentation。该信息以及规范错误让我了解了如何解释错误消息。

至于您的代码,在使用 defn 时您没有使用 (fn。所以你的代码应该是这样的:

(defn fibon [n]
        (loop [loops n acc 1N acc2 0N]
                        (if (<= loops 0)
                                acc                 ;; Return the summed F number.
                                (recur (dec loops) (+ acc acc2) acc))))

上面的回答很好。对您没有提出的问题的一个建议:您可能希望调整您的 IDEA 设置,使其每行仅缩进 2 个空格,而不是 8 个空格(1 个制表符?)。

如有必要,请取消选中 “使用制表符” 复选框。这是屏幕截图:

然后看起来像这样:

(defn fibon
  [n]
  (loop [loops n
         acc   1N
         acc2  0N]
    (if (<= loops 0)
      acc   ;; Return the summed F number.
      (recur (dec loops) (+ acc acc2) acc))))

对于loop 语句,我喜欢将每个循环变量及其初始值放在单独的一行中。通过这种方式,它看起来类似于 Clojure let 表达式。

尽情享受吧!