Dopo aver visto di recente una presentazione dei protocolli Clojure, sono rimasto molto impressionato dal modo pulito in cui le estensioni ai tipi esistenti possono essere eseguite in questo modo. Tuttavia, ero abbastanza sicuro di aver già visto un modo simile di farlo in qualche altra lingua e dopo un po 'di tempo ho scoperto che erano le categorie Groovy.Differenza tra protocolli Clojure e categorie Groovy
confrontare questo:
@Category(String) class StringCategory {
String lower() {
return this.toLowerCase()
}
}
use (StringCategory) {
println("TeSt".lower())
assert "test" == "TeSt".lower()
}
all'equivalente Clojure Protocol (tratto da mikera's answer below and tested in ideone.com)
(defprotocol Lowerable
(lower [x]))
(extend-protocol Lowerable
String
(lower [s]
(.toLowerCase s)))
(println (lower "HELLO"))
la mia domanda è:
- oltre da differenze di prestazioni (si dice che Clojure è altamente ottimizzato in questo senso) - c'è una differenza semantica tra i due approa ches?
- oltre alla maldestra sintassi, c'è qualcosa di logicamente sbagliato nell'approccio Groovy?
Disclaimer: Sono un novizio Clojure completo!
Trovo questa domanda abbastanza interessante. Potresti aggiungere l'equivalente Clojure per il non clojure-illuminato di noi e per il rispetto dei sintassi/brevità? : D – epidemian
scusate, mi piacerebbe, è solo che non posso. Sul sito http://clojure.org/protocols c'è un campione abbastanza simile, ma al momento non riesco a testare il codice equivalente, quindi non voglio pubblicare del codice che potrebbe non funzionare. Purtroppo, non esiste una console Web come la console Web di Groovy (ce n'è una su try-clojure.org, ma non riesco nemmeno ad incollare righe di codice separate da una nuova riga). – Ice09
Forse prova con [ideone] (http://ideone.com/)? – epidemian