2013-04-23 4 views
8

In clojure,In clojure, warum assoc erfordert Argumente zusätzlich zu einer Karte, aber nicht trennen?

(assoc {}) 

löst eine arity Ausnahme, aber

(dissoc {}) 

nicht. Warum? Ich hätte erwartet, dass entweder beide eine Ausnahme auslösen oder beide keine Änderungen vornehmen, wenn keine Schlüssel oder Werte bereitgestellt werden.

EDIT: Ich sehe eine Begründung für diese Formen zuzulassen; es bedeutet, dass wir assoc oder disso auf eine möglicherweise leere Liste von Argumenten anwenden können. Ich verstehe nur nicht, warum man das erlaubt und das andere nicht, und ich bin neugierig, ob es einen guten Grund dafür gibt, dass ich vermisst werde. Diese

+0

'(Assoc {})' macht keinen Sinn, daher ist es nicht erlaubt. – dsm

+1

Beachten Sie, dass '(Dissozi {})' auch nicht. – dsm

+3

Mein Argument ist, dass entweder beide einen Sinn ergeben oder keinen Sinn ergeben; aber eins ist erlaubt und das andere nicht (zumindest auf clojure 1.5.1). Ich bin neugierig, warum. –

Antwort

4

Ich persönlich denke, das Fehlen von 1-arity Assoc ein Versehen ist: wann immer eine Hinter Liste von Parametern zu erwarten ist (& stuff), sollte die Funktion normalerweise mit Null Parametern der Lage sein, um es möglich zu machen Arbeits zu apply es zu einer leeren Liste.

Clojure hat viele andere Funktionen, die korrekt mit Null Argumenten, z. + und merge.

Auf der anderen Seite hat Clojure andere Funktionen, die nicht akzeptieren Null nachfolgende Parameter, z. conj.

So ist die Clojure API ein wenig in dieser Hinsicht inkonsequent .....

0

ist keine verbindliche Antwort, sondern basiert auf meinen Tests und Blick auf ClojureDocs:

dissoc ‚s arity enthält Ihr in der Lage sein in ein Argument übergeben, eine Karte. In diesem Fall wird kein Schlüssel/Wert aus der Karte entfernt.

(def test-map {:account-no 12345678 :lname "Jones" :fnam "Fred"}) 
(dissoc test-map) 
{:account-no 12345678, :lname "Jones", :fnam "Fred"} 

assoc hat keine ähnliche Arity. Das heißt, assoziieren erfordert eine Karte, einen Schlüssel und einen Wert.

Nun, warum das so entworfen wurde, ist eine andere Sache, und wenn Sie keine Antwort mit diesen Informationen erhalten - ich hoffe, Sie tun - dann schlage ich vor, ein Kopfgeld anzubieten oder auf Clojure Google Groups gehen und fragen Frage.

Hier ist die Quelle.

(defn dissoc 
    "dissoc[iate]. Returns a new map of the same (hashed/sorted) type, 
that does not contain a mapping for key(s)." 
    {:added "1.0" 
    :static true} 
    ([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)))) 
+0

Ich füge das nicht meiner Antwort hinzu, weil es eine ermittelte Schätzung ist. Es scheint, dass die Arität von Eins für Teilfunktionen und Thrush-Operatoren verwendet wird. Das ist eine (Disso-Test-Map), die in eine Form eingefädelt werden kann, die schließlich einen Schlüssel zum Entfernen enthält. Aber das ist eine fundierte Vermutung, und ich hoffe, dass eine Clojure kenntnisreiche Person antworten wird. – octopusgrabbus

Verwandte Themen