
- •Декларативные и императивные языки.
- •Стандартизация языков программирования
- •Типы данных
- •Структуры данных
- •Парадигма программирования
- •Способы реализации языков
- •Языки функционального программирования
- •Создание универсального функционального языка.
- •3. Символьная обработка и искусственный интеллект.
- •4. Применение искусственного интеллекта.
- •5. Основы языка лисп (6 – 15 вопросы)
- •6. Символы и списки
- •7. Понятие функции
- •8. Базовые функции Лиспа.
- •9. Имя и значение символа Лиспа.
- •10. Определение функций Лиспа.
- •11. Передача параметров в область их действия Лиспа.
- •11. Вычисления в Лиспе.
- •13 . Внутреннее представление списков в Лиспе
- •14. Свойства символа Лиспа.
- •15. Ввод и вывод в Лиспе.
- •16.Основы рекурсии.
- •17.Простая рекурсия.
- •18.Другие виды рекурсии.
- •19.Функции более высокого порядка.
- •20.Применяющие функционалы.
- •21.Отображающие функционалы.
- •22.Замыкания.
- •23.Абстрактный подход в Лиспе.
- •24.Макросы.
- •25.Понятия. Числа. Символы. Списки. Строки. Последовательности. Массивы. Структуры.
- •26.Развитие языка лисп и лисп-системы. История лисПа. Лисп-системы. Лисп-машины.
22.Замыкания.
С точки зрения эффективности работы транслятора было бы правильно, а с точки зрения вычисления функционала в некоторых случаях и необходимо, чтобы интерпретатор уже на этапе вызова функционала мог отличить функциональный аргумент от обычного. Функциональный аргумент можно пометить с помощью специальной, предотвращающей вычисления формы FUNCTION:
В отличие от обычной блокировки вычислений с помощью QUOTE форму FUNCTION называют функциональная блокировка. Функциональную блокировку так же, как и QUOTE, можно записывать сокращенно:
Если нужно передать функции данные в том виде, как они записаны, то используется обычная форма QUOTE. QUOTE достаточно и для передачи имени функции или лямбда-выражения, если в нем не используются свободные переменные. Работа со свободными переменными оказывается более сложной, чем с параметрами, поскольку значения свободных переменных зависят от контекста вычислений.
определения
Сформированный на время вычисления функции вычислительный контекст после окончания ее вычисления пропадает, и на него невозможно позже сослаться или вернуться к нему. Часто бывает полезным и необходимым, чтобы функция для продолжения вычислений могла запомнить связи и состояние более раннего контекста. Это достигается с помощью таких функциональных объектов, в которых вместе с самим описанием вычислений сохраняется контекст момента определения функционального объекта, защищенный от более позднего контекста вызова. Пара, состоящая из функции и контекста называется замыканием или лексическим замыканием. Замыкание, как и имя функции или лямбда-выражение, можно использовать в качестве функционального аргумента.
В Коммой Лиспе замыкание создается формой FUNCTION. Например:
В замыкание из контекста определения функции включаются лишь связи свободных переменных функции. Значения формальных параметров, в примере значение х, сохранять нет необходимости, поскольку они получают новые значения в момент применения такого замыкания. Если в замыкаемой функции нет свободных переменных, то форма FUNCTION ни чем не отличается от формы QUOTE.
Замыкание можно сохранять также, как любой лисповский объект, присваивая его какой-нибудь переменной. Сохраненное таким образом замыкание можно снова использовать и применять к аргументам так же, как функцию или лямбда-выражение, с тем лишь отличием, что значения свободных переменных замкнутой функции определяются в соответствии со связями из статического контекста момента создания замыкания, а не из динамического контекста момента вызова.
Замыкание можно трактовать как функцию, вычисление которой осуществлено лишь частично, окончательное вычисление функции отложено на момент ее вызова. При создании замыкания из определения функции формируется частично вычисленный контекстный объект и, чтобы осуществить окончательные вычисления, ему следует передать значения недостающих параметров.
Замыкание хорошо подходит для программирования генераторов. Под генератором (generator) понимают функциональный объект, из которого можно получать новые, отличные от прежних значения. При каждом вызове генератор порождает значение некоторого типа, которое является в некотором смысле следующим по порядку. Генераторам присуща следующая особенность: значения порождаются только при необходимости (demand generator) и формирование следующего значения основано на предыдущем.