2013-04-23 10 views
8

In clojure,In clojure, perché gli associati richiedono argomenti oltre a una mappa, ma non dissociarli?

(assoc {}) 

genera un'eccezione arity, ma

(dissoc {}) 

non lo fa. Perché? Mi sarei aspettato che entrambi avrebbero lanciato un'eccezione, o entrambi non avrebbero apportato modifiche se non avessero fornito chiavi o valori.

EDIT: vedo una motivazione per consentire queste forme; significa che possiamo associare o dissociare a una lista di argomenti probabilmente vuota. Semplicemente non vedo perché uno sarebbe permesso e l'altro no, e sono curioso di sapere se c'è una buona ragione per cui mi manchi.

+0

'(assoc {})' non ha senso, quindi non è permesso. – dsm

+1

Nota che '(dissoc {})' neanche. – dsm

+3

La mia tesi è che entrambi hanno un senso o non hanno senso; ma uno è permesso e l'altro no (almeno sul clojure 1.5.1). Sono curioso del perché. –

risposta

4

personalmente ritengo la mancanza di 1-arità assoc è una svista: ogniqualvolta sia prevista una lista finale di parametri (& stuff), la funzione dovrebbe normalmente essere in grado di lavorare con parametri di zero per consentire a apply in una lista vuota.

Clojure ha molte altre funzioni che funzionano correttamente con argomenti zero, ad es. + e merge.

D'altra parte, Clojure ha altre funzioni che non accettano zero parametri finali, ad es. conj.

Così l'API Clojure è un po 'incoerente in questo senso .....

0

Questa non è una risposta autorevole, ma si basa sulla mia prova e guardando ClojureDocs:

s' dissoc arity include il vostro essere in grado di passare in un argomento, una mappa. In questo caso, nessuna chiave/valore viene rimossa dalla mappa.

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

assoc non ha arity simile. Ciò significa che la chiamata richiede una mappa, una chiave e un valore.

Ora, perché questo è stato progettato in questo modo è una questione diversa, e se non ricevi una risposta con queste informazioni - spero che tu lo faccia - allora ti suggerisco di offrire una taglia o andare su Google Gruppi di Clojure e chiedere domanda.

Ecco la fonte.

(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

Non sto aggiungendo questo alla mia risposta, perché è un'ipotesi educata. Sembra che l'arità di uno sia per l'uso in funzioni parziali e operatori Thrush. Questa è una (dissoc test-map) potrebbe essere infilata in un modulo che alla fine contiene una chiave per la rimozione. Ma questa è un'ipotesi plausibile, e spero che una persona esperta di Clojure risponda. – octopusgrabbus

Problemi correlati