Just for future reference this is a mailing list and not a traditional 
forum, so after you post something here it will email everyone subscribed. 

On Thursday, July 21, 2016 at 6:24:28 PM UTC-4, Mars0i wrote:
>
> Ahh...  I realized my mistake very soon after I posted the question, and 
> deleted it.  You must have caught it before it went away.  Your explanation 
> is helpful, though.  Thanks.
>
> On Thursday, July 21, 2016 at 1:30:56 PM UTC-5, miner wrote:
>>
>> 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 <mars...@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