На этом шаге мы введем понятие функций-распознавателей.
Функции-распознаватели - это функции, используемые для распознавания или идентификации обьектов данных muLISP. Ясно, что данные функции являются предикатами.
Предикат - это функция, которая возвращает в качестве результата логическое значение T или NIL.
Перечислим простейшие распознаватели интерпретатора muLISP81. Обратите внимание на то, что почти все имена имена предикатов оканчиваются на P (Predicate).
Проверка, является ли аргумент пустым списком. | |
Проверка, является ли аргумент атомом. | |
Проверка, является ли аргумент числовым атомом.. | |
Проверяет, является ли аргумент положительным. | |
Проверяет, является ли аргумент отрицательным. | |
Проверяет, является ли аргумент нулем. | |
Логическая функция отрицания. | |
Логическая функция умножения. | |
Логическая функция сложения. |
1. Функция NULL проверяет, является ли аргумент пустым списком.
Заметим, что если выражение X - логическое, то функция (NULL X) возвращает
логическое значение, противоположное значению X. Например, функция
(NULL (ATOM X))
возвращает значение T, если X не атом, и NIL во всех прочих случаях.
В начало таблицы
2. Функция ATOM. Синтаксис данной функции таков:
(ATOM S-выражение)
Предикат ATOM возвращает T, если аргументом является атом и NIL - в противном случае.
Например:
$ (ATOM 5) $ (ATOM (1 2 3))
T NIL
$ (ATOM NIL)
T
В начало таблицы
3. Функция NUMBERP. Предикат NUMBERP проверяет, является ли его аргумент
числовым атомом.
В начало таблицы
4. Функция PLUSP. Предикат PLUSP проверяет положительность аргумента.
В начало таблицы
5. Функция MINUSP. Предикат MINUSP проверяет отрицательность аргумента.
В начало таблицы
6. Функция ZEROP. Предикат ZEROP проверяет нулевое значение аргумента.
В этом же разделе мы отметим и логические функции, которые очень часто используются при построении сложных условных выражений. Функции AND, OR и NOT отличаются от других предикатов тем, что их аргументы, так же как и их значения, это - T или NIL.
Количество аргументов в данных функциях может быть произвольным.
В начало таблицы
7. Если OBJECT есть атом NIL, то функция (NOT OBJECT) возвращает Т, иначе - NIL.
Так как атом NIL является одновременно и пустым списком, и значением "ложь",
то функции NULL и NOT всегда возвращают одинаковые значения. Однако
для лучшей читабельности программ лучше использовать NULL при проверке пустого
списка, а NOT - при проверке значений на "ложь". Например:
$ (NOT NIL) $ (NOT 'FOO)
T NIL
$ (NOT '()) $ (NOT (EQ 'DOG 'CAT))
T T
Код функции очень прост:
(DEFUN NOT (OBJ)
(EQ OBJ NIL)
)
В начало таблицы
8. Функция (AND FORM1 FORM2 ... FORMN) оценивает каждое выражение FORM1, FORM2, ..., FORMN по очереди до тех пор, пока одна из них не будет оценена как NIL или пока все выражения не будут оценены. Если выражение оценивается как NIL, функция AND возвращает NIL. В противном случае возвращается значение выражения FORMN.
Этот процесс эквивалентен обращению к следующей функции:
(IF FORM1 (IF FORM2 (IF ... (IF FORMN-1 FORMN))))
Например:
$ (AND (EQ 'DOG 'CAT) (< 2 3))
NIL
$ (AND (EQ 'DOG 'DOG) (< 2 3))
T
$ (AND (ATOM 'DOG) (MEMBER 'DOG '(CAT DOG COW)))
(DOG COW)
Отметим, что каждое последующее выражение оценивается тогда и только тогда, когда все предшествующие выражения не оказались равными NIL.
Заметим, что вызов (AND) возвращает Т.
В начало таблицы
9. Функция (OR FORM1 FORM2 ... FORMN) оценивает каждое выражение по очереди до тех пор, пока одно из них не получит оценку не NIL или пока все выражения не будут оценены. Если выражение получило оценку не NIL, функция OR возвращает это отличное от NIL значение выражения; иначе возвращается NIL.
Этот процесс эквивалентен следующей функции:
(COND (FORM1) (FORM2) ... (FORMN))
Например:
$ (OR (EQ 'DOG 'CAT) (< 2 3))
T
$ (OR (EQ 'DOG 'CAT) (< 3 2))
NIL
$ (OR (EQ 'DOG 'DOG) (< 2 3))
T
Вызов (OR) возвращает NIL.
Отметим, что каждое последующее выражение оценивается тогда и только тогда,
когда все предшествующие ему выражения были оценены как NIL.
В начало таблицы
В версии muLISP85 существуют еще несколько функций-распознавателей: SYMBOLP, INTEGERP, CONSP, LISTP, ODDP. Расскажем о них.
Проверка, является ли аргумент атомом. | |
Проверка, является ли аргумент целым числом. | |
Проверка, является ли аргумент числом. | |
Проверяет, можно ли аргумент построить из точечных пар. | |
Проверяет, является ли аргумент списком или атомом. | |
Проверяет, является ли аргумент нечетным целым числом. |
1. Если OBJECT есть атом, то функция (SYMBOLP OBJECT)
возвращает Т, в противном случае - NIL. Например:
$ (SYMBOL 'DOG) $ (SYMBOL 4.25)
T NIL
$ (SYMBOL 100) $ (SYMBOL '(A B C))
NIL NIL
$ (SYMBOL 2/3)
NIL
В начало таблицы
2. Если OBJECT - целое число, функция (INTEGERP OBJECT)
возвращает Т, иначе - NIL. Например:
$ (INTEGERP 'DOG) $ (INTEGERP 4.23)
NIL NIL
$ (INTEGERP 1000) $ (INTEGERP '(A D C))
T NIL
$ (INTEGERP 2/3)
NIL
В начало таблицы
3. Если OBJECT есть число (целое или дробное), то функция
(NUMBERP OBJECT) возвращает Т, иначе - NIL. Например:
$ (NUMBER 'DOG) $ (NUMBER 4.235)
NIL T
$ (NUMBER 100) $ (NUMBER '(A B C))
T NIL
$ (NUMBER 2/3)
T
В начало таблицы
4. Если OBJECT можно построить из точечных пар, то функция (CONSP OBJECT)
возвращает Т, иначе - NIL. Например:
$ (CONSP 'DOG) $ (CONSP 4.253)
NIL NIL
$ (CONSP 100) $ (CONSP '(A B C))
NIL T
$ (CONSP 2/3) $ (CONSP NIL)
NIL NIL
В начало таблицы
5. Если OBJECT является списком или атомом NIL, то функция
(LISTP OBJECT) возвращает Т, иначе - NIL. Например:
$ (LISTP 'DOG) $ (LISTP 4.253)
NIL NIL
$ (LISTP 100) $ (LISTP '(A B C))
NIL T
$ (LISTP 2/3) $ (LISTP NIL)
NIL T
В начало таблицы
6. Если OBJECT есть нечетное целое число, то функция
(ODDP OBJECT) возвращает Т, иначе - NIL. Например:
$ (ODDP 12) $ (ODDP 3.1315)
NIL NIL
$ (ODDP 0) $ (ODDP -7/3)
NIL NIL
$ (ODDP -41) $ (ODDP 'DOG)
T NIL
В начало таблицы
На следующем шаге мы введем понятие компараторов.