4

初歩的な質問で申し訳ありません。うまくいけば、答えが明らかでないという事実は、主に 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にもありました(既に修正済みです。これは迅速なサービスでした!)。

ただし、私の質問は、このエラーの詳細に関するものではありません。それは一般的な問題についてです: このような試行錯誤による長い追跡をせずに問題のあるコード行を見つける方法.

4

1 に答える 1

2

フォームに間違いを犯した場合にns表示されるエラー メッセージは、非常に悪いものです (「平均的な」Clojure エラー メッセージよりも悪い)。私が見つけた唯一の解決策は、テスト実行間の変更の数を非常に制限することです。

私が使用したもう 1 つの手法は、コピーできる正しいコードの例を Google で検索することです。この正しい構文を見つけるために、今日その手法を使用しました。

(ns xyz
  (:require
    [clojure.spec.alpha :as sp]
    [clojure.spec.gen.alpha :as gen]
    [clojure.spec.test.alpha :as stest] ))

(stest/check `i/truthy? {:clojure.spec.test.check/opts {:num-tests 99}})

ステートメントとは異なり、requireキーワード名前空間に「alpha」がないため、さらに混乱することに注意してください。オンライン ドキュメントから正しい答えを推測してみてください。

使用法: (check) (check sym-or-syms) (check sym-or-syms opts) sym-or-syms、シンボル、またはシンボルのコレクションによって名前が付けられた変数の仕様適合性について生成テストを実行します。sym-or-syms が指定されていない場合は、すべてのチェック可能な変数をチェックします。

opts マップには次のオプションのキーが含まれています。stc は clojure.spec.test.check のエイリアスです。

::stc/opts は、test.check/quick-check :gen
マップをスペック名からジェネレーター オーバーライドにフローすることを選択します。

::stc/opts には、test.check で文書化されたキーに加えて、:num-tests が含まれています。ジェネレーターのオーバーライドは、関数の引数を生成するときに spec/gen に渡されます。

他のすべてが失敗した場合は、機能する超最小限のケースを見つけるという昔ながらの手法を使用し、失敗するまで目標に向けて一度に1つの小さな変更を追加するしかありません. lein私はしばしば、新しいクリーンなプロジェクトでこのような実験を行う方が簡単だと思うので、問題を混乱させる未知の問題はないと確信しています.


PSいつでも誰かに尋ねることができます。次の 1 つ以上を選択します。

于 2017-10-08T00:42:31.003 に答える