Я полагаю, что это довольно новые инновации в Clojure.
CLOS - довольно сложная, полнофункциональная объектно-ориентированная система.Он включает в себя различные методы ООП, о которых вы часто упоминаете, и которые существуют в других объектно-ориентированных языках - множественное наследование, динамическая диспетчеризация, универсальные функции и т. Д.
Clojure использует другой подход - типы и записи намного проще, чем полный ООП ине предназначены для составления полной ООП-системы.Скорее я понимаю, что дизайн мотивирован:
- Убеждением, что многие методы ООП действительно вредны при построении больших систем - например, наследование реализации
- Возможность получить максимальную производительность(то же самое, что и Java) для наиболее распространенного случая полиморфизма (т. е. единичная диспетчеризация по типу)
- Желание решить " проблему выражения ", которую вы можете сделать в Clojure, используяdeftype / defrecord вместе с протоколами
- Намерение сделать все записи / типы неизменяемыми, чтобы соответствовать остальной философии Clojure
Если вам нужна традиционная объектно-ориентированная система, такая как CLOSбыло бы возможно построить это в Clojure поверх типов и записей.Вы также можете использовать объектную ориентацию в стиле Java непосредственно в Clojure.Однако я полагаю, что это обычно не рекомендуется экспертами Clojure - Clojure обычно предлагает вам разные или лучшие способы решения одних и тех же проблем.
В целом - Clojure обычно предоставляет вам «простые» инструменты, которые вы можете составить для решенияпроблема под рукой, а не прописывать сложные рамки в любой момент.Это интересная философия , довольно подробно обсуждаемая в этом видео Стюартом Хэллоуэем .