Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Функцилональное программирование лекции 4 семес...docx
Скачиваний:
1
Добавлен:
01.04.2025
Размер:
45.66 Кб
Скачать

Лекция №5 от 12.03.2013 Внутреннее представление списков и применяющие функционалы

Ячейка списка выглядит так:

CAR

CDR

A

B

(a.b)

Если список состоит из одного атома, то в виде списочной ячейки он может быть представлен следующим образом:

(a)=

nill

=

a

\



(b a)=

b



a

\



(a b c d)=(a. (b. (c. (d.nil))))

Списочные ячейки и базовые функции

Результатом CAR является значение первой ячейки списочного поля. Результатом CDR является следующее списочное поле.

(CONS ‘A ‘(b c))

(setq y ‘(a b c))

Сборка мусора

(setq l ‘((a) b c))

L

b

c

\

Сборщик мусора – GC. Собирает все неиспользуемые участки памяти, переформировывает память, готовит их к повторному использованию.

Обработка списков без разрушения

*(setq First ‘(a b))

(setq second ‘(c d))

(setq both (append First Second ))

Append создрает копии списочных аргументов для всех аргументов кроме последнего

Разрушающие функции

RPLACA – replace car (изменение первого начального элементта)

RPLACD – replace cdr (изменение хвоста)

RPLACA <список> <арг2>

RPLACD <Список> <арг2>

(setq v1 ‘(abc))

(setq v2 v1)

(setq v2 (nconc v1 v2))

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

Общая черта заключается в том, что свой общий функциональный элемент применяют к остальным параметрам. Первый из функционалов – APPLY . Первый аргумент – функциональный, остальные – организованы в список.

Указанная функция применяется к элементам списка.

(APPLY f (‘x1 x2… xN))  (f ‘x1…. ‘xN)

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

((a b c) (def) (k l))

(apply ‘append ‘^)

(defun list-mean (lis) (/(apply ‘+ ‘(lis) (length lis)) )

(defun confall (lis) (apply’ +mapcar ‘length lis)) )

(defun list-cast (lis) (apply ‘append (mapcar ‘last lis))) )

(defun list-cast(lis) (,apcan ‘last lis) )

(mapcan fn ‘nconc (mapcar fn ‘(x1 … xN)))

(funcall fn x1…xN)  (fn x1…xN) – то же самое что и блайн но у него не организован список аргументов.

Пример: map2 – аналог mapcar, но берет 2 элемента из списка

(defun map2 (lis) (if null lis) nil (cons (funcall f2 (car lis) (cadr lis)) (map2 f2 (cdde lis)) )

В результате работы функции получаем (a b c d e f) ((ab) (cd) (ef))

Лекция № 19.03.2013 Массивы и Макросы

Массивы в ЛИСП объявляются следующим образом:

(setq data (make_array 10)) – создается массив data из 10 элементов.

#(0….0)

Для доступа пользуются:

(aref <имя> <индекс>)

*(aref data 3) 0

Поместить элемент в массив можно следующим обоазом:

(setf (aref data 2) ‘dog) – во второй ячейке появится символ dog.

Есть два варианта рекурсии: численная и хвостовая.

(defun array_list (arnam len)

(do ((i 0 (+ 1 i))

(result nil (append result (list (aref arnam i))))

((equal I len) result)

)

)

(array-length <имя>) – Возвращает количество элементов массива.

*’(a b c) (a b c)

Если перед тем, как выполнить этот оператор у нас будет записано (setq b ‘(x y z)), то вызов теперь приведет к выводу (a (x y z) c)