История изменений
Исправление quasimoto, (текущая версия) :
Что это за бред?
Реальная ситуация. Сейчас я нечто подобное вижу с node.js (а то что там весь рантайм держится на честном слове кооперативной многозадачности - вообще сказка) и единственный способ добиться вменяемой информации о состоянии системы - куча отладочной информации и тестов часто делающих то что должна делать система типов.
Мы о нормальных языках говорим, а не о говне, которое выблевывает вместо ошибки «1 is not NULL» + невменяемый стек вызовов.
Это SBCL себя так иногда ведёт :)
А как иначе? Динамика предполагает контракт ... T ... -> ... T ..., но код при этом сугубо частичен, то есть на аргументе типа T вызываются функции типа ... (a <: T) ... -> ... В сколько нибудь сложном control flow на это место рано или поздно попадает (b <: T) отличный от a и код уходит в исключение/рестарт - можно остановит нить и предъявить стек вызовов (который может быть большой) до места где b попало на место a, также озвучить типы a и b вместе с объектом b. Но почему это происходит ещё предстоит выяснить (то есть почему данные формируются так и программа работает так, что, например, числа попадают в ту часть control flow где должны быть списки). Система типов при этом это всегда нечто такое, что должно сделать поведение программы более _логичным_ (жестким и специфичным).
Исходная версия quasimoto, :
Что это за бред?
Реальная ситуация. Сейчас я нечто подобное вижу с node.js (а то что там весь рантайм держится на честном слове кооперативной многозадачности - вообще сказка) и единственный способ добиться вменяемой информации о состоянии системы - куча отладочной информации и тестов часто делающих то что должна делать система типов.
Мы о нормальных языках говорим, а не о говне, которое выблевывает вместо ошибки «1 is not NULL» + невменяемый стек вызовов.
Это SBCL себя так иногда ведёт :)
А как иначе? Динамика предполагает контракт ... T ... -> ... T ..., но код при этом сугубо частичен, то есть на аргументе типа T вызываются функции типа ... (a <: T) ... -> ... В сколько нибудь сложном control flow на это место рано или поздно попадает (b <: T) отличный от a и код уходит в исключение/рестарт - можно остановит нить и предъявить стек вызовов (который может быть большой) до места где b попало на место a, также озвучить типы a и b вместе с объектом b. Но почему это происходит ещё предстоит выяснить (то есть почему данные формируются так и программа работает так, что, например, числа попадают в ту часть control flow где должны быть списки).