Функционалы. Методы обработки S-выражений. Методы обработки списков Лекция № 12 Применяющие функционалы. Функция Funcall FUNCALL принимает произвольное количество аргументов, применяет свой первый (функциональный) аргумент к оставшемуся списку аргументов. (funcall '* 1 2 3 4 5 6 7 8 9 10) ==> 3628800 С помощью FUNCALL можно давать именам функций синонимы и «переопределять» стандартные функции. (setq сложить '+) ==> + (funcall сложить 1 2 3) ==> 6 Функция Funcall (funcall '* 1 2 3 4 5 6 7 8 9 10) 3628800 (setq сложить '+) (funcall сложить 1 2 3) + 6 (setq cons '*) (cons 2 3) (funcall cons 2 3) (funcall 'cons 2 3) * 2.3 6 2.3 (setq сложить '+) (funcall сложить 2 3 4) (funcall 'сложить 2 3 4) + 9 9 – для HomeLisp или ошибка для других версий Применяющие функционалы. Функция Apply APPLY похожа на функцию FUNCALL, но имеет ровно два аргумента: первый - функциональный, а второй является списком произвольной длины. Вызов APPLY заключается в том, что вычисляется функция, заданная первым аргументом, со списком параметров, заданным вторым аргументом APPLY. (setq mult '*) mult (apply mult '(1 2 3 4 5 6 7 8 9 10)) * * 3628800 Отображающие функционалы. Функции MAPCAR и MAPLIST Отображающие функционалы применяют функциональный аргумент к элементам списка, в результате чего строится новый список. Отсюда и название: исходный список отображается на результирующий. MAPLIST принимает два аргумента: - значение первого аргумента должно быть списком; - второй аргумент - функциональный. Функция, задаваемая вторым аргументом, должна принимать на вход список. Результат: функция, заданная вторым аргументом, последовательно применяется к значению первого аргумента, к этому списку без первого элемента, без первых двух элементов и т.д. до исчерпания списка. Результаты вызова функции объединяются в список, который функционал вернет в качестве значения. Отображающие функционалы. Функции MAPCAR и MAPLIST MAPCAR применяет функциональный аргумент не к остаткам списка, а последовательно к каждому элементу. Результаты этих применений объединяются в список, который и возвращает функционал MAPCAR. (maplist '(1 2 3 4 5 6) (function sumlist)) (21 20 18 15 11 6) (maplist '(1 2 3 4 5 6) (function reverse)) ((6 5 4 3 2 1) (6 5 4 3 2) (6 5 4 3) (6 5 4) (6 5) (6)) (mapcar '(1 2 3 4 5 6) (function (lambda (x) (* x x)))) (1 4 9 16 25 36) Методы обработки S-выражений. Функция AMONG (DEFUN among (x y) (COND ((ATOM y) (EQ x y)) ((among x (CAR y)) (QUOTE T)) ((QUOTE T) (among x (CDR y) )) ) ) Проверка, входит ли заданный атом в данное Sвыражение (among 'A '(C (A B))) T (among 'A '(C D B)) Nil Методы обработки S-выражений. Функция EQUAL (DEFUN equal (x y) Предикат, проверяющий (COND равенство двух S-выражений ((ATOM x) (COND ((ATOM y) (EQ x y)) ((QUOTE T) (QUOTE NIL)) ) ) ((equal (CAR x)(CAR y)) (equal (CDR x)(CDR y)) ) ((QUOTE T) (QUOTE NIL) ) ) ) (equal '(A (B)) '(A (B))) T (equal '(A B) '(A . B)) Nil Методы обработки S-выражений. Функция SUBST (DEFUN subst (x y z) (COND ((equal y z) x) ((ATOM z) z) ((QUOTE T)(CONS (subst x y (CAR z)) (subst x y (CDR z)) ) ) ) ) Функция трех аргументов x, y, z, строящая результат замены S-выражением x всех вхождений y в S-выражение z (subst '(x . A) 'B '((A . B) . C)) ((A x . A) . C) (subst 'x '(B C D) '((A B C D)(E B C D)(F B C D))) ((A . x) (E . x) (F . x)) Методы обработки S-выражений. Функция NULL (DEFUN null (x) Предикат, отличающий пустой список от остальных S-выражений (COND ((EQ x (QUOTE NIL)) (QUOTE T)) ((QUOTE T) (QUOTE NIL)) ) ) Методы обработки S-выражений. Функция PAIR_TO_LIST (DEFUN pair_to_list (x) (CONS (CAR x) (CONS (CDR x) NIL)) ) (pair_to_list '(A B)) Размещение компонентов точечной пары в двухэлементном списке (A B) Методы обработки S-выражений. Функция LIST_TO_PAIR (DEFUN list_to_pair (x) (CONS (CAR x) (CADR x)) ) (list_to_pair '(A B C)) Построение из первых двух элементов списка точечной пары (A . B) Методы обработки списков. Функция APPEND (DEFUN append (x y) (COND ((null x) y) ((QUOTE T) (CONS (CAR x) (append (CDR x) y) ) ) ) ) (append '(A B) '(C D E)) Функция двух аргументов x и y, сцепляющая два списка в один (A B C D E) Методы обработки списков. Функция MEMBER (DEFUN member (x y) (COND ((null y) (QUOTE NIL) ) ((equal x (CAR y)) (QUOTE T) ) ((QUOTE T) (member x (CDR y)) ) ) ) Функция двух аргументов x и y, выясняющая, встречается ли S-выражение x среди элементов списка y (member '(a) '(b (a) d)) T (member 'a '(b (a) d)) Nil Методы обработки списков. Функция PAIRLIS (DEFUN pairlis (x y al) Функция аргументов x, y, al строит список пар (COND соответствующих элементов из списков x и y и ((null x) al) присоединяет их к списку al ((QUOTE T) (CONS (CONS (CAR x) (CAR y) ) (pairlis (CDR x) (CDR y) al) ) ) ) ) (pairlis '(A B C) '(u t v) '((D . y)(E . y)) ) ((C . v)(B . t)( A . u) (D . y)(E . y)) Методы обработки списков. Функция ASSOC (DEFUN assoc (x al) (COND ((equal x (CAAR al)) (CAR al) ) ((QUOTE T) (assoc x (CDR al)) ) ) ) (assoc 'B '((A . (m n)) (B . (CAR x)) (C . w) (B . (QUOTE T)) ) ) Функция поиска определения или значения по таблице, реализованной в форме ассоциативного списка (B . (CAR x)) Методы обработки списков. Функция INSERT (DEFUN insert (al x z) Вставка z перед вхождением ключа x (COND в список al ((null al) NIL) ((equal (CAR al) x) (CONS z al) ) ((QUOTE T) (CONS (CAR al) (insert (CDR al) x z) )) ) ) (insert '(a b c) 'b 's) (a s b c) Методы обработки списков. Функция ASSIGN Модель присваивания (DEFUN assign (x v al) переменным, хранящим (COND значения в ассоциативном списке ((Null al) (CONS(CONS x v) NIL ) ) ((equal x (CAAR al)) (CONS(CONS x v) (CDR al)) ) ((QUOTE T) (CONS (CAR al) (assign x v (CDR al)) )) ) ) (assign 'a 111 '((a . 1)(b . 2)(a . 3))) ((a . 111)(b . 2)(a . 3)) (assign 'a 111 '((c . 1)(b . 2)(a . 3))) ((c . 1)(b . 2)(a . 111)) (assign 'a 111 '((c . 1)(d . 3))) ((c . 1)(d . 3) (a . 111)) Методы обработки списков. Функция REVERSE (DEFUN reverse (m) (COND ((null m) NIL) (T (append (reverse (CDR m)) (list(CAR m)) ) ) ) ) (reverse ‘(a b c)) Обращение списка (c b a)