Подтвердить что ты не робот

Clojure статическая типизация

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

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

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

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

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

Любые мысли о выполнимости?

4b9b3361

Ответ 1

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

Ответ 2

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

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

alt text

Ответ 4

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

Ответ 5

Объявление может содержать подсказки типов, поэтому можно объявить var, который "является" типом, который еще не определен, но содержит данные о структуре, но это было бы действительно неуклюже, и вы должны были бы сделать это раньше любой путь кода, который может быть выполнен до того, как будет определен тип. В принципе, вы бы хотели определить все свои пользовательские типы спереди, а затем использовать их как обычно. Я думаю, что это делает библиотеку несколько хакерской.

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

Ответ 6

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