2017-05-26 2 views
2

Während ich dissoc nutzte, bemerkte ich, dass es eine unäre Version hatte, die nichts zu tun schien. Ich habe die Quelle, und es stellt sich heraus, es ist nur die Identitätsfunktion:Verwendung der unären Version von disso?

(defn dissoc 
    ([map] map) 
    ([map key] 
    (. clojure.lang.RT (dissoc map key))) 
    ([map key & ks] 
    (let [ret (dissoc map key)] 
    (if ks 
     (recur ret (first ks) (next ks)) 
     ret)))) 

dann bemerkte ich, dass disj eine monadische Version als auch mit der gleichen Definition hat.

Was ist der Zweck der unären Versionen? Die einzige mögliche Verwendung, die ich sehen kann, ist vielleicht, wenn sie mit apply verwendet werden, aber ich sehe nicht, wie das nützlich wäre. Und warum haben ihre conj und assoc Pendants ähnliche unäre Versionen?

+0

Betrachten Sie '(disso Einige-Karte-Elemente zu entfernen)'. Willst du wirklich, dass es ein Fehler ist, wenn 'zu entfernende Elemente 'leer sind, und damit jeden zwingen, dieses Idiom zu verwenden, um es in einen bedingten zu verpacken? –

+0

Es ist genau das gleiche wie '+' hat auch 0- und 1-Argument-Versionen. –

+0

@CharlesDuffy Das ist ein guter Punkt. Ich glaube, es hat nicht geklickt, da ich noch nie zuvor eine der Funktionen angewendet habe. Ich akzeptiere das, wenn du eine Antwort schreibst. – Carcigenicate

Antwort

5

Betrachten (apply dissoc some-map items-to-remove).

Wenn das unäre Formular nicht existiert, wäre items-to-remove leer, wäre ein Fehler, und daher müsste man immer seine Länge überprüfen, bevor dieser Anruf getätigt wird.

+0

Daraus folgt, dass "conj" und "assoc" auch unäre Identitäten sein sollten. Bekommt ein JIRA-Ticket? – Thumbnail

+0

@Thumbnail Ich würde sagen, dass jede Verwendung von 'apply' mit' conj' durch ['in'] (https://clojuredocs.org/clojure.core/into) ersetzt werden sollte. Um 'apply' mit' assoc' zu verwenden, scheint es nicht so einfach zu sein; Sie könnten '# (in% 1 (map vec (partition-all 2% 2)))' 'verwenden, aber das ist relativ lang. –

+2

@Thumbnail 'conj' hat seit 1.7.0 eine unäre Überlastung. Es ist verdunkelt in "(doc conj)", wie es in der Tat die Nullmalüberladung ist, die zur gleichen Zeit eingeführt wurde. Ticket, um das durch die Aktualisierung von ': arglists' (mit Patch) zu beheben: https://dev.clojure.org/jira/browse/CLJ-2169 –

Verwandte Themen