Функционалы. Основные методы обработки S

advertisement
Функционалы.
Методы обработки 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)
Download