- •1Базовые функции обработки списков.
- •2Определение и вызов функций с помощью λ-выражений. Λ-список, λ-преобразование. Свободные и связанные переменные. Функция defun
- •3Локальные определения (форма let).
- •4Функции более высокого порядка. Функциональный аргумент, функциональное значение. Способы композиции функций.
- •5Автоматическое управление памятью в Лиспе. «Сборка мусора».
- •11Какую (двоякую) роль играет в Лиспе функция eval?
- •12Возвращение функцией нескольких величин.
- •13Базовые функции Лиспа.
- •14Опишите три варианта предиката равенства в Лиспе.
- •1Равенство в Прологе.
- •2Встроенные предикаты. Предикаты взаимодействия.
- •4Аппарат вычислений. Обработка списков.
- •5Аппарат вычислений. Рекурсивные определения в Прологе.
- •6Аппарат вычислений. Управление откатом: отсечение.
- •7Аппарат вычислений. Поиск в глубину с возвратом.
- •8Аппарат вычислений. Вывод и процедура отката.
- •9Аппарат вычислений. Процедура унификации в Прологе.
- •10Синтаксис данных (термы и основные объекты Пролога).
- •11Структура программы в языке Пролог (синтаксис языка).
- •12Логическая и управляющая компоненты Пролога.
- •14Общая характеристика языка Пролог.
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.