Вопрос

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

Отмечая аргументы для и против статического и динамического набора типирования, возможно ли это (не «это целесообразно»)?

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

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

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

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

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

Решение

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

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

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

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

alt text

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

Эта работа Выросла из диссертации с отличием бакалавриата (PDF) Амброузом Боннер-Серьянт и связан с Напечатанная ракетка система.

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

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

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

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

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