I understand that, hence the example being to check if the value was a 
function, since returning false from not'ing a function didn't make sense 
to me. The change I was inquiring about applied to your example would be;

(filter (fnot even?) [1 2 3 4 5 6 7]) => (1 3 5 7)
(filter fnot [true false true]) => [false true false]

So I fully understand that one is operating on values, and one is operating 
on functions. What I was asking, is if it's ever useful to execute not on a 
function but treat it as a value, just as it doesn't make sense to execute 
complement on values instead of functions. Given that it seemed the vast 
majority of use cases are distinct dependent on if you are dealing with 
functions or values, I was questioning if the functions could be combined 
to do the right thing depending on if it was a value or a function. I was 
asking for arguments for and against that, but concluded it was probably 
was due to complecting and was asking for verification.

Thanks,

Charlie

On Tuesday, November 6, 2012 4:03:44 AM UTC-6, Stathis Sideris wrote:
>
> The difference between not and complement is that not takes a *value* and 
> produces a new *value* which is true if the original was false (and vice 
> versa) while complement takes a *function* and produces a new *function 
> *which 
> returns true in the cases where the original function would return false.
>
> Here is an example that shows how complement can result in more concise 
> code in comparison to not:
>
> user> (filter (fn [x] (not (even? x))) [1 2 3 4 5 6 7])
> (1 3 5 7)
> user> (filter (complement even?) [1 2 3 4 5 6 7])
> (1 3 5 7)
>
> (of course you could just use odd? in this case, but it's only an example).
>
> I hope that clears it up.
>
> Stathis
>
> On Monday, 5 November 2012 23:12:03 UTC, Charles Comstock wrote:
>>
>> Hi All,
>>
>> I quite like Clojure but have been confused from time to time on 
>> particular design choices. I find understanding the root cause of these 
>> decisions helps to understand the language better. As example, the fact 
>> that complement and not are separate functions has been puzzling me for a 
>> bit [1]. The implementation of not and complement is roughly;
>>
>> (defn not [x] (if x false true))
>> (defn complement [f] 
>>   (fn 
>>      ([] (not (f)))
>>      ([x] (not (f x)))
>>      ([x y] (not (f x y)))
>>      ([x y & zs] (not (apply f x y zs)))))
>>
>> What I'm wondering is if it's purely for performance, historical or 
>> idiomatic reasons that it's not;
>>
>>
>> (defn fnot [arg]
>>   (if (ifn? arg)
>>     (fn
>>       ([] (fnot (arg)))
>>       ([x] (fnot (arg x)))
>>       ([x y] (fnot (arg x y)))
>>       ([x y & zs] (fnot (apply arg x y zs))))
>>     (if arg false true)))
>>
>> Perhaps a multi-method could also be appropriate here, though I'm not 
>> exactly certain what the appropriate dispatch function would be. I follow 
>> why bit-not is a separate function as the intended meaning is clearly 
>> different, but the implied meaning of not seems to be the same as complement 
>> which is why it seems odd that they are different methods. 
>>
>> After doing some experimentation with these, I finally realized that (not 
>> identity) yields false, but I'm not quite following that use case. I'm 
>> guessing the idiomatic argument against fnot is that it would complect not 
>> and complement unnecessarily?
>>
>> While pouring through the clojure.core source, I also saw a few functions 
>> like not-every? which use (comp not every?) instead of (complement every?). 
>> This led me to question why complement is not implemented as;
>>
>>
>> (defn complement [f] (comp not f))
>>
>>
>> Is there a difference that I'm just not seeing? Or is that just a side 
>> effect of either performance or dependency ordering in clojure.core [2].
>>
>> I think I may have answered my own question concerning fnot in a roundabout 
>> manner, but I found the process of discovering this illuminating. Can anyone 
>> else shed light on this, or am I correct in concluding that fnot would 
>> complect not and complement?
>>
>> Thanks,
>>  Charlie
>>
>> 1. I frequently misread comp as complement and not compose in point free 
>> code, so perhaps that confusion is why complement is oddly jarring to me.
>>
>> 2. not-every? and not-any? are implemented using def instead of defn and 
>> manually set meta :arglist, despite defn already being defined, is this just 
>> for historical reasons?
>>
>>
>>

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

Reply via email to