问题描述
我正在学习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个制表符?)。
如有必要,请取消选中“使用制表符” 框。这是屏幕截图:
然后它将如下所示:
(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
表达式。
享受!