Clojure defprotocol como uma solução para o problema de expressão
No livro "A Alegria de Clojure",defprotocol
é oferecido como uma solução para oexpression problem - "o desejo de implementar um conjunto existente de métodos abstratos para uma classe concreta existente sem precisar alterar o código que define qualquer um."
O exemplo dado é o seguinte:
(defprotocol Concatenatable
(cat [this other]))
(extend-type String
Concatenatable
(cat [this other]
(.concat this other)))
(cat "House" " of Leaves")
;=> "House of Leaves"
(extend-type java.util.List
Concatenatable
(cat [this other]
(concat this other)))
(cat [1 2 3] [4 5 6])
;=> (1 2 3 4 5 6)
Sugere-se que isso não seja possível em uma linguagem como Java, mas como é diferente do seguint
public class Util {
public static String cat(final String first,
final String second) {
return first.concat(second);
}
public static <T> List<T> cat(final List<T> first,
final List<T> second) {
final List<T> list = new List<T>(first);
list.addAll(second);
return list;
}
}
Afinal, ambos são usados da mesma forma:
(cat "House" " of Leaves")
Util.cat("House", " of Leaves");
A função Clojurecat
énã a métod noString
eList
classes, mas sim um @ independenfunçã sobrecarregado para aceitarString
ouList
argumentos.
Embora eu realmente goste de Clojure, não entendo as reivindicações de superioridade desse construt