Это довольно распространенная техника на других языках. Почти каждая высокоуровневая особенность Схемы определяется в терминах лямбд, которые называются немедленно.
В JavaScript это основа "шаблона модуля", например
var myModule = (function() {
// declare variables and functions (which will be "private")
return {
// populate this object literal with "public" functions
};
})();
Таким образом, анонимная функция объявляется и немедленно вызывается, так что любые внутренние детали скрыты, и только возвращаемое значение отображается снаружи.
Единственным недостатком является то, что при случайном чтении кода операторы return
будут возвращаться из внешней функции (во время Java-лямбда-войн возникли серьезные разногласия по этому поводу). Но к этому нужно привыкнуть, когда на вашем языке появятся лямбды.
В императивном языке, таком как C ++, есть много языковых функций, которые выиграли бы от возможности возвращать значение (вместо того, чтобы быть похожими на void
функцию). Например, if
имеет альтернативу, третичный оператор expr ? a : b
.
В Ruby практически все операторы могут быть оценены, поэтому нет необходимости в отдельном синтаксисе, в котором можно указать возвращаемое значение. Если бы C ++ работал таким образом, это означало бы что-то вроде:
auto result = try
{
getIntegerSomehow();
}
catch (const SomeException &)
{
0;
}