2015-03-17 6 views
7

nehme ich an den folgenden map Betrieb mit not:Ist Komplement und nicht effektiv das gleiche in Clojure?

core=> (map (comp not) [true false true false]) 
(false true false true) 

nehme ich laufen die folgenden map Betrieb mit complement:

core=> (map (complement identity) [true false true false]) 
(false true false true) 

Meine Frage ist: Ist complement und not effektiv das gleiche in Clojure ?

(außer dass compliment wirkt ein wenig wie comp ose in ein partial erstellen)

Antwort

10

Sie sind die gleichen in Bezug auf die Ergebnisse mit kleinen Änderungen (wie in Ihrem Codebeispiel). Dies wird sehr deutlich, wenn man bei complement Quelle aussehen:

(source complement) 
=> 
(defn complement 
    "Takes a fn f and returns a fn that takes the same arguments as f, 
    has the same effects, if any, and returns the opposite truth value." 
    {:added "1.0" 
    :static true} 
    [f] 
    (fn 
    ([] (not (f))) 
    ([x] (not (f x))) 
    ([x y] (not (f x y))) 
    ([x y & zs] (not (apply f x y zs))))) 

Sie sind jedoch sehr unterschiedlich in ihren Bedeutungen - not auf Werte in Betrieb ist, und es gibt Werte (true oder false). complement arbeitet an und gibt Funktionen zurück.

Dies mag wie ein Implementierungsdetail erscheinen, aber es ist sehr wichtig, Ihre Intensionen auszudrücken - die Verwendung von complement macht es sehr klar, dass Sie eine neue Funktion erstellen, während not meist in bedingten Überprüfungen verwendet wird.

+0

Welcher ist Ihrer Meinung nach idiomatc? "comp nicht" oder "ergänzen"? – tales

1

ähnlich, aber nicht gleich. complement gibt eine Funktion zurück, während not sofort ausgewertet wird.

0

Ein bisschen eine Klarstellung auf Ihre Frage: (comp not) ist so ziemlich identisch mit (complement identity) seit (comp not) ergibt sich eine Funktion, die das gleiche tut.