Функциональное программирование




Внутреннее представление списков. Применяющие функционалы - часть 4


(rplaca x y) (setf (car x) y)

(rplacd x y) (setf (cdr x) y)

Можно использовать для замены элементов.

Например, рассмотрим функцию, replace-item, которая имеет три элемента: первый элемент должен быть списком. Функция разрушающе замещает первое местоположение второго аргумента в списке на третий аргумент.

(defun replace-iteme (lis old new)

(rplaca (member old lis) new).


8.3.3 Использование разрушающих функций.

Разрушающие функции необходимо использовать при работе с большими списками, чтобы не увеличивать расход памяти, например использовать nconc вместо append.

Однако использование разрушающих функций приводит к побочным эффектам.

Можно получить бесконечные списки:

* (setq v1 '(a b c))

(a b c)

* (setq v2 v1)

(a b c)

* (setq v2 (nconc v1 v2))

(a b c a b c....)

Поэтому использование разрушающих функций требует осторожности.


8.4 Применяющие функционалы.

Одним из видов функционалов, используемых в лиспе являются применяющие функционалы. Они применяют функциональный аргумент к его параметрам.

Так как применяющие функционалы вычисляют значение функции, в этом смысле они аналогичны функции EVAL,

вычисляющей значение выражения.


8.4.1 APPLY.

Предположим мы хотим объединить в один список несколько вложенных списков, т.е. из

((a b c) (d e f) (k l)) получить (a b c d e f k l).

Для этой задачи используем функцию apply. APPLY имеет два аргумента: имя функции и список, и применяет названную функцию к элементам списка, как к аргументам функции.

Определим функцию, которая рассчитывает среднее списка чисел

(defun list-mean (lis)

(/ (apply '+ '(lis) (length lis)))

* (list-mean '(1 2 3 4))

2.5

Часто apply используют вместе c марсаr.

Мы хотим найти общее число элемент в списках

(countall '((a b c) (d e f) (k l)))

(defun countall (lis)

(apply '+ (mapcar 'length lis)))

Можно определить более сложную функцию countatom, которая считает элементы на в любом списке.

Например

* (countatom '(a (a (b) c) (d) e (f g)))




Содержание  Назад  Вперед