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.