clojure/conj , , , - . spec clojure; , .
, , . , , . spec, , ( ) , . , .
WORKFLOW:
, , - , . , (subs s start end) s , start end . , , , start end , end , start, . , ( , , , ):
(s/fdef clojure.core/subs
:args (s/and (s/cat :s string? :start nat-int? :end (s/? nat-int?))
(fn [{:keys [s start end]}]
(if end
(<= 0 start end (count s))
(<= 0 start (count s)))))
:ret string?
:fn (fn [{{:keys [s start end]} :args, substring :ret}]
(and (if end
(= (- end start) (count substring))
(= (- (count s) start) (count substring)))
(<= (count substring) (count s)))))
, args spec:
(s/exercise-fn `subs)
1000 ( , , - , :args; , ):
(stest/check `subs)
, subs, ? , spec, , :
(stest/instrument `subs)
, , - . , .
, spec'd, ( clojure):
(-> (stest/enumerate-namespace 'user) stest/check)
, , " ".
s/conform s/valid - . , , .
, ! !