It looks like you’ve got your #s misplaced.  I think you want something like 
this:

(s/and #(> % 0.0) #(< % 1.0))

Of course, the first predicate expression could be replaced by `pos?`.

The `s/and` returns a single spec that combines multiple specs.  Of course, 
`clojure.core/and` is basically the logical AND of “truthy” values.

The #(…) form is creating an anonymous function.  In your first case, that 
creates a reasonable predicate, which works correctly as a spec.

Your second form isn’t doing what you wanted because the anonymous function 
notation is wrapping the whole `s/and` combining form, and in that context the 
tests aren't syntactically the appropriate predicates.  You’re getting an extra 
level of nesting and bad tests.

I suspect that the confusion comes from the similarity between a predicate and 
a spec.  In a sense, a predicate function is the simplest form of a spec.  
However, you need a special way of combining multiple specs, not just the plain 
logical `and` combination.  So we have `s/and` to do the job.



> On Jul 21, 2016, at 1:23 PM, Mars0i <marsh...@logical.net> wrote:
> 
> With Clojure 1.9.0-alpha10:
> 
> user=> (s/def ::interval-with-cloj-and #(and   (> % 0.0) (< % 1.0)))
> 
> user=> (s/def ::interval-with-spec-and #(s/and (> % 0.0) (< % 1.0)))
> 
> user=> (s/valid? ::interval-with-cloj-and 1.0)
> false
> 
> That's what I expected.
> 
> user=> (s/valid? ::interval-with-spec-and 1.0)
> true
> 
> That's not what I expected.
> 
> In fact, as far as I can tell, (valid? ::interval-with-spec-and x) will 
> return true for any number x.  What does spec/and mean, then?  I thought that 
> in this context it would mean the same as Clojure's normal 'and'.  That's 
> what the first example of its use in the Clojure.spec Guide seems to show.  I 
> must be misunderstanding something basic and perhaps obvious.


-- 
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to clojure@googlegroups.com
Note that posts from new members are moderated - please be patient with your 
first post.
To unsubscribe from this group, send email to
clojure+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en
--- 
You received this message because you are subscribed to the Google Groups 
"Clojure" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to clojure+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to