Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Spec_Mov_3k_4k_Lect.doc
Скачиваний:
0
Добавлен:
01.03.2025
Размер:
1.46 Mб
Скачать

Вопросы для самоконтроля

  • Что из себя представляет рекурсия по значению?

  • Что из себя представляет рекурсия по аргументам?

  • Дайте определение простой, параллельной и взаимной рекурсий!

  • Что из себя представляют рекурсии высших порядков?

  • В чем суть метода накапливающих параметров?

  • Что в Лиспе называется функционалом?

  • Какие типы аргументов являются функциональными?

  • Какие встроенные функции Лиспа являются применяющим функционалами?

  • Что из себя предстпвляют отображающие функционалы?

Вопросы на самостоятельную проработку

  • Є наступна об'ява функції (defun count (x)(if (null x) nil(cons (if (numberp (car x)) (add1 (car x)) (car x))(count (cdr x))))). Який результат обчислення наступного виразу – (count '(1 a 5 6 x y )), якщо (numberp x) повертає значення t, якщо х числовий аргумент, та (add1 x) – збільшує на одиницю числовий аргумент х?

  • Вузол дерева має наступний вигляд (ключ значення ліве-піддерево праве-піддерево). Є, також, наступна об'ява функції (defun left (x y)(if (null y) nil(if (eq x (car y)) (car (cdr y))(left x (car (cdr (cdr y))))))). Який результат обчислення наступного виразу – (left 'a '(c f (a q nil (f g nil nil)) (a z nil (m n nil nil))))?

  • Є наступна об'ява функції (defun func (x) (if (null x) nil (cons (car x) (func (cdr x))))).Який результат обчислення наступного виразу – (func '(z y x))?

К оглавлению

Лекция 8. Функциональные абстракции и процедурное программирование в Лиспе Представление функции в процессе вычислений Понятие замыкания

«Замыкания» являются внутренним представлением функции во время вычисления выражений Лиспа. Само по себе lambda-выражение не вычисляется. Оно может вычисляться только в контексте выражений аппликации – применения функции.

Пример

((lambda (x) (+ x 2)) 10) -> 12

Форма quote, применяемая к lambda-выражению не создает замыкания, просто формируется списочная структура, соответствующая lambda-выражению. Программист этого не ощущает, если lambda-выражение не содержит свободных переменных. Если же lambda-выражение содержит свободные переменные и надо зафиксировать их значения в момент создания внутреннего представления функции, то используется форма function.

Создание замыканий

Аргумент формы function блокируется для вычислений и обрабатывается формой специальным образом. Аргументом формы может быть символьное имя или lambda-выражение. Сокращенная запись формы - #’ (скобки снимаются). Т.о., следующие формы эквивалентны:

(function (lambda (x y) (plus x y 3)) Û #’ (lambda (x y) (plus x y 3))

В системных функциях свободные переменные не используются, поэтому для функции +, например, следующие формы имеют одинаковое значение:

(+ 2 3) Û (funcall ‘+ 2 3) Û (funcall (function +) 2 3) Û (funcall #’+ 2 3) Û

  • ((lambda (x y) (+ x y)) 2 3) Û (funcall (function (lambda (x y) (+ x y))) 2 3)

Замыкание, как и имя функции или lambda-выражение, можно использовать в качестве функционального аргумента и фактически передавать в любую точку программы как и обычные данные.

Замыкания можно сохранять также, как любой лисповский объект, присваивая его какой-нибудь переменной.

Пример

(setq y 10) -> 10

(setq s (function (lambda (x) (+ x y)))) -> (LEXICAL_CLOSURE…)

В данном случае переменной s присваивается значение замыкания, в котором переменная y свободна. Значение переменной y на момент вычисления замыкания сохраняется в замыкании и в дальнейшем даже если значение y изменяется в программе, это не влияет на замыкание.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]