но теперь не завершены, и вызов новой функции с таким типом приведет к

ге "Радость Clojure",defprotocol предлагается в качестве решения дляпроблема выражения - «желание реализовать существующий набор абстрактных методов для существующего конкретного класса без необходимости изменения кода, который определяет либо».

Пример приведен ниже:

(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)

Предполагается, что это невозможно на языке, подобном Java, но чем он отличается от следующего?

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;
  }
}

Ведь оба используются одинаково:

(cat "House" " of Leaves")
Util.cat("House", " of Leaves");

Функция Clojurecat являетсяне a метод наString а такжеList классы, а скорее независимыйфункция перегружен, чтобы принять либоString или жеList аргументы.

Хотя мне действительно нравится Clojure, я не понимаю претензий на превосходство этой конструкции.

Ответы на вопрос(2)

Ваш ответ на вопрос