Основи мови програмування Лісп
((EQL obj (CAR lst)) (CDR lst))((EQL obj (CAR lst))
(CONS (CAR lst)(REMBER-ALL obj (CDR lst))
(REMBER obj (CDR lst))) ) (CONS (CAR lst)
(REMBER-ALL obj (CDR lst))))
Результат роботи цих функцій проілюструємо на прикладах:
$ (REMBER ‘a ‘(q a w e r t a y))$ (REMBER-ALL ‘a ‘(q a w e r t a y))
(q w e r t a y)(q w e r t y)
Примітивна функція EQL використовується для порівняння атомів. Часто виникає потреба порівнювати списки. Напишемо функцію EQLIST, яка порівнює списки. Її побудуємо на основі наступних фактів:
1. Якщо перший список порожній, то, якщо і другий список порожній, повернути Т, інакше повернути NIL (або просто повернути (NULL другого списку)).
2. Якщо другий список порожній, повернути NIL.
3. Якщо голова першого списку не дорівнює голові другого списку, повернути NIL.
4. Перевірити рівність хвостів першого та другого списків.
$ (DEFUN EQLIST (lst1 lst2)$ (DEFUN NOT (obj)
((NULL lst1) (NULL lst2))(EQL obj NIL) )
((NULL lst2) NIL)
((NOT (EQL (CAR lst1) (CAR lst2))) NIL)
(EQLIST (CDR lst1) (CDR lst2)) )
Функція NOT повертає NIL, якщо список не порожній і Т інакше.
Розглянемо задачу об’єднання списків. Роботу функції APPEND, аргументами якої є два списки lst1 та lst2, можна описати наступним чином:
1. Якщо lst1 порожній, повернути lst2.
2. З’єднати голову першого списку зі списком, який отримано в результаті об’єднання хвоста першого списку з другим списком.
$ (DEFUN APPEND (lst1 lst2)
((NULL lst1) lst2)
(CONS (CAR lst1) (APPEND (CDR lst1) lst2)) )