2012-08-15 6 views
16

Angenommen ich eine Platte haben, die „funktionsähnlichen“, zumindest in dem Sinne ist, dass es eine Operation darstellt, die auf einige Argumente angewendet werden könnte.Ist es eine gute Übung für einen Clojure-Datensatz, IFn zu implementieren?

Ich kann es als eine Funktion funktioniert clojure.lang.IFn durch die Umsetzung, so etwas wie:

(defrecord Func [f x] 
    clojure.lang.IFn 
    (invoke [this arg] 
     (f x arg)) 
    (applyTo [this args] 
     (apply f x args))) 

((->Func + 7) 1) 
=> 8 

(ja ich weiß, dass ich nur eine minderwertige Version von partial reimplementiert .... es ist nur ein Beispiel: -))

Macht eine Aufzeichnung implementieren eine gute Praxis oder nicht?

Irgendwelche Fallstricke zu diesem Ansatz?

Antwort

6

Ich bin überrascht, dass es nicht schon der Fall ist. Aufzeichnungen sollen "a complete implementation of a persistent map" sein. Um deine Frage zu beantworten, würde ich erwarten, dass es eine Funktion seiner Schlüssel ist, wie es eine Karte ist; alles andere wäre ziemlich überraschend.

+1

Ein Datensatz scheint 'clojure.lang.Associative', aber nicht' clojure.lang.IFn' zu implementieren. So können Sie tun '(: a einige-record)', um das Schlüsselwort nachzuschlagen, aber nicht '(irgendein-Rekord: x)' – mikera

+0

Präzise. Ich habe es überprüft, aber ich habe nichts Genaues von Rich gehört. Vielleicht ist es nur ein Versehen. –

+0

+1 gegeben, weil @mikers Frage nach Datensätzen und nicht Typen fragt. Da Datensätze bereits eine kartenähnliche Semantik haben, wäre das verwirrend, für Typen ist dieses Problem nicht vorhanden. – ponzao

Verwandte Themen