Тип безопасности в Clojure
Я хочу спросить, какие типы языков безопасности типов существуют в Clojure?
Я уже несколько раз читал "Практическое Clojure" от Люка Вандерхарта и Стюарта Сьерры, но у меня все еще есть отчетливое впечатление, что Clojure (как и другие списки) не очень серьезно относится к проверке во время компиляции. Безопасность типов - это всего лишь одна (очень популярная) стратегия для проверки правильности семантики во время компиляции.
Я задаю этот вопрос, потому что мне не терпится оказаться неправым; Какие шаблоны проектирования доступны в clojure для проверки (во время компиляции, а не во время выполнения), что функция, которая ожидает строку, не вызывается, скажем, со списком целых чисел?
Кроме того, я читал очень умных людей, таких как Пол Грэм, открыто выступающих за lisp, позволяющий реализовывать все, начиная с языков более низкого уровня, (большинство скажет, что сам язык переопределяется поверх него), так что если это утверждение было бы правдой, тогда тривиальные вещи, такие как проверка типов, должны быть кусочком пирога. Итак, считаете ли вы, что существуют системы типов (или возможность реализовывать такие системы типов) в clojure или других списках, которые дают программисту возможность переносить проверку валидации с времени исполнения на время компиляции или, что еще лучше, на разработку? время?
3 ответа
Компиляция блоков в Clojure очень мала - это отдельная функция. Лисперс имеет тенденцию изменять небольшие части запущенных программ во время их разработки. Внедрение статической проверки типов в этот стиль разработки проблематично - для более глубокого обсуждения, почему я рекомендую пост- типы анти-модульные от Гилада Брача. Таким образом, Clojure предпочитает предварительные / постусловия, которые лучше сочетаются с разработкой Lisp с высокой степенью REPL.
Тем не менее, безусловно, желательно и возможно создать систему типа а-ля-карт для Clojure. Этот след был проложен Ци / Шеном и Типизированной ракеткой. Эта функциональность может быть легко предоставлена в виде библиотеки. Я надеюсь построить что-то подобное в будущем с core.logic - https://github.com/clojure/core.logic.
Поскольку Clojure является динамическим языком, вся идея не в том, чтобы проверять типы (или многое другое) во время компиляции.
Даже когда вы добавляете подсказки типа в вашу функцию, они не проверяются во время компиляции.
Поскольку Clojure - это Lisp, вы можете делать все, что захотите во время компиляции, с помощью макросов, и макросы достаточно мощные, чтобы вы могли писать свои собственные системы типов. Некоторые люди сделали системы типов для рюкзаков Typed Racket и Qi. Эти системы типов могут быть такими же мощными, как любая система типов на "нормальном" языке.
Хорошо, теперь мы знаем, что это возможно, но есть ли у Clojure такая необязательная система типов? Ответ в настоящее время нет, но есть логический механизм (core.logic), который можно использовать для реализации системы типов, но автор еще не работал (пока) в этом направлении.
Есть библиотека, которая добавляет необязательную систему типов в Clojure,
обоснование
Статическая типизация имеет хорошо известные преимущества. Например, статически типизированные языки отлавливают много общих ошибок программирования в самое ближайшее время: время компиляции. Типы также служат отличной формой (проверяемой компьютером) документации, которая почти всегда дополняет существующую рукописную документацию.
Языки без статической проверки типов (с динамической типизацией) дают другие преимущества. Без строгой жесткой обязательной статической типизации они могут обеспечить более гибкие и прощающие идиомы, которые могут помочь в быстром прототипировании. Часто преимущества статической проверки типов желательны по мере роста программы.
Эта работа добавляет статическую проверку типов (и некоторые ее преимущества) к Clojure, динамически типизированному языку, сохраняя при этом идиомы, которые характеризуют язык. Это позволяет смешивать статический и динамически типизированный код, чтобы программист мог использовать то, что больше подходит.