2017-06-17 3 views
1

Je dois implémenter assoc personnalisé, mais il ne fonctionne pas avec plusieurs arguments. Il ne traite que la première paire. Il semble qu'il appelle directement assoc, pas via core assoc, puis RT/assoc.Clojure étendre l'arité Assotiative

(def my-assoc (reify 
       clojure.lang.Associative 
        (assoc [_ k v] 
        (println "assoc!!" k v)))) 

(assoc my-assoc :a 2 :b 3) ;; prints only :a 2 

Comment cela devrait-il être fait pour supporter la multi-arité?

Répondre

3

println renvoie zéro. Retournez donc la valeur d'origine:

(def my-assoc (reify 
       clojure.lang.Associative 
       (assoc [m k v] 
        (println "assoc!!" k v) 
        m))) 

(assoc my-assoc :a 2 :b 3) ;; prints both 
+0

merci! parfait! – uNmAnNeR

+0

Si vous regardez [la source de 'clojure.core/assoc'] (https://github.com/clojure/clojure/blob/clojure-1.9.0-alpha14/src/clj/clojure/core.clj# L181), vous verrez qu'il cascades les appels à 'RT/assoc' pour chaque paire' kv'. – Thumbnail