Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
лаба_лисп.rtf
Скачиваний:
19
Добавлен:
21.07.2019
Размер:
3.69 Mб
Скачать

Присваивание значений

Переменные в языке Лисп обозначаются с помощью символов. Пе­ременные ─ это объекты программы, которые меняют свои значения в хо­де её выполнения. Когда символ интерпретируется как форма, представ­ленная переменной, то возвращается его значение. Интерпретация символа как переменной это только одна из возможностей. Для того, чтобы присвоить символу значение, применяется функция SET. Эта функция присваивает символу некоторое значение и возвра­щает его в качестве результата. Функция SET имеет два аргумента. Первый аргумент представляется формой, задающей символ, а второй ─ формой, определяющей значение символа, к примеру:

  1. (set 'х '(a b с)) ─ > (А В С)

  2. (set (car x) '(d e)) ─ > (D E)

Здесь символу X присваивается значение (А В С), а символу А значе­ние ─ (D Е). Символу можно также присвоить значение с помощью вызова спе­циальной формы SETQ или макроса SETF. Формат вызова специальной формы SETQ:

(setq {символ форма }*)

В отличие от функции SET, форма SETQ блокирует вычисление зна­чений символов. К примеру,

  1. (setq x'(a b с)) ─> (А В С)

  2. (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 (отрицательность).

Рассмотренные предикаты применяются при построении тест-форм условных выражений.