LINUX.ORG.RU

История изменений

Исправление 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 данная функция выполнится без проблем. Мы можем вынести case в отдельную функцию, возвращающую (or fixnum null) и принять его результат в функцию, принимающую просто fixnum. Выполнение программы без ошибок возможно, поводов для предупреждения нет.

Т.е. я пока остаюсь с выводом, что система типов - это некий костыль кастомной формы, просто в разных языках эта форма разная. «Дети, это понять нельзя, это надо запомнить».

Однако я остаюсь при своём мнении о том, что 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 - это статическая типизация.