Ответ 1
Это, безусловно, возможно. Компилятор уже выполняет некоторую проверку статического типа вокруг примитивных типов аргументов в ветке разработки 1.3.
Я знаю, что это может звучать как богохульство Lisp aficionados (и других любителей динамических языков), но насколько сложно было бы улучшить компилятор 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
Да! Похоже, что существует проект, core.typed
, чтобы сделать факультативный статический тип проверки реальностью. См. проект Github и его
документация
Эта работа выросла из дипломной дипломной работы (PDF) от Ambrose Bonnaire-Sergeant и связана с система Typed Racket.
Поскольку одна форма считывается и оценивается одновременно, у вас не может быть прямой ссылки, что делает ее несколько ограниченной.
Объявление может содержать подсказки типов, поэтому можно объявить var, который "является" типом, который еще не определен, но содержит данные о структуре, но это было бы действительно неуклюже, и вы должны были бы сделать это раньше любой путь кода, который может быть выполнен до того, как будет определен тип. В принципе, вы бы хотели определить все свои пользовательские типы спереди, а затем использовать их как обычно. Я думаю, что это делает библиотеку несколько хакерской.
Я не хотел предлагать ранее, что это невозможно, просто для пользовательских типов это намного сложнее, чем для заранее определенных типов. Преимущество этого и затрат - это то, что следует серьезно рассмотреть. Но я призываю всех, кто заинтересован попробовать и посмотреть, смогут ли они работать!
Старый вопрос, но два важных момента: я не думаю, что Clojure поддерживает макросы считывателя, только обычные макросы lisp. И теперь у нас есть опция core.typed для ввода в Clojure.