Функционалы. Методы обработки S-выражений. Методы обработки списков Лекция 12
Применяющие функционалы. Функция Funcall FUNCALL принимает произвольное количество аргументов, применяет свой первый (функциональный) аргумент к оставшемуся списку аргументов. (funcall '* ) ==> С помощью FUNCALL можно давать именам функций синонимы и «переопределять» стандартные функции. (setq сложить '+) ==> + (funcall сложить 1 2 3) ==> 6
Функция Funcall (funcall '* ) (setq сложить '+) (funcall сложить 1 2 3) +6+6 (setq cons '*) (cons 2 3) (funcall cons 2 3) (funcall 'cons 2 3) * (setq сложить '+) (funcall сложить 2 3 4) (funcall 'сложить 2 3 4) – для HomeLisp или ошибка для других версий
Применяющие функционалы. Функция Apply APPLY похожа на функцию FUNCALL, но имеет ровно два аргумента: первый - функциональный, а второй является списком произвольной длины. Вызов APPLY заключается в том, что вычисляется функция, заданная первым аргументом, со списком параметров, заданным вторым аргументом APPLY. (setq mult '*) mult (apply mult '( )) *
Отображающие функционалы. Функции MAPCAR и MAPLIST Отображающие функционалы применяют функциональный аргумент к элементам списка, в результате чего строится новый список. Отсюда и название: исходный список отображается на результирующий. MAPLIST принимает два аргумента: -значение первого аргумента должно быть списком; -второй аргумент - функциональный. Функция, задаваемая вторым аргументом, должна принимать на вход список. Результат: функция, заданная вторым аргументом, последовательно применяется к значению первого аргумента, к этому списку без первого элемента, без первых двух элементов и т.д. до исчерпания списка. Результаты вызова функции объединяются в список, который функционал вернет в качестве значения.
Отображающие функционалы. Функции MAPCAR и MAPLIST MAPCAR применяет функциональный аргумент не к остаткам списка, а последовательно к каждому элементу. Результаты этих применений объединяются в список, который и возвращает функционал MAPCAR. (maplist '( ) (function sumlist))( ) (maplist '( ) (function reverse)) (( ) ( ) ( ) (6 5 4) (6 5) (6)) (mapcar '( ) (function (lambda (x) (* x x))))( )
Методы обработки S-выражений. Функция AMONG (DEFUN among (x y) (COND ((ATOM y) (EQ x y)) ((among x (CAR y)) (QUOTE T)) ((QUOTE T) (among x (CDR y) )) ) (among 'A '(C (A B)))T (among 'A '(C D B))Nil Проверка, входит ли заданный атом в данное S- выражение
Методы обработки S-выражений. Функция EQUAL (DEFUN equal (x y) (COND ((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-выражений
Методы обработки 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)) ) (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)) Функция трех аргументов x, y, z, строящая результат замены S-выражением x всех вхождений y в S-выражение z
Методы обработки S-выражений. Функция NULL (DEFUN null (x) (COND ((EQ x (QUOTE NIL)) (QUOTE T)) ((QUOTE T) (QUOTE NIL)) ) Предикат, отличающий пустой список от остальных S-выражений
Методы обработки 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 (CАR x) y) ) Функция двух аргументов x и y, сцепляющая два списка в один (append '(A B) '(C D E))(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) (COND ((null x) al) ((QUOTE T) (CONS (CONS (CAR x) (CAR a1) ) (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)) Функция аргументов x, y, al строит список пар соответствующих элементов из списков x и y и присоединяет их к списку al
Методы обработки списков. Функция ASSOC (DEFUN assoc (x al) (COND ((eq 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) (COND ((null al) NIL) ((equal (CAR al) x) (CONS z al) ) ((QUOTE T) (CONS (CAR al) (append (CDR al) x z) )) ) Вставка z перед вхождением ключа x в список al (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)