Шаг 6.
Простейшие распознаватели

    На этом шаге мы введем понятие функций-распознавателей.

    Функции-распознаватели - это функции, используемые для распознавания или идентификации обьектов данных muLISP. Ясно, что данные функции являются предикатами.

    Предикат - это функция, которая возвращает в качестве результата логическое значение T или NIL.

    Перечислим простейшие распознаватели интерпретатора muLISP81. Обратите внимание на то, что почти все имена имена предикатов оканчиваются на P (Predicate).

Таблица 1. Простейшие распознаватели muLISP81
Функция
Назначение
NULL
Проверка, является ли аргумент пустым списком.
ATOM
Проверка, является ли аргумент атомом.
NUMBERP
Проверка, является ли аргумент числовым атомом..
PLUSP
Проверяет, является ли аргумент положительным.
MINUSP
Проверяет, является ли аргумент отрицательным.
ZEROP
Проверяет, является ли аргумент нулем.
NOT
Логическая функция отрицания.
AND
Логическая функция умножения.
OR
Логическая функция сложения.

    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. Расскажем о них.

Таблица 2. Простейшие распознаватели muLISP85
Функция
Назначение
SYMBOLP
Проверка, является ли аргумент атомом.
INTEGERP
Проверка, является ли аргумент целым числом.
NUMBERP
Проверка, является ли аргумент числом.
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
В начало таблицы

    На следующем шаге мы введем понятие компараторов.




Предыдущий шаг Содержание Следующий шаг