2010-11-17 2 views
3

Данная статья является дополнением к my previous question по статической типизации Clojure.Статическая типизация Clojure, часть 2

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

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

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

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

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

+0

Несчастных, но я думаю, что вы правы. – Ralph

+1

, и можно ли использовать метаданные lang-конструкций, чтобы получить некоторый вкус проверки статического типа над ними, без изменения языка? – jneira

2

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

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

+1

Тип вывода не так, но вам нужно знать тип всех функций библиотеки/предопределенных или импортированных функций. – Ingo

+0

Как можно «сканировать файл кода clojure»? – jayunit100

+1

@ jayunit100 Поскольку код lisp - это всего лишь s-выражения, они могут быть прочитаны читателем Lisp. Вы можете даже ходить по макрокомандному коду. Там есть несколько разных ходунков для Common Lisp, не уверенный в Clojure. Один из них может быть применен в долг. –

1

Следуя за этой нитью, теперь есть проект, целью которого является постепенный ввод текста в clojure (например, Dart и т. Д.). Стоит тестирование: Typed-Clojure

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

 Смежные вопросы

  • Нет связанных вопросов^_^