Исходя из опыта Java, я очень люблю безопасность статических типов и удивляюсь, как программисты clojure решают проблему определений формата данных (возможно, не только типов, но и общих инвариантов, потому что типы являются лишь частным случаем этого).)
Это похоже на существующий вопрос «Безопасность типов в Clojure», но он больше фокусируется на аспекте проверки типов во время компиляции, в то время как меня больше интересует, как проблема прагматичноaddress.
В качестве практического примера я рассматриваю приложение-редактор, которое обрабатывает определенный формат документа.Каждый документ состоит из элементов, которые бывают нескольких разных разновидностей (графические элементы, элементы шрифта и т. Д.). Существуют редакторы для различных типов элементов, а также, конечно, функции для преобразования документа из / в поток байтов в его исходномформат диска.
Основная проблема, которая меня интересует, заключается в том, что редакторы и функции чтения / записи должны согласовать общий формат данных.В Java я бы смоделировал данные документа в виде графа объектов, например, с одним классом, представляющим документ, и одним классом для каждого разнообразия элементов.Таким образом, я получаю гарантию времени компиляции о том, как выглядит структура моих данных, и что поле "ширина" графического элемента является целым числом, а не с плавающей точкой.Это не гарантирует положительную ширину, но использование интерфейса getter / setter позволило бы соответствующему классу добавить такие инвариантные гарантии.
Возможность полагаться на это упрощает код, работающий с этими данными, инарушения формата могут быть обнаружены во время компиляции или на ранней стадии выполнения (когда некоторый код пытается изменить данные, которые будут нарушать инварианты).
Как вы можете добиться подобной «надежности формата данных» в Clojure?Насколько я знаю, нет никакого способа выполнить проверку во время компиляции, и сокрытие данных домена за функциональным интерфейсом, кажется, не приветствуется как не-идиоматическое (или, может быть, я неправильно понимаю?), Так что разработчики Clojure делают, чтобы чувствовать себя в безопасностиформат данных передан в их функции?Как заставить ваш код выдавать ошибку как можно быстрее, а не после того, как пользователь отредактировал еще 20 минут и пытается сохранить на диск, когда функция сохранения замечает, что в списке шрифтов есть графический элемент из-заошибка редактора?
Обратите внимание, что я заинтересован в Clojure и обучении, но еще не написал никакого реального программного обеспечения с ним, поэтому возможно, что я просто запутался, и ответ очень прост - еслитак что, извините за трату вашего времени:).