Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Вариант_№28.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
801.79 Кб
Скачать

Функции проверки типов и логические функции

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

Первый вопрос, который может придти в голову, атом это или список? Для выяснения этого обстоятельства служит функция ATOM:

Atom

Функция возвращает T, если её аргумент является атомом, и NIL в противном случае.

С помощью этой функции мы можем выяснить тип присвоенного символу значения (как использовать полученные логические значения будет объяснено в разделе 3). Для того же чтобы выяснить, есть ли у символа значение в принципе, мы можем использовать функцию

boundp

возвращает значение T, если её первый аргумент является символом, связанным с каким-либо значением, и NIL в противном случае. Функция возвращает T, если её аргумент является атомом, и NIL в противном случае. Если аргумент является списком, функция возвращает ошибку.

Приведём пример, поясняющий работу этих функций:

>(BOUNDP 'a)

NIL

>(SETQ a 'b)

B

>(BOUNDP 'a)

T

>(BOUNDP '1)

Error: `5' is not of the expected type `SYMBOL'

>(BOUNDP 'T)

T

>(BOUNDP '(a))

Error: `(A)' is not of the expected type `SYMBOL'

Константы считаются всегда связанными со значениями, поэтому (BOUNDP 'T) даёт истину. В то же время для чисел мы получаем ошибку, так как числа являются атомами, но не символами. Аналогично мы не можем выяснить, связаны ли со значениями списки, так как список не указывает ни на какую ячейку в памяти в принципе. Наконец, мы можем проверить, не связана ли какая-то ячейка со значением NULL

null

Функция возвращает T, если её аргумент равен NULL, и NIL в противном случае.

>(NULL T)

NIL

>(NULL NIL)

T

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

and

Логическое умножение. возвращает значение T, если все аргументы истинны

or

Логическое сложение, возвращает T, если хотя бы один аргумент истинен

>(AND T T T NIL)

NIL

>(AND T)

T

>(OR NIL NIL T)

T

>(OR NIL)

NIL

Ещё одна обычная проблема связана с проверкой равенства двух символов. Lisp предоставляет достаточно большой набор функций для анализа эквивалентности:

eq

Функция сравнивает два символа на предмет совпадения. С её помощью можно проверять только символы и константы T и NIL, а результат будет истиной только в том случае, если оба аргумента совпадают (для атомов просто проверяет совпадения адресов ячеек). Возникает проблема со сравнением вещественных чисел.

>(EQ 'A 'B)

NIL

>(EQ 'A 'A)

T

>(EQ 1 1)

T

>(EQ 1.0 1.0)

NIL

eql

Сравнивает числа одного типа. Умеет корректно сравнивать вещественные числа.

equal

Обобщение eql, позволяющее проверять совпадение двух списков. Считает объекты совпадающими, если совпадает их структура.

equalp

Обобщение всех функций сравнения, которое умеет корректно понимать равенство между числами с плавающей запятой и целыми.

> (EQ 'b 'b)

T

> (EQ 1 1)

T

> (EQ 1.0 1.0)

NIL

>(EQL 1.0 1.0)

T

>(EQL 1.0 1)

NIL

> (EQL '(a) '(a))

NIL

> (EQUAL '(a) '(b))

NIL

> (EQUAL '(a) '(a))

T

>(EQUAL 1.0 1)

NIL

>(EQUALP 1.0 1)

T

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