Clojure статической типизации, часть 2 - PullRequest
3 голосов
/ 17 ноября 2010

Это продолжение моего предыдущего вопроса о статической типизации Clojure.

Я просмотрел исходный код Java для компилятора, и есть несколько мест, где он проверяет значение *warn-on-reflection*, но когда я компилирую следующий код, я получаю только ошибку времени выполнения:

(defn div-2 [^String s] (/ 2 s))

Есть ли обстоятельства, когда этот код не должен выдавать предупреждение во время компиляции (это не так)? Насколько сложно было бы, чтобы компилятор выдал предупреждение по следующему коду:

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

Спасибо.

Ответы [ 3 ]

3 голосов
/ 17 ноября 2010

Проблема в том, что компилятор не отслеживает тип def 'dars. Так что да, в вашем простом примере это было бы возможно. Но как часто вы передаете буквальный? Редко, в реальной программе.

Чтобы сделать типы "текущими", как в реальном статически типизированном языке, потребовалось бы значительное количество переделок. Вам придется отслеживать информацию о типах с помощью переменных, динамически восстанавливать переменные, разыменования и т. Д. И тогда у вас все еще возникает проблема извлечения элементов из коллекций / последовательностей, что подразумевает обобщенные типы, то есть огромный банка червей ...

Аннотации типов в Clojure никогда не предназначались для обеспечения безопасности типов во время компиляции - они просто позволяют компилятору генерировать более оптимизированный код (за счет ошибки времени выполнения при обнаружении непредвиденного типа.)

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

2 голосов
/ 22 сентября 2011

Вместо того, чтобы пытаться изменить компилятор, почему бы не написать отдельный инструмент, который просто сканирует файл кода Clojure и предупреждает о нарушениях типа? Вы можете разработать собственную нотацию типов, используя макросы, которые просто превращаются в обычный нетипизированный код Clojure. Но когда вы запускаете статическую проверку типов, она выдаст предупреждения и выдаст предупреждения.

Если бы вы готовились к чуть более сложной задаче, вы могли бы даже сделать так, чтобы она делала вывод типа, таким образом снижая нагрузку на нотацию.

1 голос
/ 05 декабря 2012

Следуя этой теме, теперь существует проект, направленный на постепенное печатание (например, Дарт и т. Д.).Стоит проверить это: Typed-Clojure

Если кто-то также может дать отзыв после реального использования ...

...