2012-08-15 15 views
16

Supponiamo di avere un record "simile alla funzione", almeno nel senso che rappresenta un'operazione che potrebbe essere applicata ad alcuni argomenti.È buona norma per un record Clojure implementare IFn?

posso farlo funzionare come una funzione mediante l'attuazione di clojure.lang.IFn, qualcosa di simile a:

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

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

(sì, lo so che ho appena reimplementato una versione inferiore di partial .... è solo un esempio: -))

Sta facendo un attrezzo record clojure.lang.IFn una buona pratica o no?

Eventuali insidie ​​a questo approccio?

risposta

6

Sono sorpreso che non lo sia già. Le registrazioni dovrebbero essere "a complete implementation of a persistent map". Quindi, per rispondere alla tua domanda, mi aspetterei che sia una funzione delle sue chiavi, come lo è una mappa; qualsiasi altra cosa sarebbe abbastanza sorprendente.

+1

Un record sembra implementare 'clojure.lang.Associative' ma non' clojure.lang.IFn'. Quindi puoi fare '(: a some-record)' per cercare la parola chiave ma non '(some-record: x)' – mikera

+0

Precisamente. Ho controllato ma non ho visto nulla di esplicito su questo da Rich. Forse è solo una svista. –

+0

+1 dato perché la domanda di @ mikera si interroga sui record non sui tipi. Poiché i record hanno già una semantica simile alla mappa, sarebbe confuso, per i tipi questo problema non è presente. – ponzao

Problemi correlati