初歩的な質問で申し訳ありません。うまくいけば、答えが明らかでないという事実は、主に clojure.spec がまだアルファ版 (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 に変更したところ、エラー メッセージは終了しました。ns
どうやら、Clojure 1.9 より前に書かれた多くのコードは、コロンの前や他のキーワードを省略するなど、マクロの緩みを悪用している:require
ため、ライブラリが更新され、依存関係が更新されたライブラリを指すように更新されるまで、これは一般的な問題になるでしょう。同様のエラーがpopenにもありました(既に修正済みです。これは迅速なサービスでした!)。
ただし、私の質問は、このエラーの詳細に関するものではありません。それは一般的な問題についてです: このような試行錯誤による長い追跡をせずに問題のあるコード行を見つける方法.