Po niedawnym obejrzeniu prezentacji Clojure Protocols, byłem pod wrażeniem tego, w jaki sposób można w ten sposób rozszerzyć istniejące typy. Byłem jednak pewien, że już widziałem podobny sposób robienia tego w jakimś innym języku i po pewnym czasie dowiedziałem się, że to Groovy Categories.Różnice między Protokołami Clojure i Groovy Kategorie
Porównaj to:
@Category(String) class StringCategory {
String lower() {
return this.toLowerCase()
}
}
use (StringCategory) {
println("TeSt".lower())
assert "test" == "TeSt".lower()
}
do równowartości Clojure Protocol (zaczerpnięte z mikera's answer below and tested in ideone.com)
(defprotocol Lowerable
(lower [x]))
(extend-protocol Lowerable
String
(lower [s]
(.toLowerCase s)))
(println (lower "HELLO"))
moje pytanie brzmi:
- oprócz różnic wydajności (mówi się, że Clojure jest wysoce zoptymalizowany pod tym względem) - czy istnieje różnica semantyczna między tymi dwiema metodami ches?
- oprócz niezgrabnej składni, czy jest coś logicznie nie tak z podejściem Groovy?
Nota prawna: Jestem kompletnym nowicjuszem Clojure!
Uważam to pytanie za dość interesujące. Czy mógłbyś dodać ekwiwalent Clojure'a dla nie oświeconego nas Clojure i dla porównania składni/zwięzłości? : D – epidemian
Przepraszam, chciałbym, po prostu nie mogę. Na stronie http://clojure.org/protocols istnieje dość podobna próbka, ale teraz nie mogę przetestować równoważnego kodu, dlatego nie chcę publikować kodu, który może nie działać. Niestety, nie ma konsoli internetowej, takiej jak konsola internetowa Groovy (jest jedna na try-clojure.org, ale nawet nie wklejałem w newline oddzielnych linii kodu). – Ice09
Może spróbuj z [ideone] (http://ideone.com/)? – epidemian