My 2p - I interpret the contract as being boolean. Truthy values are 'polymorphically' equivalent*1 so sure. The concern would be people relying on the implementation and treating the values as none-truthy (i.e. in your example relying on the fact it is a string being returned, so (= "someString" (is-nsf-code? "someString")))
I should reduce it to 1p really as I am only contributing in an abstract design sense, not in the specifics of the coding standards you mentioned. *1 If this doesn't hold (i.e. caller depends upon receiving a java.lang.Boolean or associated primitive) then I think the caller has bigger problems. On Thursday, April 17, 2014 5:33:42 PM UTC+1, Sean Corfield wrote: > > The library coding standards[1] say: > > * Use '?' suffix for predicates. > - N.B. - predicates return booleans > > and the community Clojure style guide[2] says: > > * The names of predicate methods (methods that return a boolean value) > should end in a question mark. (i.e.even?). > > Both of these imply that if you have a function that returns a boolean > (and that is intended for use as a predicate), it should be named to end in > '?'. Fair enough. > > My question is about the reverse implication: > > * Should a function whose name ends in '?' return a (strict) boolean > value? > > Looking at the docstrings of a random selection of functions found by > (apropos "?"), they all seem to return specifically true or false. I did > not do an exhaustive check. > > Is the intent that foo? implies a result of true or false - or could foo? > return any truthy / falsey value (and therefore any Clojure value). > > Concrete example that spurred this discussion from some code at work: > > (defn is-nsf-code? > "Given an error code, return truthy if it is NSF." > [code] > (#{"BE1" "BE2"} code)) > > Clearly the result here could be nil or a string but it's definitely meant > to be used as a predicate. Similarly: > > (defn nsf? > "Given the result of an SBW sale, return true if it failed with NSF." > [result] > (and (= "failure" (:result result)) > (some is-nsf-code? (:errors result)))) > > Again, the result could be false or nil or a string but is meant to be > used as a predicate. > > As an aside, for core.typed, we annotate the first as [String -> Boolean] > with ^:no-check so it type checks as a true/false predicate and then we > annotate the second as [SBWResult -> (Nilable Boolean)] and that's all > fine... but is it "good style"? > > [1] http://dev.clojure.org/display/community/Library+Coding+Standards > [2] https://github.com/bbatsov/clojure-style-guide#naming > > Sean Corfield -- (904) 302-SEAN > An Architect's View -- http://corfield.org/ > > "Perfection is the enemy of the good." > -- Gustave Flaubert, French realist novelist (1821-1880) > > > > -- 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.