1

我正在学习 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)))))

在 (form-init1248982153229513778.clj:1:1) 处宏扩展 clojure.core/defn 的语法错误。fn - 失败:向量?at: [:fn-tail :arity-n :bodies :params] 规范: :clojure.core.specs.alpha/param-list (fn [n] (loop [loops n acc 1N acc2 0N] (if (<=循环 0) acc (recur (dec loops) (+ acc acc2) acc)))) 失败:向量?在:[:fn-tail :arity-1 :params] 规范::clojure.core.specs.alpha/param-list

一般来说,如果有这样的野兽,有人可以向我指出一些关于 Clojure 的草书文档,这样我就可以自己破译这些错误消息。谢谢你。

4

2 回答 2

2

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

错误消息很神秘,但是如果您解压缩错误消息,您会看到param-listclojure.spec 失败,因为(fn [n] (loop ...它不是vector?

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

clojure 规范指南,但它是针对规范开发人员的。

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

当我看到你的代码时,我 首先defn通过defn在. 该信息以及规范错误让我了解如何解释错误消息。

至于您的代码,使用 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))))
于 2020-11-02T14:16:45.323 回答
1

上面的答案很好。对您未提出的问题的一个建议:您可能希望调整您的 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语句,我喜欢将每个循环变量及其初始值保留在单独的行上。通过这种方式,它看起来类似于 Clojurelet表达式。

享受!

于 2020-11-02T14:38:33.687 回答