Clojure статическая типизация - PullRequest
23 голосов
/ 15 ноября 2010

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

Если оставить в стороне аргументы за и против статической и динамической типизации, возможно ли это (а не "рекомендуется ли это")?

Я думал, что добавление нового макроса читателя для принудительной установки типа времени компиляции (расширенная версия макроса # ^) и добавление информации о типе в таблицу символов позволит компилятору помечать места, где переменные используются неправильно , Например, в следующем коде я ожидал бы ошибку времени компиляции (# * - макрос типа «время компиляции»):

(defn get-length [#*String s] (.length s))
(defn test-get-length [] (get-length 2.0))

Макрос # ^ можно даже повторно использовать с глобальной переменной (*compile-time-type-checking*), чтобы заставить компилятор выполнять проверки.

Есть мысли о целесообразности?

Ответы [ 6 ]

10 голосов
/ 15 ноября 2010

Это наверняка возможно. Однако я не думаю, что Clojure когда-либо получит какую-либо форму слабой статической типизации - это слишком мало преимуществ.

Рич Хикки, однако, несколько раз выражал ему свою симпатию за сильную, необязательную и выразительную особенность печатания языка Ци, http://www.lambdassociates.org/qilisp.htm

alt text

7 голосов
/ 19 марта 2013

Да!Похоже, что сейчас идет проект, core.typed, чтобы сделать необязательную проверку статического типа реальностью.См. проект Github и его документацию

Эта работа выросла из дипломной работы бакалавра с отличием (PDF) Амброуза Боннера-сержанта, иотносится к системе Typed Racket .

7 голосов
/ 15 ноября 2010

Это, конечно, возможно. Компилятор уже выполняет некоторую статическую проверку типов вокруг примитивных типов аргументов в ветке разработки 1.3.

0 голосов
/ 17 октября 2013

Старый вопрос, но два важных момента: я не думаю, что Clojure поддерживает макросы чтения, только обычные макросы lispИ теперь у нас есть опция core.typed для ввода в Clojure.

0 голосов
/ 15 ноября 2010

Declare может иметь подсказки типа, поэтому можно объявить переменную, которая «является» типом, который еще не был определен, но содержит данные о структуре, но это было бы очень неуклюже, и вам придется сделать это раньше любой путь кода, который может быть выполнен до определения типа. По сути, вы хотели бы определить все ваши пользовательские типы заранее, а затем использовать их как обычно. Я думаю, что это делает чтение библиотек несколько хакерским.

Я не хотел ранее предполагать, что это невозможно, просто для пользовательских типов это намного сложнее, чем для предварительно определенных типов. Выгода от этого по сравнению с затратами - это то, что следует серьезно рассмотреть. Но я призываю всех, кому интересно, попробовать и посмотреть, смогут ли они заставить это работать!

0 голосов
/ 15 ноября 2010

Поскольку одна форма читается И оценивается за раз, вы не можете иметь прямые ссылки, делающие это несколько ограниченным.

...