Hi Alex,

> Sets are treated as predicate functions which are valid when they produce a 
> logically true value.

So then my question boils down to:
    Why is then (boolean (quote nil)) => false and (boolean (quote
anything)) => true?
And this boils down to:
    Why a type of quoted symbol (type (quote nil)) is nil and not
clojure.lang.Symbol as is it the case for (type (quote anything))?
Here the source says:
(defn type
  "Returns the :type metadata of x, or its Class if none"
  {:added "1.0"
   :static true}
  [x]
  (or (get (meta x) :type) (class x)))

And if I put few println's here, I see that in both cases (type (quote
nil)), (type (quote anything)) the input arg x is nil, IOW the
information "the arg x has a type of quoted symbol" is lost here. IOW
the clojure.core/type eagerly reports the type of e.g.:
    (type (quote true)) => java.lang.Boolean
    (type (quote "foo")) => java.lang.String
    (type (quote nil)) => nil
    (type (quote 1)) => java.lang.Long
etc. when I expect clojure.lang.Symbol, as for:
    (type (quote anything)) => clojure.lang.Symbol

Hmm... *if* this type-hiding is a bug then I guess it's crawling too
deeply to fix it, right? :)
Anyway, thank you for your response, Alex!

Bost


Le mar. 29 janv. 2019 à 21:40, Alex Miller <a...@puredanger.com> a écrit :
>
> Sets are treated as predicate functions which are valid when they produce a 
> logically true value. Sets with logically false values nil or false will fail 
> this check. This is not a spec thing, but a general thing to be aware of in 
> Clojure when using sets as functions.
>
> If you want nils, use (s/gen nil?).
> If you want falses, use (s/gen false?).
> If you want either, the simplest thing is probably (s/gen (s/nilable 
> false?)), but keep in mind that the s/nilable generator is constructed to 
> only produce nils 10% of the time, so you'll get 10% nils, 90% falses.
>
> You could also use the more cumbersome (s/gen (s/nonconforming (s/or :n nil? 
> :f false?))) which should give you about 50/50 mix.
>
>
> On Tuesday, January 29, 2019 at 2:23:50 PM UTC-6, Bost wrote:
>>
>> Could anybody explain please why I can't get a sample of falses or
>> quoted nils / falses here?
>>
>> foo.core> (clojure-version)
>> "1.10.0"
>> foo.core> (require '[clojure.spec.gen.alpha :as gen]
>>                    '[clojure.spec.alpha :as s])
>> nil
>> foo.core> (gen/sample (s/gen #{'nil}))
>> Error printing return value (ExceptionInfo) at
>> clojure.test.check.generators/such-that-helper (generators.cljc:320).
>> Couldn't satisfy such-that predicate after 100 tries.
>>
>>
>> Other interesting and/or relevant cases are:
>>
>> foo.core> (gen/sample (s/gen #{'n}))
>> (n n n n n n n n n n)
>> foo.core> (gen/sample (s/gen #{true}))
>> (true true true true true true true true true true)
>> foo.core> (gen/sample (s/gen #{'true}))
>> (true true true true true true true true true true)
>> foo.core> (gen/sample (s/gen #{false}))
>> Error printing return value (ExceptionInfo) at
>> clojure.test.check.generators/such-that-helper (generators.cljc:320).
>> Couldn't satisfy such-that predicate after 100 tries.
>> foo.core> (gen/sample (s/gen #{'false}))
>> Error printing return value (ExceptionInfo) at
>> clojure.test.check.generators/such-that-helper (generators.cljc:320).
>> Couldn't satisfy such-that predicate after 100 tries.
>> foo.core> (gen/sample (s/gen #{nil}))
>> Error printing return value (ExceptionInfo) at
>> clojure.test.check.generators/such-that-helper (generators.cljc:320).
>> Couldn't satisfy such-that predicate after 100 tries.
>>
>>
>> Thanx
>
> --
> 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.

-- 
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