Skip to:
An AbstractMethodError is encountered when trying to evaluate a s/def form with the generator-fn overridden using s/with-gen.
s/def
s/with-gen
(ns spec-fun.core (:require [clojure.spec :as s] [clojure.test.check.generators :as gen])) (s/def ::int integer?) (s/def ::int-vec (s/with-gen (s/& (s/cat :first ::int :rest (s/* integer?) :last ::int) #(= (:first %) (:last %))) #(gen/let [first (s/gen integer?) rest (gen/such-that (partial at-least 3) (gen/vector (s/gen integer?)))] (concat [first] rest [first])))) ;;=> AbstractMethodError ;; The generator works independently (gen/generate (gen/let [first (s/gen integer?) rest (gen/such-that (partial at-least 3) (gen/vector (s/gen integer?)))] (concat [first] rest [first]))) ;;=> (-13 8593 -33421108 4 6697 0 35835865 -94366552 1 14165115 -4090 42 775 -15238320 233500020 -1 -13) ;; And so does the spec: (s/def ::int-vec (s/& (s/cat :first ::int :rest (s/* integer?) :last ::int) #(= (:first %) (:last %)))) (s/conform ::int-vec '(-13 8593 -33421108 4 6697 0 35835865 -94366552 1 14165115 -4090 42 775 -15238320 233500020 -1 -13)) ;;=> {:first -13, :rest [8593 -33421108 4 6697 0 35835865 -94366552 1 14165115 -4090 42 775 -15238320 233500020 -1], :last -13}
OSX Yosemite 10.10.5
Fixed in commit https://github.com/clojure/clojure/commit/ec2512edad9c0c4a006980eedd2a6ee8679d4b5d for 1.9 alpha2.
An AbstractMethodError is encountered when trying to evaluate a
s/def
form with the generator-fn overridden usings/with-gen
.(ns spec-fun.core (:require [clojure.spec :as s] [clojure.test.check.generators :as gen])) (s/def ::int integer?) (s/def ::int-vec (s/with-gen (s/& (s/cat :first ::int :rest (s/* integer?) :last ::int) #(= (:first %) (:last %))) #(gen/let [first (s/gen integer?) rest (gen/such-that (partial at-least 3) (gen/vector (s/gen integer?)))] (concat [first] rest [first])))) ;;=> AbstractMethodError ;; The generator works independently (gen/generate (gen/let [first (s/gen integer?) rest (gen/such-that (partial at-least 3) (gen/vector (s/gen integer?)))] (concat [first] rest [first]))) ;;=> (-13 8593 -33421108 4 6697 0 35835865 -94366552 1 14165115 -4090 42 775 -15238320 233500020 -1 -13) ;; And so does the spec: (s/def ::int-vec (s/& (s/cat :first ::int :rest (s/* integer?) :last ::int) #(= (:first %) (:last %)))) (s/conform ::int-vec '(-13 8593 -33421108 4 6697 0 35835865 -94366552 1 14165115 -4090 42 775 -15238320 233500020 -1 -13)) ;;=> {:first -13, :rest [8593 -33421108 4 6697 0 35835865 -94366552 1 14165115 -4090 42 775 -15238320 233500020 -1], :last -13}