История изменений
Исправление den73, (текущая версия) :
И кстати, это поведение задокументировано в руководстве CMU CL:
If the compiler can prove at compile time that some portion of the program cannot be executed without a type error, then it will give a warning at compile time.
Т.е. если выполнение программы возможно без ошибок (на неких входных данных), то это не ошибка. Правда, тогда непонятно, почему здесь предупреждение компилятора (тоже пример из руководства):
(defun raz (foo)
(let ((x (case foo
(:this 13)
(:that 9)
(:the-other 42))))
(declare (fixnum x))
(foo x)))
Т.е. я пока остаюсь с выводом, что система типов - это некий костыль кастомной формы, просто в разных языках эта форма разная. «Дети, это понять нельзя, это надо запомнить».
Однако я остаюсь при своём мнении о том, что declare type - это статическая типизация.
Исходная версия den73, :
И кстати, это поведение задокументировано в руководстве CMU CL:
If the compiler can prove at compile time that some portion of the program cannot be executed without a type error, then it will give a warning at compile time.
Т.е. если выполнение программы возможно без ошибок (на неких входных данных), то это не ошибка. Правда, тогда непонятно, почему здесь ошибка (тоже пример из руководства):
(defun raz (foo) (let ((x (case foo (:this 13) (:that 9) (:the-other 42)))) (declare (fixnum x)) (foo x)))
Ведь при некоторых значения foo данная функция выполнится без проблем.
Т.е. я пока остаюсь с выводом, что система типов - это некий костыль кастомной формы, просто в разных языках эта форма разная.
Однако я остаюсь при своём мнении о том, что declare type - это статическая типизация.