【问题标题】:Having some trouble getting clojure.spec exercise-fn working在 clojure.spec 练习-fn 工作时遇到一些麻烦
【发布时间】:2017-11-01 19:38:05
【问题描述】:

在尝试使用规范库时,我在尝试使用 exercise-fn 时遇到了错误。我已将其简化为the main guide page 上发布的示例,没有任何变化。

相关代码:

(ns spec1
  (:require [clojure.spec.alpha :as s]))

;;this and the fdef are literal copies from the example page
(defn adder [x] #(+ x %))

(s/fdef adder
  :args (s/cat :x number?)
  :ret (s/fspec :args (s/cat :y number?)
                :ret number?)
  :fn #(= (-> % :args :x) ((:ret %) 0)))

现在,输入以下内容

(s/exercise-fn adder)

给出错误:

Exception No :args spec found, can't generate  clojure.spec.alpha/exercise-fn (alpha.clj:1833)

使用的依赖项/版本,[org.clojure/clojure "1.9.0-beta3"] [org.clojure/tools.logging “0.4.0”] [org.clojure/test.check "0.9.0"]

任何人对为什么这会破坏有任何想法吗?谢谢。

【问题讨论】:

    标签: clojure clojure.spec


    【解决方案1】:

    你需要反引号函数名,这将添加命名空间前缀:

    (s/exercise-fn `adder)
    

    例如在我的测试代码中:

    (s/fdef ranged-rand
      :args (s/and
              (s/cat :start int? :end int?)
              #(< (:start %) (:end %) 1e9)) ; need add 1e9 limit to avoid integer overflow
      :ret int?
      :fn (s/and #(>= (:ret %) (-> % :args :start))
                 #(< (:ret %) (-> % :args :end))))
    
    (dotest
      (when true
        (stest/instrument `ranged-rand)
        (is (thrown? Exception (ranged-rand 8 5))))
      (spyx (s/exercise-fn `ranged-rand)))
    

    结果:

    (s/exercise-fn (quote tst.tupelo.x.spec/ranged-rand)) 
      => ([(-2 0) -1] [(-4 1) -1] [(-2 0) -2] [(-1 0) -1] [(-14 6) -4] 
          [(-36 51) 45] [(-28 -3) -7] [(0 28) 27] [(-228 -53) -130] [(-2 0) -1])
    

    请注意,使用了命名空间限定的函数名称tst.tupelo.x.spec/ranged-rand

    【讨论】:

    • 呃。掌心。错误信息极具欺骗性。感谢您的修复。
    • 不幸的是,规范中有一些类似这样的陷阱。
    猜你喜欢
    • 2023-04-03
    • 1970-01-01
    • 2016-09-19
    • 2018-01-27
    • 1970-01-01
    • 2013-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多