Недавно увидев презентацию Clojure Protocols, я был весьма впечатлен чистым способом, которым можно сделать расширения для существующих типов таким способом.
Однако я был почти уверен, что уже видел подобный способ сделать это на каком-то другом языке, и через некоторое время я обнаружил, что это Groovy Categories.
Сравните это:
@Category(String) class StringCategory {
String lower() {
return this.toLowerCase()
}
}
use (StringCategory) {
println("TeSt".lower())
assert "test" == "TeSt".lower()
}
к эквиваленту протокола Clojure (взято из ответа Микеры ниже и протестировано на ideone.com )
(defprotocol Lowerable
(lower [x]))
(extend-protocol Lowerable
String
(lower [s]
(.toLowerCase s)))
(println (lower "HELLO"))
мой вопрос:
- помимо различий в производительности (говорят, что Clojure высоко оптимизирован в этом отношении) - есть ли смысловая разница между двумя подходами?
- Помимо неуклюжего синтаксиса, есть ли что-то логически неправильное в подходе Groovy?
Отказ от ответственности: я новичок в Clojure!