Базовые функции Функциональное программирование Григорьева И.В.
2 EQ проверяет тождественность двух символов Предикат EQ сравнивает два символа и возвращает значение Т, если они идентичны, в противном случае -NIL. (eq i кот) -> ? (eq кот (car (кот пес)) -> ? (eq () nil) -> ? (eq t t) -> ? (eq t (atom мышь)) -> ?
3 С его помощью можно сравнивать только символы или константы Т и NIL, и результатом будет значение Т лишь в том случае, когда аргументы совпадают. Так как EQ определен лишь для символов, то, сравнивая два выражения, прежде всего надо определить, являются ли они атомами (АТОМ). Если хотя бы один из аргументов является списком, то предикат EQ нельзя использовать для логического сравнения. (eq (a b c) (a b c)) -> ? (eq ) -> ?
4 EQL и = сравнивает числа EQL позволяет сравнивать однотипные числа (и элементы строк). (eql 3 3) -> ? (eql ) -> ? (eql 3 3.0) -> ? Предикат = сравнивает числа различных типов. (= 3 3.0) -> ? (= e1) -> ?
5 Обеспечить применение предиката к числовым аргументам может предикат NUMBERP, который истинен для чисел: (numberp Зе-34) -> ? (numberp Зе-34) -> ? (numberp t) -> ? (numberp t) -> ?
6 EQUAL проверяет идентичность записей (equal x x) -> T (equal (x y z) (x y z)) -> T (equal (a b c) (cons a (b c)) -> T (equal (nil) ((nil))) -> ?
7 EQUALP проверяет наиболее общее логическое равенство Наиболее общим предикатом является EQUALP, с помощью которого можно сравнивать произвольные лисповские объекты, будь то числа различных типов, выражения или другие объекты. Этот предикат может потребоваться, когда нет уверенности в типе сравниваемых объектов или в корректности использования других предикатов сравнения. Недостатком универсальных предикатов и функций типа EQUALP является то, что их применение требует от системы несколько большего объема вычислений, чем использование специализированных предикатов и функций.
8 Другие примитивы NULL проверяет на пустой список (null ()) -> T (null (cddr (a b c)) -> ? Работает как логическое отрицание (null nil)-> T (null T) -> NIL (null x) (eq nil x)
9 Вложенные вызовы CAR и CDR можно записывать в сокращенном виде Комбинируя селекторы CAR и CDR, можно выделить произвольный элемент списка. Например: (cdr (cdr (саr ((а b с) (d e) (f))))) -> (С) Комбинации вызовов CAR и CDR образуют уходящие в глубину списка обращения, и в Лиспе используется для этого более короткая запись: желаемую комбинацию вызовов CAR и CDR можно записать в виде одного вызова функции: (C...R список)
10 Вместо многоточия записывается нужная комбинация из букв А (для функции CAR) и D (для функции CDR): (cadr x) (car (cdr x)) (cddar x) (cdr (cdr (car x))) Для функций CAR, CADR, CADDR, CADDDR и т.д. в Коммон Лиспе используются и более наглядные имена FIRST, SECOND, THIRD, FOURTH и т.д. Можно воспользоваться и наиболее общей функцией NTH, выделяющей n-й элемент списка: (NTH n список) (LAST x)
11 LIST создает список из элементов Другой часто используемой встроенной функцией является ( list х2 хЗ...) которая возвращает в качестве своего значения список из значений аргументов. Количество аргументов функции LIST произвольно: (list 1 2) -> (1 2) (list a b (+ 1 2)) -> (A B 3)
12 Какие из следующих вызовов возвращают значение Т? (atom '(cdr nil)) (atom '(cdr nil)) (equal '(a b) (cons '(a) '(b))) (equal '(a b) (cons '(a) '(b))) (atom (* 2 (+ 2 3))) (atom (* 2 (+ 2 3))) (null (null t)) (null (null t)) (eq nil (null nil)) (eq nil (null nil)) (eql 2.0 2) (eql 2.0 2) (equal 2.0 2) h) (= 2.0 2) (equal 2.0 2) h) (= 2.0 2) i) (equalp 2.0 2) i) (equalp 2.0 2) j) (equalp (atom nil) (caar 4(0))) j) (equalp (atom nil) (caar 4(0)))