Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
FLP-Questions.doc
Скачиваний:
2
Добавлен:
21.09.2019
Размер:
110.08 Кб
Скачать

3Локальные определения (форма let).

Локальные определения относятся к управляющим структурам Лиспа и обеспечивают :

1). Сокращение количества рекурсивных вызовов функций;

2). Делают программу более удобочитаемой.

Существует две конструкции локальных определений в Лиспе : LET и LAMBDA.

Функция LET создает локальную связь и является синтаксическим видоизменением LAMBDA-вызова, в котором формальные и фактические параметры помещены совместно в начале формы : (let ((формальный параметр 1 фактический параметр 1) . . . (формальный параметр 1 фактический параметр 1)) <тело функции> )

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

Аргумент, значением которого является функция, называют в функциональном программировании функциональным аргументом, а функцию, имеющую функциональный аргумент - функционалом.

Аргументом функции может быть функция, однако, функция может быть и результатом. Такие функции называют функциями с функциональным значением. Представленные ранее функционалы и функции с функциональным значением (типы 4 и 5) в отличие от обыкновенных функций (1, 2, 3), получающих в качестве аргументов и возвращающих в качестве значения данные или выражения, значением которых являются данные, называются функциями более высокого порядка. Обыкновенные функции независимо от того, рекурсивные они или нет, являются функциями первого порядка.

1. Обыкновенный вызов:(defun f ...(… g…)…)

2. Рекурсивный вызов:(defun f ...(… g…)…)

3. Вложенный рекурсивный вызов: (defun f ...(f…(f…)…)…)

4. Функциональный аргумент: (defun f (... g ...)…(apply g …)…)

5. Рекурсивный функциональный аргумент: (defunf(...f...)... (apply f... f ...)...)

5Автоматическое управление памятью в Лиспе. «Сборка мусора».

Для повторного использования ставшей мусором памяти в LISP-системах предусмотрен специальный сборщик мусора, который автоматически запускается, когда в памяти остается мало свободного места. Сборщик мусора перебирает все ячейки и собирает являющиеся мусором ячейки в список свободной памяти для того, чтобы их можно было использовать заново.

11Какую (двоякую) роль играет в Лиспе функция eval?

Функция EVAL, относящаяся к классу SUBR, вычисляет значение своего единственного аргумента и возвращает его в качестве результата. Ядро Лиспа, в сущности, работает следующим образом:

1. Ожидает ввода S-выражения;

2. Передает введенное S-выражение функции EVAL;

3. Выводит полученный результат;

4. Переходит к п.1

Функцию EVAL можно употреблять, например, при необходимости вычислить значение S-выражения, построенного динамически (в процессе вычислений). Другое применение функции EVAL состоит в вычислении (при необходимости) значений аргументов функции класса FEXPR в теле самой функции.

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

12Возвращение функцией нескольких величин.

Встроенная функция truncate возвращает два значения, например, округленное целое и то, что было отрезано с целью его создания. Типичная реализация напечатает оба, когда truncate вызывается из верхнего уровня: > (truncate 26.21875) 26 0.21875

Вызывающий код может получить оба возвращаемых значения при помощи multiple-value-bind. Этот оператор принимает список переменных, вызов, а также программный код. Код выполняется с привязкой переменных к соответствующим возвращаемым вызовом значениям:

> (multiple-value-bind (int frac) (truncate 26.21875)

(list int frac)) (26 0.21875)

Наконец, чтобы возвращать несколько значений, мы используем оператор values.

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