Прочитал тут заметку про красоту замыканий и у меня появились смутные сомнения по поводу того, как появилось эта, в разных смыслах, положительных и отрицательных (я не к тому, чтобы встать на какую-то сторону, я за разумное разнообразие), хитрая техника построения кода.
В большинстве языков является естественным распространение области видимости переменных из внешнего блока во все внутренние блоки кода. Приведу пример, чтобы не было сомнений (псевдо-код намеренно нарушает синтаксис известных мне языков, чтобы не быть отнесенным явно к одному из них):
Function(type par)
{//outer block(see“inner block”father)
Int X = 123;
If(par == someConst)
{//inner block
We can use X here!
}
}
Определение для Лямбда-функции тоже создает внутренний блок кода:
Action Function(type par)
{//outer block (see “inner block” father)
Int X = 123;
If(par == someConst)
goto Label; //we need goto just to escape definition of extra inner block
Return lambda=>
{// inner block
some code that uses X in the block
};
Label:
We can still use X here!
}
Интересно! Это только мне кажется, что передача переменных из окружающего кода в код Лямбда-функции, ВОЗМОЖНО, изначально была ошибкой при разработке компилятора, когда стандартный способ распространения области видимости переменных по недосмотру применили к вновь появившимся инлайн реализациям функций? Но потом кто-то нашел применение такой возможности и, как это часто бывает, «Бага»(bug) превратилась в «Фичю» (feature)?