Skip to content

Commit 391d5cf

Browse files
committed
same as Clojure b7199fb + a simple test
1 parent 6796564 commit 391d5cf

File tree

4 files changed

+36
-7
lines changed

4 files changed

+36
-7
lines changed

src/main/cljs/cljs/spec.cljc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -229,7 +229,7 @@
229229
conjunction of the predicates, and any conforming they might perform."
230230
[re & preds]
231231
(let [pv (vec preds)]
232-
`(cljs.spec/amp-impl ~re ~pv '~pv)))
232+
`(cljs.spec/amp-impl ~re ~pv '~(mapv #(res &env %) pv))))
233233

234234
(defmacro conformer
235235
"takes a predicate function with the semantics of conform i.e. it should return either a

src/main/cljs/cljs/spec.cljs

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -779,9 +779,7 @@
779779
::amp (c/and (accept-nil? p1)
780780
(c/or (noret? p1 (preturn p1))
781781
(let [ret (-> (preturn p1) (and-preds ps (next forms)))]
782-
(if (= ret ::invalid)
783-
nil
784-
ret))))
782+
(not= ret ::invalid))))
785783
::rep (c/or (identical? p1 p2) (accept-nil? p1))
786784
::pcat (every? accept-nil? ps)
787785
::alt (c/some accept-nil? ps))))
@@ -846,7 +844,11 @@
846844
nil (let [ret (dt p x p)]
847845
(when-not (= ::invalid ret) (accept ret)))
848846
::amp (when-let [p1 (deriv p1 x)]
849-
(amp-impl p1 ps forms))
847+
(if (= ::accept (::op p1))
848+
(let [ret (-> (preturn p1) (and-preds ps (next forms)))]
849+
(when-not (= ret ::invalid)
850+
(accept ret)))
851+
(amp-impl p1 ps forms)))
850852
::pcat (alt2 (pcat* {:ps (cons (deriv p0 x) pr), :ks ks, :forms forms, :ret ret})
851853
(when (accept-nil? p0) (deriv (pcat* {:ps pr, :ks kr, :forms (next forms), :ret (add-ret p0 ret k0)}) x)))
852854
::alt (alt* (map #(deriv % x) ps) ks forms)

src/test/cljs/cljs/spec_test.cljs

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
(ns cljs.spec-test
2+
(:require [cljs.spec :as s]
3+
[cljs.test :as test :refer-macros [deftest is]]))
4+
5+
(s/def ::even? (s/and number? even?))
6+
(s/def ::odd? (s/and number? odd?))
7+
8+
(def s2
9+
(s/cat :forty-two #{42}
10+
:odds (s/+ ::odd?)
11+
:m (s/keys :req-un [::a ::b ::c])
12+
:oes (s/& (s/* (s/cat :o ::odd? :e ::even?)) #(< (count %) 3))
13+
:ex (s/* (s/alt :odd ::odd? :even ::even?))))
14+
15+
(deftest test-roundtrip
16+
(let [xs [42 11 13 15 {:a 1 :b 2 :c 3} 1 2 3 42 43 44 11]]
17+
(is (= xs (s/unform s2 (s/conform s2 xs))))))
18+
19+
(comment
20+
21+
(s/conform s2 [42 11 13 15 {:a 1 :b 2 :c 3} 1 2 3 42 43 44 11])
22+
(s/unform s2
23+
(s/conform s2 [42 11 13 15 {:a 1 :b 2 :c 3} 1 2 3 42 43 44 11]))
24+
25+
)

src/test/cljs/cljs/test_runner.cljs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,8 @@
1414
[cljs.keyword-test]
1515
[cljs.import-test]
1616
[cljs.ns-test.foo]
17-
[cljs.pprint]))
17+
[cljs.pprint]
18+
[cljs.spec-test]))
1819

1920
(set! *print-newline* false)
2021
(set-print-fn! js/print)
@@ -34,4 +35,5 @@
3435
'cljs.ns-test.foo
3536
'foo.ns-shadow-test
3637
'cljs.import-test
37-
'cljs.pprint)
38+
'cljs.pprint
39+
'cljs.spec-test)

0 commit comments

Comments
 (0)