Подтвердить что ты не робот

Тип безопасности в Clojure

Я хочу спросить, какие типы языков безопасности существуют на Clojure?

Я читал "Практические Clojure" у Люка Вандерхарта и Стюарта Сьерры несколько раз, но у меня все еще есть четкое впечатление, что Clojure (как и другие lisps) не очень серьезно проверяют проверку времени компиляции, Тип безопасности - это всего лишь одна (очень популярная) стратегия для выполнения проверки правильности семантики времени компиляции

Я задаю этот вопрос, потому что я боюсь ошибиться; какие шаблоны проектирования доступны на Clojure для проверки (во время компиляции, а не во время выполнения), что функция, которая ожидает строку, не вызывается с, скажем, целым числом?

Кроме того, я читал очень умных людей, таких как Пол Грэм, открыто выступающих за lisp, позволяющих реализовать все, начиная с языков более низкого уровня, поверх него (большинство скажет, что сам язык переопределяется поверх него), поэтому, если это утверждение будет истинным, тогда тривиальное вещество, такое как проверка типа, должно быть куском пирога. Итак, чувствуете ли вы, что существуют системы типов (или возможность реализовать такие системы типов) в Clojure или другие lisp, которые дают программисту возможность смещать проверку проверки от времени выполнения до времени компиляции или еще лучше, дизайн-время?

4b9b3361

Ответ 1

Единицы компиляции в Clojure очень малы - одна функция. В то время как они развиваются, лисперы имеют тенденцию менять небольшие порции запущенных программ. Введение в статический тип проверки в этом стиле разработки проблематично - для более глубокого обсуждения, почему я рекомендую сообщение Типы являются антимодулярными Gilad Bracha. Clojure предпочитает pre/post-conditions, которые лучше всего подходят для Lisp высокой степени REPL-ориентированной разработки.

Тем не менее, конечно, желательно и возможно построить систему a la carte типа для Clojure. Эта тропа была освещена Ци/Шеном и Типичной Ракеткой. Эта функциональность может быть легко предоставлена ​​в виде библиотеки. Я надеюсь построить что-то подобное в будущем с помощью core.logic - https://github.com/clojure/core.logic.

Ответ 2

Поскольку Clojure является динамическим языком, вся идея состоит не в том, чтобы проверять типы (или многое другое) во время компиляции.

Даже когда вы добавляете подсказки типа к своей функции, не проверяйте их во время компиляции.

Так как Clojure является Lisp, вы можете делать все, что хотите во время компиляции, с макросами и макросами, достаточно мощными, чтобы вы могли писать свои собственные системы типов. Некоторые люди создали системы типов для lisps Typed Racket и Qi. Эти системы типов могут быть столь же мощными, как любая система типов на "нормальном" языке.

Хорошо, теперь мы знаем, что это возможно, но имеет ли Clojure такую ​​дополнительную систему типов? Ответ в настоящее время нет, но есть логический движок (core.logic), который может быть использован для реализации системы типов, но автор еще не работал (пока) в этом направлении.

Ответ 3

Существует библиотека, которая добавляет дополнительную систему типов к Clojure,

http://typedclojure.org/

Обоснование

Статическая типизация имеет хорошо известные преимущества. Например, статически типизированные языки улавливают многие распространенные ошибки программирования в кратчайшие сроки: время компиляции. Типы также служат отличной формой (машинной проверкой) документации, которая почти всегда дополняет существующую рукописную документацию.

Языки без проверки статического типа (динамически типизированные) приносят другие преимущества. Без строгой жесткости обязательного статического набора текста они могут обеспечить более гибкие и прощающие идиомы, которые могут помочь в быстром прототипировании. Часто, когда программа растет, преимущества проверки статического типа желательны.

Эта работа добавляет проверку статического типа (и некоторые ее преимущества) на Clojure, динамически типизированный язык, сохраняя при этом идиомы, характеризующие язык. Он позволяет смешивать статический и динамически типизированный код, поэтому программист может использовать то, что более подходит.