50
$inner=function ($a) use ($x, $y) //Определение
внутренней
функции
{
$b=4; //Локальная переменная
внутренней функции
/* А дальше складываются
переменные внутренней и
*
внешней функций, как будто все они локальные
* переменные внутренней функции
*/
$res=$x+$y+$a+$b;
echo $res; //Результат 10 в нашем примере.
};
$inner(3); //Вызов внутренней функции
}
outer(1);
Механизм замыканий тесно связан с
лямбда-функциями (безымянными
функциями,
использующими
текущий
контекст
программы).
Первоначально они нашли широкое применение в функциональном
программировании (языки Лисп
— см. соответствующий раздел настоящей
книги, Хаскелл, Scheme), но затем получили распространение и в языках
императивной парадигмы (Ruby, PHP, Питон и др.).
Пример на языке Питон:
(lambda x: x*2)(3) → 6
Контрольные вопросы и упражнения
3.
Как выглядит императивная программа?
4.
В чем назначение номеров строк в программе? В чем назначение меток?
5.
Что такое процедурная и декларативная секции программы?
6.
Что такое линейная программа? Приведите примеры.
7.
В чем состоят функции и какова структура оператора присваивания?
8.
В чем заключается назначение и какова структура условного оператора?
9.
В чем заключается назначение, каковы варианты и структура оператора
выбора?
10.
Каким образом можно организовать повторение одних и тех же
действий в программе?
11.
Что такое рекурсия? В чем назначение граничного условия в
рекурсивных программах?
12.
Что такое итерация? В чем преимущества и недостатки итерации по
сравнению с рекурсией?
52
как и в каком порядке происходит обработка, структуры данных должны
четко описывать, что именно обрабатывается, — и на это описание
затрачивается значительная часть усилий программиста. И если, как
говорит Никлаус Вирт, программы — это алгоритмы плюс структуры
данных, в языках программирования должны быть средства описания
алгоритмов и средства описания данных.При этом то, насколько удобно и
эффективно можно описать данные, зависит от встроенных в язык
программирования возможностей.
Некоторые языки программирования требуют, чтобы до их использования
все переменные, аргументы и возвращаемые значения функций и процедур
были объявлены с указанием типа (Алгол, Ада, Паскаль, С/C++). Другие
(Лисп, РАПИРА, PHP) этого не требуют, переменная в них приобретает
тип в зависимости от первого присвоенного ей значения. При этом в
большинстве языков программирования переменные могут иметь только
один тип во все время их существования. Но в некоторых тип может
меняться во время исполнения программы. В первом случае говорят о
статической, во втором — о
динамической типизации.
Языки программирования могут быть как с явной, так и с неявной
системой типов. В первом случае четко фиксируется, к какому типу
относится та или иная переменная или константа, во втором об этом
отдельно речь не идет, тем не менее данные обычно обрабатываются по-
разному. И у первого, и у второго подхода имеются как достоинства, так и
недостатки. Динамическая неявная типизация расширяет возможности
использования переменных и избавляет программиста от хлопот,
связанных с объявлением и контролем соответствия типов. Кроме того,
данный подход позволяет создавать более универсальные и проще
интегрируемые программные модули. Однако это требует от программиста
большей ответственности, поскольку во время выполнения программы
возможны неожиданности вроде попыток перемножить две строки или
Достарыңызбен бөлісу: