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
表达式。
尽情享受吧!
我正在学习 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
表达式。
尽情享受吧!