Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Язык программирования Лисп Мурашко ИА, Марина ИМ, БГУИР 2002 (Мет пособие).doc
Скачиваний:
55
Добавлен:
15.06.2014
Размер:
289.28 Кб
Скачать

2.3 Функции компаратора.

1) Функция EQ [object1, object2] проверяет на идентичность 2 своих аргумента (т.е. они указывают на одинаковые объекты данных в памяти). Так как символы и малые целые числа (т.е. целые числа, меньше 65536 по абсолютной величине) определяются уникально, EQ является хорошим способом определения, являются ли 2 символа или 2 малых целых числа равными друг другу. Функция NEQ [object1, object2] эквивалентна функции (NOT (EQ обьект1 обьект2)).

(EQ 'Alice 'Alice) --> T

(SETQ F1 '(A B C)) --> (A B C)

(EQ F1 '(A B C)) --> NIL

(SETQ F2 F1) --> (A B C)

(EQ F1 F2) --> T

(EQ 7 (+ 3 4)) --> T

(EQ 100000 100000)--> NIL

2) Функция EQL [object1, object2]. Если <обьект1> идентичен <обьекту2> или если оба аргумента являются числами с одинаковыми значениями, то (EQL обьект1 обьект2) возвращает Т, иначе - NIL. Функция NEQL [обьект1 обьект2] эквивалентна функции (NOT (EQL обьект1 обьект2)). Т.к. большие целые числа (т.е. целые числа, больше 65536 по абсолютной величине) и дробные числа не определяются уникально, EQL по сравнению с EQ может быть гораздо эффективнее при определении эквивалентности 2-х чисел. Аргументы - не атомы являются эквивалентными тогда и только тогда, когда они указывают на одинаковые ячейки в памяти.

(EQL 'Alice 'Alice) --> T

(EQL 7 (+ 3 4)) --> T

(EQL 100000 100000) --> T

(EQL '(A B) '(A B)) --> NIL

3) Функция: EQUAL [object1, object2]. Если <обьект1> эквивалентен <обьекту2>, функция возвращает Т, иначе - NIL. EQUAL проверяет на эквивалентность 2 своих аргумента. Если один или оба аргумента являются атомами, EQUAL работает аналогично функции EQL. Два аргумента-атома находятся в отношении EQUAL, если они являются изоморфными структурами данных: и car-ветви, и cdr-ветви есть EQUAL. Две EQUAL-структуры данных при печати изображаются одинаково. Т.к. EQL работает быстрее, эту функцию лучше использовать вместо EQUAL там, где известно, что по крайней мере один из аргументов является атомом.

(EQUAL 'A 'A) --> T

(EQUAL '(A B C) '(A B C))--> T

(EQUAL '(A B C) '(C B A))--> NIL

4) Функция MEMBER [object, list, test] выполняет линейный поиск в <списке> элемента, для которого признак сравнения с <объектом> по <тесту> не равен NIL. Если <тест>- не задан или NIL, MEMBER использует EQL-тест.

(MEMBER 'A '(B C D)) --> NIL

(MEMBER 'A '(B A D)) --> (A D)

(MEMBER-IF 'NUMBERP '(A B 3 C (-7))) --> (3 C (-7))

(MEMBER-IF 'MINUSP '(A B 3 C (-7))) --> NIL

5) Функция: =[n1,n2,...,nM]. Если n1 равен n2, а n2 равен n3,...,nM-1 равен nM, то (= n1 n2...nM) возвращает Т, иначе - NIL. Функция вызывает прерывание "Нечисловой аргумент", если какой-либо аргумент не является числом.

(= 5 9) --> NIL

(= 4 4 -7) --> NIL

(= 3 3.0) --> T

(= 0.75 6/8) --> T

6) Функция /= [n1,n2,...,nM] Если n1 не равно n2, n2 не равно n3,...,nM-1 не равно nM, то функция возвращает Т, иначе - NIL. Если какой-либо аргумент не является числом, возникает прерывание по ошибке "Нечисловой аргумент". Отметим, что если /= возвращает Т, это значит, что нет ни одной пары смежных равных аргументов. Однако это может быть и в том случае, когда два аргумента равны, но не являются смежными.

(/= 5 9) --> T

(/= 4 4 -7) --> NIL

(/= 3 3.0) --> NIL

(/= 0.75 6/8) --> NIL

(/= 6 -2 6) --> T

7) Функция < [n1,n2,...,nM]. Если n1<n2, n2<n3,..., nM-1<nM, то функция возвращает Т, иначе - NIL. если какой-либо аргумент не является числом, то возникает прерывание по ошибке "Нечисловой аргумент". Утверждение < удобно использовать в том случае, когда нужно определить, лежит ли число внутри данного интервала; при этом < вызывается с 3-мя аргументами: числом и границами интервала. Например, чтобы определить, является ли значение CHAR числом, заглавной или прописной буквой: (< 47 (ASCII CHAR) 58); (<64(ASCII CHAR) 91); (< 96 (ASCII CHAR) 123).

(< 5 9) --> T

(< 4 -7) --> NIL

(< 3 3.0) --> NIL

(< 3/5 2/3) --> T

8) Функция >[n1,n2,...,nM]. Если n1>n2, n2>n3, ..., nM-1>nM, то функция возвращает Т, иначе - NIL. Если какой-либо аргумент не является числом, то возникает прерывание по ошибке "Нечисловой аргумент".

(> 5 9) --> NIL

(> 4 -7) --> T

(> 3 3.0) --> NIL

(> 3/5 2/3) --> NIL

9) Функция <= [n1,n2,...,nM]. Если n1<=n2, n2<=n3, ..., nM-1<=nM, то функция возвращает Т, иначе - NIL. Если какой-либо аргумент не является числом, то возникает прерывание по ошибке "Нечисловой аргумент".

(<= 5 9) --> T

(<= 4 -7) --> NIL

(<= 3 3.0) --> T

(<= 3/5 2/3) --> T

10) Функция >= [n1,n2,...,nM]. Если n1>=n2, n2>=n3, ..., nM-1>=nM, то функция возвращает Т, иначе - NIL. Если какой-либо аргумент не является числом, то возникает прерывание по ошибке "Нечисловой аргумент".

(>= 5 9) --> NIL

(>= 4 -7) --> T

(>= 3 3.0) --> T

(>= 3/5 2/3) --> NIL