2017-10-07 7 views
2

이런 초등 질문은 죄송합니다. 바라건대 해답이 분명하지 않다는 사실은 주로 clojure.spec이 여전히 알파 버전 (0.1.134)으로 인한 것입니다.Clojure spec 오류 메시지 : filename? 줄 번호? 의미 : in?

이 사양 오류 메시지에서 문제 코드의 파일 이름과 줄 번호를 어떻게 찾을 수 있습니까? :in 키의 의미는 무엇입니까? 값 [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 [email protected]], :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 이전에 작성된 많은 코드는 :require 및 기타 키워드 이전에 콜론을 생략하는 것과 같이 ns 매크로의 일부 느슨 함을 악용하기 때문에 라이브러리가 업데이트되고 종속성이 업데이트 될 때까지 일반적인 문제가 될 것입니다 라이브러리. 유사한 오류가 popen (이미 수정되었습니다 - 빠른 서비스였습니다!)에있었습니다.

제 질문은이 오류의 세부 사항이 아닙니다. 일반적인 문제입니다. 예를 들어 시행 착오를 거쳐 긴 추격을 거치지 않고 문제가되는 코드 줄을 찾는 방법입니다.

답변

2

ns 양식에서 실수를하면 오류 메시지가 악명이 높습니다 ("평균 불량"Clojure 오류 메시지보다 나쁨). 내가 찾은 유일한 해결책은 테스트 실행간에 변경 횟수를 제한하는 것입니다.

내가 사용한 다른 기술은 Google에서 복사 할 수있는 올바른 코드의 예를 검색하는 것입니다. require 문 달리, 키워드 네임 스페이스에는 "알파"가없는,

(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}}) 

주, 더 혼란 일 :이 올바른 구문을 찾기 위해 바로 오늘 그 기술을 사용했다.

사용법 : 바르에 사양 적합성에 대한 (확인) (SYM 또는-을 Syms 확인) (SYM 또는-을 Syms을 확인 OPTS)를 실행 생식 시험 나는 정답 from the online docs를 추측하려고 감히 sym-or-syms에 의해 명명 된 심볼 또는 심볼의 콜렉션. sym-or-syms가 지정되지 않은 경우 검사 가능한 모든 병을 검사하십시오.

opts 맵에는 다음과 같은 선택적 키가 있습니다. stc 별칭 clojure.spec.test입니다.확인 :

: STC/OPTS는 test.check/빠른 검사를 통과 만나게된다 : 세대
는 발전기 사양 이름에서 맵이 :: STC/OPTS 포함

오버라이드 (override) : 추가 납입 테스트 test.check에 의해 에 문서화 된 키에. 생성자 오버라이드는 생성 함수가 args 할 때 spec/gen에 전달됩니다. 다른 모든 실패하면

, 당신은 실패 할 때까지, 당신의 목표를 향해 한 번에 하나의 작은 변화를 추가 작업 않는 슈퍼 최소한의 케이스를 찾는 유서 깊은 기술을 사용하지만 선택의 여지가 없다. 자주 새롭고 깨끗한 lein 프로젝트에서 그러한 실험을하는 것이 더 쉽습니다. 따라서 확실한 문제는 없습니다.


P. 언제든지 누군가에게 물을 수 있습니다. 중 하나 이상을 선택합니다