很抱歉问了这么一个基本的问题。希望答案不明显的事实主要是由于 clojure.spec 仍然是 alpha 版本(0.1.134)。
如何在此规范错误消息中找到违规代码的文件名和行号?关键是什么:in
,sc。价值[2 1]
?
#error {
:cause Call to clojure.core/refer-clojure did not conform to spec:
In: [2 1] val: :as fails at: [:args :exclude :op :quoted-spec :spec] predicate: #{:exclude}
In: [2 1] val: :as fails at: [:args :only :op :quoted-spec :spec] predicate: #{:only}
In: [2 1] val: :as fails at: [:args :rename :op :quoted-spec :spec] predicate: #{:rename}
In: [2] val: (quote :as) fails at: [:args :exclude :op :spec] predicate: #{:exclude}
In: [2] val: (quote :as) fails at: [:args :only :op :spec] predicate: #{:only}
In: [2] val: (quote :as) fails at: [:args :rename :op :spec] predicate: #{:rename}
:data #:clojure.spec.alpha{:problems ({:path [:args :exclude :op :spec], :pred #{:exclude}, :val (quote :as), :via [], :in [2]} {:path [:args :exclude :op :quoted-spec :spec], :pred #{:exclude}, :val :as, :via [], :in [2 1]} {:path [:args :only :op :spec], :pred #{:only}, :val (quote :as), :via [], :in [2]} {:path [:args :only :op :quoted-spec :spec], :pred #{:only}, :val :as, :via [], :in [2 1]} {:path [:args :rename :op :spec], :pred #{:rename}, :val (quote :as), :via [], :in [2]} {:path [:args :rename :op :quoted-spec :spec], :pred #{:rename}, :val :as, :via [], :in [2 1]}), :spec #object[clojure.spec.alpha$regex_spec_impl$reify__1188 0x437e951d clojure.spec.alpha$regex_spec_impl$reify__1188@437e951d], :value ((quote :exclude) (quote [reduce into merge map take partition partition-by]) (quote :as) (quote core)), :args ((quote :exclude) (quote [reduce into merge map take partition partition-by]) (quote :as) (quote core))}
...}
输入时出现此错误lein repl
。我对违规行的猜测在这里:
(ns fargish.util
(:refer-clojure :exclude [rand rand-int cond])
(:require [better-cond.core :refer [cond]]
[clojure.tools.trace :refer :all]
[clojure.pprint :refer [pprint]]
[clojure.math.numeric-tower :as math]
[clojure.core.async :as async :refer [<! <!! >! >!!]]
[clojure.java.io :as io]
[clojure.edn :as edn]
[popen :refer [popen] :as po]
[cheshire.core :as ch]
[lonocloud.synthread :as ->]))
因为当我从我在 Clojure 1.8 下运行的目录中复制它时,首先出现了错误消息。此代码在 Clojure 1.8 下工作。
如果我没有这个方便的线索,我想知道如何追踪有问题的文件和行。即使有这个线索,我也不知道该怎么办。我不知道错误是在我的代码、clojure.core/ns 代码还是 clojure.core/ns 中的规范中。还有,In: [2 1]
指的是什么?
更新我发现了错误。我上面的猜测是错误的。该错误甚至不在我的代码中!它在 clojure.core.async 中。我使用的是旧版本:0.2.374。我更改为当前版本 0.3.443,并结束了错误消息。显然,在 Clojure 1.9 之前编写的许多代码都利用了ns
宏中的一些松懈,比如省略了前面的冒号:require
和其他关键字,所以这将是一个常见问题,直到库更新并且依赖项更新以指向更新的库。一个类似的错误出现在popen中(已经修复——这是快速服务!)。
不过,我的问题不是关于这个错误的细节。这是关于一般问题的:如何在不通过像这样的反复试验进行长时间追逐的情况下找到有问题的代码行。