Совершенно не связаны.
Scala - это язык со статической типизацией. Clojure - это язык с динамической типизацией. Эта разница в корне формирует их обоих.
Структурные типы - статические типы, период. Это просто способ заставить компилятор статически доказать, что объект будет иметь определенную структуру (здесь я говорю «доказать», но приведение типов, как всегда, может привести к ложным доказательствам).
Протоколы в Clojure - это способ создания динамической диспетчеризации, который намного быстрее, чем отражение или поиск вещей на карте. В семантическом смысле они на самом деле не расширяют возможности Clojure, но с точки зрения работы они значительно быстрее, чем механизмы, которые использовались ранее.
Черты Scala немного ближе к протоколам, как и интерфейсы Java, но опять же существует проблема статики и динамики. Черты Scala должны быть связаны с классом во время компиляции, подобно интерфейсам Java. Протоколы Clojure могут быть добавлены к типу данных во время выполнения постфактум даже третьей стороной.
Что-то вроде протоколов Clojure возможно в Java и Scala с помощью таких механизмов, как шаблоны оболочки / прокси или динамические прокси (http://download.oracle.com/javase/1.4.2/docs/guide/reflection/proxy.html). Но они будут намного более неуклюжими, чем протоколы Clojure, и получить правильную идентификацию объекта также сложно.
person
James Iry
schedule
22.12.2010
def call(c:{ def call():Unit }) = c.call()
- person Vasil Remeniuk   schedule 22.12.2010