Хорошо известные языки, поддерживающие лексически вложенные функции, включают :
- Языки на основе ALGOL, такие как ALGOL 68, Simula, Pascal, Modula-2, Modula-3, Oberon иAda.
- Современные версии Lisp (с лексической областью действия), такие как Scheme и Common Lisp.
- Сценарий ECMA (JavaScript и ActionScript).
- Полная поддержка в Scala
- Различные степени поддержки в языках сценариев, таких как Ruby, Python и Perl (начиная с версии 6).
- Существует также язык, связанный с C, с вложенными функциями, язык D.
- GCC также поддерживает вложенные функции в C как расширение языка. 1
- Fortran, начиная с Fortran-90, поддерживает один уровень вложенных (CONTAINed) подпрограмм ифункции.
В вашем случае функция s
будет доступна только в пределах t
.
Вложенная функция - это функция, определенная внутри другой функции.(Вложенные функции не поддерживаются для GNU C ++.) Имя вложенной функции является локальным для блока, в котором она определена.Например, здесь мы определяем вложенную функцию с именем square и вызываем ее дважды:
foo (double a, double b)
{
double square (double z) { return z * z; }
return square (a) + square (b);
}
Вложенная функция может получить доступ ко всем переменным содержащейся функции, которые видны в точке ее определения.Это называется лексическим ограничением.Например, здесь мы показываем вложенную функцию, которая использует унаследованную переменную с именем offset:
bar (int *array, int offset, int size)
{
int access (int *array, int index)
{ return array[index + offset]; }
int i;
/* ... */
for (i = 0; i < size; i++)
/* ... */ access (array, i) /* ... */
}
Определения вложенных функций разрешены внутри функций в местах, где допускаются определения переменных;то есть в любом блоке смешивается с другими объявлениями и операторами в блоке.
См. «Вложенные функции - Использование коллекции компиляторов GNU (GCC)»