2013-04-23 4 views
8

W Clojure,W clojure, dlaczego assoc wymaga argumentów oprócz mapy, ale nie dissoc nie?

(assoc {}) 

zgłasza wyjątek Arity, ale

(dissoc {}) 

nie. Czemu? Spodziewałbym się, że obaj wyrzucą wyjątek, lub oba, aby nie wprowadzać żadnych zmian, gdy nie zostaną podane żadne klucze ani wartości.

EDYTOWANIE: Widzę uzasadnienie dla dopuszczenia tych formularzy; oznacza to, że możemy zastosować assoc lub dissoc do możliwie pustej listy argumentów. Po prostu nie rozumiem, dlaczego ktoś miałby być dopuszczony, a drugi nie, i jestem ciekawy, czy istnieje ku temu dobry powód.

+0

'(doc {})' nie ma sensu, dlatego nie jest dozwolone. – dsm

+1

Należy zauważyć, że '(dissoc {})' również nie. – dsm

+3

Mój argument jest taki, że oba mają sens, albo nie mają sensu; ale jeden jest dozwolony, a drugi nie (przynajmniej na clojure 1.5.1). Jestem ciekawy, dlaczego. –

Odpowiedz

4

Osobiście uważam brak 1-arity assoc jest przeoczenie: gdy spodziewane jest lista spływu parametrów (& stuff), funkcja powinna zwykle być w stanie pracować z zerową parametrów w celu umożliwienia do apply go do pustej listy.

Clojure ma wiele innych funkcji, które działają poprawnie przy zerowych argumentach, np. + i merge.

Z drugiej strony, Clojure ma inne funkcje, które nie akceptuje zerowych parametrów końcowych, na przykład. conj.

Więc API Clojure jest nieco niespójne w tym względzie .....

0

To nie jest odpowiedź autorytatywna, ale opiera się na moich testów i patrząc na ClojureDocs:

dissoc „s arity Obejmuje to jest w stanie przejść w jednym argumentem, mapą. W takim przypadku żaden klucz/wartość nie zostanie usunięty z mapy.

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

assoc ma podobną arity. To wywołanie assoc wymaga mapy, klucza i wartości.

To, dlaczego został zaprojektowany w ten sposób, jest inną kwestią, a jeśli nie otrzymasz odpowiedzi z tymi informacjami - mam nadzieję, że tak - sugeruję zaoferować nagrodę lub przejść do Grup dyskusyjnych Clojure i poprosić o pytanie.

Oto źródło.

(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

Nie dodaję tego do mojej odpowiedzi, ponieważ jest to wykształcone przypuszczenie. Wygląda na to, że arial jednego z nich ma zastosowanie w funkcjach częściowych i operacjach Thrush. To jest (testowa mapa dysocjacji) może zostać wklejona do formularza, który ostatecznie zawiera klucz do usunięcia. Ale to jest wykształcone przypuszczenie i mam nadzieję, że odpowiedź będzie miała osoba dobrze znająca Clojure. – octopusgrabbus

Powiązane problemy