Императивные языки обычно строятся вокруг концепции государства. Следовательно, имеет смысл отражать особенности языка, включая замыкания. Да, такое поведение иногда может сбивать с толку, но это часть проблемы и преимущества наличия состояния в вашем приложении.
Я думаю, что лучшее доказательство этого аргумента - взглянуть на некоторые из самых последних языков, которые поддерживают закрытие. И C #, и VB.Net, императивные языки OO, решили иметь изменяемые замыкания. В то время как F #, функциональный язык, имеет неизменяемые замыкания (в основном, исходя из идеи, что F # является неизменяемым по умолчанию).
Кроме того, что на самом деле означало бы иметь неизменное замыкание на императивном языке? Большинство людей считают, что переменные эквивалентны C # только для чтения. Конечно, типы значений будут защищены от модификации, но как насчет изменяемых ссылочных типов. Вы не сможете изменить место, на которое указывает переменная, но вы можете вызвать мутирующую функцию и получить аналогичный эффект. Например.
class Student {
public string Name { get; set; }
}
void Example() {
var student = new Student() { Name = "foo" };
Action() del = () =>
{ student.Name = "bar"; };
del();
}
Это может быть реализовано с неизменным замыканием, поскольку я фактически не изменяю, куда указывают переменные. Тем не менее, я явно все еще делаю мутантную операцию.