Почему у Clojure есть 5 способов определить класс вместо одного?

Clojure имеет gen-класс, reify, proxy, а также deftype и defrecord для определения новых типов классов. Для языка, который ценит синтаксическую простоту и не терпит ненужной сложности, это выглядит как аберрация. Может кто-нибудь объяснить, почему это так? Может быть, обычного дефлекса в стиле Лиспа хватило?

77 голосов | спросил Salil 22 AM00000060000002531 2011, 06:03:25

2 ответа


0

Это сочетание трех разных факторов:

  1. Конкретная система типов jvm
  2. Потребность в немного другой семантике для разных случаев использования при определении типов
  3. Тот факт, что некоторые из них были разработаны ранее, а некоторые позже, по мере развития языка.

Итак, давайте сначала рассмотрим, что они делают. deftype и gen-class похожи в том, что они оба определяют именованный класс для досрочной компиляции. Gen-класс пришел первым, затем следуют deftype в версии 1.2. Deftype является предпочтительным, и имеет лучшие характеристики производительности, но является более ограничительным. Класс deftype может соответствовать интерфейсу, но не может наследоваться от другого класса.

Reify и прокси используются для динамического создания экземпляра анонимного класса во время выполнения. Прокси появился первым, reify вышел вместе с deftype и defrecord в версии 1.2. Reify предпочтителен, как и deftype, где семантика не слишком ограничительна.

Это оставляет вопрос о том, почему и deftype, и defrecord, так как они появились в одно и то же время и играют сходную роль. В большинстве случаев мы захотим использовать defrecord: он обладает всеми различными добродетелями clojure, которые мы знаем и любим, sequability и так далее. Deftype предназначен для использования в качестве низкоуровневого стандартного блока для реализации других структур данных. Он не включает в себя обычные интерфейсы clojure, но у него есть опция изменяемых полей (хотя это не значение по умолчанию).

Для дальнейшего чтения ознакомьтесь:

Страница типов данных clojure.org

Нить группы Google, в которой были представлены deftype и reify

ответил Rob Lachlan 22 AM00000070000005431 2011, 07:20:54
0

Короткий ответ: все они имеют разные и полезные цели. Сложность связана с необходимостью эффективного взаимодействия с различными функциями базовой JVM.

Если вам не требуется взаимодействие с Java , то в 99% случаев лучше придерживаться либо defrecord, либо простой карты Clojure.

  • Используйте defrecord, если вы хотите использовать протоколы
  • В противном случае обычная карта Clojure, возможно, является самой простой и понятной

Если ваши потребности более сложны, то следующая блок-схема - отличный инструмент для объяснения того, почему вы выбрали бы один из этих вариантов среди других:

http: //cemerick.com/2011/07/05/flowchart-for-choosing-the-right-clojure-type-definition-form/

 Блок-схема для выбора правильной формы определения типа clojure

ответил mikera 22 PM00000010000000131 2011, 13:34:01

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132