Разница между протоколами Clojure и категориями Groovy

Недавно увидев презентацию протоколов Clojure, я был весьма впечатлен тем, насколько простым способом можно сделать расширения существующих типов. Однако я был почти уверен, что уже видел подобный способ на каком-то другом языке, и через некоторое время я узнал, что это Groovy Categories.

Сравните это:

 @Category(String) ​class StringCategory {
   String lower() {
     return this.toLowerCase()
   }
 }

 use (StringCategory) {
   println("TeSt".lower())
   assert "test" == "TeSt".lower()
 }

с эквивалентом протокола Clojure (взято из ответа mikera ниже и протестировано на ideone.com)

 (defprotocol Lowerable
   (lower [x]))

 (extend-protocol Lowerable
   String
     (lower [s] 
       (.toLowerCase s)))

 (println (lower "HELLO"))

мой вопрос:

  1. помимо различий в производительности (это сказал, что Clojure сильно оптимизирован в этом отношении) — есть ли семантическая разница между этими двумя подходами?
  2. Помимо неуклюжего синтаксиса, есть ли что-то логически неправильное в подходе Groovy?

Отказ от ответственности: я полный новичок в Clojure!

8
задан Ice09 30 March 2012 в 09:01
поделиться