
- •2. Описание лабораторных работ по функциональному программированию на языке лисп
- •2.1. Краткие теоретические сведения по программированию на языке Лисп
- •Основные функции обработки списков
- •Присваивание значений
- •Предикаты
- •Определение функций
- •Ввод-вывод
- •2.2. Лабораторная работа по теме «Знакомство с основными понятиями в системе программирования Лисп»
- •2.3. Лабораторная работа по теме «Решение задач с ветвлением в системе программирования Лисп»
- •2.4. Лабораторная работа по теме «Реализация рекурсии на языке Лисп»
- •2.5. Лабораторная работа по теме «Обработка списков на языке программирования Лисп»
Присваивание значений
Переменные в языке Лисп обозначаются с помощью символов. Переменные ─ это объекты программы, которые меняют свои значения в ходе её выполнения. Когда символ интерпретируется как форма, представленная переменной, то возвращается его значение. Интерпретация символа как переменной это только одна из возможностей. Для того, чтобы присвоить символу значение, применяется функция SET. Эта функция присваивает символу некоторое значение и возвращает его в качестве результата. Функция SET имеет два аргумента. Первый аргумент представляется формой, задающей символ, а второй ─ формой, определяющей значение символа, к примеру:
(set 'х '(a b с)) ─ > (А В С)
(set (car x) '(d e)) ─ > (D E)
Здесь символу X присваивается значение (А В С), а символу А значение ─ (D Е). Символу можно также присвоить значение с помощью вызова специальной формы SETQ или макроса SETF. Формат вызова специальной формы SETQ:
(setq {символ форма }*)
В отличие от функции SET, форма SETQ блокирует вычисление значений символов. К примеру,
(setq x'(a b с)) ─> (А В С)
(setq у 12 z (+ у 10)) ─ > 25
Присваивание значений символам в форме SETQ выполняется последовательно слева направо, т.е. в момент присваивания значения символу Z, символ Y уже получил значение 12. Результатом вызова SETQ является последнее присвоенное значение или NIL, если аргументы формы SETQ не были заданы.
Предикаты
Для обработки данных необходимы различные функции, позволяющие выяснять те или иные свойства данных. Функции, выполняющие такую проверку, возвращают логические значения и называются предикатами. В Лиспе имеется большой набор предикатов. Рассмотрим основные встроенные предикаты Лисп ─ систем.
Функция EQ сравнивает значения двух своих аргументов. При этом сравнение выполняется не на логическом уровне, а на физическом, т.е. выясняется, представлены ли аргументы в памяти ЭВМ одной и той же физической структурой данных. Функция EQ возвращает значение Т, если ее аргументы ─ символы, и в памяти ЭВМ они представлены одной и той же структурой. Функция EQ требует, чтобы ее аргументы были символами. К примеру:
(eq 5.0 5.0) ─ > NIL
В Лиспе имеется функция EQL, которая аналогична EQ, но дополнительно позволяет сравнивать числовые значения одинаковых типов. Сравнение чисел разных типов выполняется с помощью предиката "=". К примеру:
(eql 5.0 5.0) ─ > Т
(= 5 5.0 0.5е1) ─ > Т
Сравнение объектов Лисп ─ программы на уровне абстрактных структур выполняется с помощью предиката EQUAL. Данный предикат обобщает предикат EQL и может сравнивать символы, однотипные числа, строки, списки:
(equal 'а 'а) ─ > Т
(equal '(a b с) '(a b с)) ─ > Т
(equal 5.0 5) ─ >NIL
Наиболее общее логическое равенство лисповских объектов устанавливается с помощью предиката EQUALP. Дополнительно к возможностям EQUAL данный предикат устанавливает логическое равенство разнотипных чисел.
Предикат NULL позволяет установить, представляет ли его аргумент пустой список:
(null (cdr '( а))) ─ > Т
(null T) ─ > NIL
В Лиспе имеется большой выбор предикатов, классифицирующих типы значений: ATOM, NUMBER, INTEGERP, FLOATP, RATIONALP, SYMBOLP, LISTP и др. Предикат АТОМ проверяет, представляет ли его аргумент атом:
(atom 'a) ─ > Т
(atom nil) ─ > Т
Предикат NUMBERP устанавливает, является ли его аргумент числом:
(number 5.0) ─ > Т
(number 'а) ─ > NIL
Предикаты INTEGERP, FLOATP, RATIONALP позволяют выяснить, относится ли значение аргумента к целым, вещественным или рациональным числам, соответственно. Предикаты SYMBOLP, CONSP, LISTP позволяют из множества различных значений выделять символы, точечные пары и списки:
(setq х '(a b с)) ─ > (А В С)
(symbolp х) ─ > NIL
(consp х) ─ >Т
(listp х) ─ >Т
(consp '( )) ─ >NIL
(listp '())─ > Т
Для проверки свойств числовых значений в Лиспе используются предикаты: ZEROP (равенство нулю), ODDP (нечетность), EVENP (четность), MINUSP (отрицательность).
Рассмотренные предикаты применяются при построении тест-форм условных выражений.