Я знаю, что это может звучать как богохульство поклонникам Лиспа (и другим любителям динамических языков), но насколько сложно было бы улучшить компилятор Clojure для поддержки статической (компиляции) проверки типов?Clojure static typing
Отключение аргументов за и против статического и динамического ввода, возможно ли это (не «это целесообразно»)?
Я думал, что добавление нового макроса читателя для принудительного использования типа времени компиляции (расширенная версия макроса # ^) и добавление информации о типе в таблицу символов позволит компилятору отмечать места, где были переменные неправильно. Например, в следующем коде, я ожидал бы ошибку во время компиляции (# * является «время компиляции» типа макро):
(defn get-length [#*String s] (.length s))
(defn test-get-length [] (get-length 2.0))
#^Макрос может быть даже повторно с глобальным переменным (*compile-time-type-checking*
), чтобы заставить компилятор выполнить проверки.
Любые мысли о выполнимости?
(definline t [] (list '.charAt "hello" (nth [1 "a" 2: c 0] (rand-int 4)))) – Pepijn
+1 Мне очень нравится получать некоторую дополнительную проверку статического типа в clojure a la racket http: //docs.racket-lang.org/ts-guide/begin.html – jneira
Некоторые распространенные компиляторы Lisp, такие как SBCL, обнаруживают некоторые ошибки статического типа, как этот. –