IntelliJ草书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)))))

语法错误,宏扩展为clojure.core / defn (form-init1248982153229513778.clj:1:1)。 FN-失败:向量?在: [:fn-tail:arity-n:body:params]规格: :clojure.core.specs.alpha / param-list(fn [n](循环[循环n acc 1N acc2 0N](如果(

总的来说,有人可以请我指向草书中有关Clojure的一些文档,以便在有野兽的情况下自己解密这些错误消息。谢谢。

解决方法

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

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

这是想告诉您defn应该在vector之后看到fibon,而不是(fn [n] (loop ...,这不是最直观的错误消息。

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

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

看到您的代码时,我首先通过在defn上进行ctrl-mouse-over来查看defn宏的定义,或者您可以在线查看{{ 3}}。这些信息以及说明错误使我了解如何解释错误消息。

对于您的代码,使用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个制表符?)。

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

enter image description here

然后它将如下所示:

(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表达式。

享受!