【问题标题】:Syntax Error Message in IntelliJ Cursive ClojureIntelliJ Cursive Clojure 中的语法错误消息
【发布时间】:2021-02-15 04:49:12
【问题描述】:

我正在学习 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 处的语法错误 (表单-init1248982153229513778.clj:1:1)。 fn - 失败:向量?在: [:fn-tail :arity-n :bodies :params] 规格: :clojure.core.specs.alpha/param-list (fn [n] (loop [loops n acc 1N acc2 0N] (if (

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

【问题讨论】:

    标签: intellij-idea clojure cursive


    【解决方案1】:

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

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

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

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

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

    当我看到你的代码时,我首先通过在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))))
    

    【讨论】:

    • 这很棒。要归档的三个新事实:ctrl+click 以查看语法定义、查找错误消息中的问号以及 clojure.core 后面的内容。当你说“它应该是一个向量”时,我清楚地知道我做错了什么。感谢您花时间帮助我。现在我必须把它向前传递。
    • 那个?是 clojure 规范语法和规范文档的一部分,“? - 谓词/模式的 0 或 1”
    【解决方案2】:

    上面的答案很好。对您没有提出的问题的一个建议:您可能希望调整您的 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 非常密集,难以阅读。像这样扩展参数会更容易一些。
    猜你喜欢
    • 1970-01-01
    • 2016-09-23
    • 1970-01-01
    • 2015-07-13
    • 1970-01-01
    • 2021-01-01
    • 2013-06-22
    • 1970-01-01
    • 2011-09-14
    相关资源
    最近更新 更多