
- •История развития фп.
- •Введение в лисп.
- •Элементарные понятия лисп.
- •Функции. Базовые функции.
- •Использование символов в качестве переменных.
- •Базовые функции.
- •Лекция № 2.
- •Арифметические функции
- •Определение функций.
- •Передача параметров глобальной и локальной переменной.
- •Дополнительные функции обработки списков.
- •Логические функции.
- •Управляющие структуры. Лекция №3.
- •Вводы выводы информации
- •Операторы вычисления локальных переменных и циклических предложений.
- •Дополнительные функции печати.
- •Циклические предложения
- •Лекция №4 (05.03.2013)
- •Рекурсия
- •Функции-функционалы
- •Лямбда-выражения
- •Свойства символов
- •Лекция №5 от 12.03.2013 Внутреннее представление списков и применяющие функционалы
- •Списочные ячейки и базовые функции
- •Сборка мусора
- •Обработка списков без разрушения
- •Разрушающие функции
- •Применяющие функционалы
- •Лекция № 19.03.2013 Массивы и Макросы
- •Макросы
- •Шаги при разработке макроса:
- •Пример программы на Lisp. Дифференцированное выражение.
- •Входные и выходные потоки
Лекция №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)