История изменений
Исправление Miguel, (текущая версия) :
Прелести динамической типизации.
Список в нормальном языке устроен примерно так:
data List a = Nil | Cons a (List a)
Это удобно, так как появляется возможность, скажем, паттерн-матчить список:
case myMegaList of
Nil -> шо-то одно
Cons hd tl -> шо-то другое, использующее hd и tl
Ну, то, что оно удобно, все и так понимают. Но если статических типов нет, то в Cons вторым аргументом может прилететь что попало, а не только список. Соответственно, мы либо шлём список лесом при создании, либо разрешаем иметь Cons, где «хвост» — не список, а не пойми что.
Ну а так как идеология Лиспа состоит в том, чтобы обеспечивать программиста максимальным количеством секса на рабочем месте, то обнаружение ошибок там откладывается на как можно позже. То есть, приходится точечные пары разрешать.
Другая причина — это присущее всем низкоуровневым языкам желание дать программисту максимальный доступ к потрохам, чтобы он покопался там вволю и опять-таки поимел секса.
Исходная версия Miguel, :
Прелести динамической типизации.
Список в нормальном языке устроен примерно так:
data List a = Nil | Cons a (List a)
Это удобно, так как появляется возможность, скажем, паттерн-матчить список:
case myMegaList of
Nil -> шо-то одно
Cons hd tl -> шо-то другое, использующее hd и tl
Ну, то, что оно удобно, все и так понимают. Но если статических типов нет, то в Cons вторым аргументом может прилететь что попало, а не только список. Соответственно, мы либо шлём список лесом при создании, либо разрешаем иметь Cons, где «хвост» — не список, а не пойми что.
Ну а так как идеология Лиспа состоит в том, чтобы обеспечивать программиста максимальным количеством секса на рабочем месте, то обнаружение ошибок там откладывается на как можно позже. То есть, приходится точечные пары разрешать.
Другая причина — это присущее всем низкоуровневым языкам желание дать программисту максимальный доступ к потрохам, чтобы он покопался там вволю и опять-таки поимел секса.