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