Вопрос

Это следующее мой предыдущий вопрос на Clojure Static печатать.

Я просматривал исходный код 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))

Спасибо.

Это было полезно?

Решение

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

Изготовление типов «поток», как они делают в реальном статически набранном языке, потребуют обширного количества переработки. Вам придется отслеживать информацию о типе через vars, динамически отскок vars, разделываний и т. Д., А затем вы еще иметь вопрос вытягивания предметов из коллекций / последовательностей, что подразумевает извлеченные типы, что является огромный банка червей...

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

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

Другие советы

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

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

После этого потока теперь есть проект, направленный на постепенное набрав в Clojure (например, DART и т. Д.). Стоит тестировать это:Напечатано-Clojure

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top