- •1. Особенности программирования на функциональном языке. Основные элементы языка лисп. Определения атомов, s-выражений, списков.
- •2. Понятие функции. Префиксная форма записи функций и арифметических выражений. Функция quote.
- •3. Базовые функции: car, cdr, atom, eq, cons. Модификации функции eq.
- •4. Значения символов. Псевдофункции set и setq. Универсальная функция eval.
- •5. Внутреннее представление списков. Логическое и физическое равенство списков. Точечная пара.
- •7. Создание локальной связи с помощью формы let и let*. Эквивалентное представление формы через λ-вызов.
- •8. Разветвление вычислений через формы cond и if. Особенности вычисления логических функции not,and,or.
- •9. Ввод и вывод в лисПе. Функции read,print,prin1, princ, terpri, format.
- •10. Работа с файлами в лиспе.
- •15. Понятие функций высших порядков; функционалы и функции с функциональным значением.
- •16. Встроенные применяющие функционалы apply и funcall и их использование в определении интерпритаторов и функционалов пользователя.
- •17. Отображающие функционалы. Два вида map-функций. Mapcar и maplist.
- •18. Определение типа структура. Создание объектов структурного типа. Функции доступа к полям объекта типа структура.
- •19. Макропрограммирование в лиспе. Определение макроса. Последовательность выполнения макровызова. Обратная блокировка и определение новых синтаксических форм.
7. Создание локальной связи с помощью формы let и let*. Эквивалентное представление формы через λ-вызов.
(Let ((m1 a1) (m2 a2) … (mn an)) форма1 форма2 …)
Вычисляется форма следующим образом: переменные m1,m2,m3,…,mn, из первого аргумента формы связываются одновременно с соответсвующими значениями a1,a2,a3,…,an. Затем слева направо вычислятся значения форма1, форма2, …. В качестве значения все формы возвращается значение последней формы. После окончания вычислений связи переменных m1,m2,m3,…,mn ликвидируются.
(Let ((x 2) (y 3)) (+ (* 2 x) y))
((Lambda (x y) (+ (* 2 x) y)) 2 3)
8. Разветвление вычислений через формы cond и if. Особенности вычисления логических функции not,and,or.
Структура формы COND: (Cond (p1 a1) (p2 a2) … (pn an)), pi – предикаты произвольной формы, аi – результирующие выражения.
Выражения pi вычисляются последовательно слева направо, пока не будет получено значение истина. Затем вычисляется соответствующее выражение ai, и полученное значение возвращается в качестве результирующего выражения все формы COND. Если истинного предиката нет, то возвращается значение NIL.
Форма IF имеет вид (if p a1 a2), p – предикат, а1, а2 – вычисляемая форма.
Значением формы является a1, если p истина, и а2 если p ложь.
NOT
(not x)
Если х – nil, то t
Если не nil, то nil
OR
(or p1 p2 ….pn)
Если встречает аргумент не nil, то выдает его знаечение и заканчивает работу
Если все nil, то nil.
AND
(and p1 p2…. Pn)
Вычисляется слева направо, если встречает nil, то выдает nil. Если nil – нет, то выдает последний аргумент.
9. Ввод и вывод в лисПе. Функции read,print,prin1, princ, terpri, format.
READ чтение с клавиатуры
>(read)
(1 2 3)
(1 2 3)
PRINT – вычисляет значение аргумента, и выводит вычисленное значение
>(print (+ 1 2))
3
3
PRIN1 работает также как PRINT, но не переводит строку и не печатает пробел.
PRINC – может напечатать строку без ограничивающих ее двойных кавычек
TERPRI – переводит строку, не имеет аргументов, в качестве значения возвращает NIL.
(FORMAT поток образец аргумент)
Поток – файл, дисплей. T –вывод на дисплей.
Образец – ограничивается с обеих сторон кавычками, управляющая строка, которая может содержать текст. Опознается до знака “~” перед ними.
Аргумент – ставится в соответсвии с управляющим кодом.
10. Работа с файлами в лиспе.
Если определения функции хранятся в файле лежащим в папке с интерпритатором то их можно загрузить функцией (load имя-файла).
В ЛИСПЕ ввод-вывод осуществляется через потоки. Открытый поток связывается с символьным атомом.
(setq f (open имя-файла :direction параметр)
В качестве параметра указывается одно из значений:
:input – открыть для ввода
:output – открыть для вывода
:io – для ввода-вывода
Запись в файл и чтение из файла производится функциями (PRINx поток) и (READ поток).
11. Системные свойства символа и список свойств, определяемых пользователем. Получение, присваивание, изменение и удаление свойств.
12. Простая рекурсия. Определение и примеры. Рекурсия по значению и аргументу.
Рекурсия называется простой, если рекурсивный вызов в некоторой ветви встречается один раз.
Если рекурсивный вызов в некоторой ветви определяет результат функции – рекурсия по значению.
Если рекурсивный вызов определяемой функции стоит в аргументе другой функции – рекурсия по аргументу.
13. Основные приемы определения рекурсивных функций: вспомогательные функции, накапливающие параметры, локальные определения подфункций. Примеры.
Вспомогательные функции служат подпрограммами для основной функции, которая является главной программой.
накапливающие параметры – определяется вспомогательная функция с лишним параметром, который используется для накопления результата.
(defun r (x y)
(cond ((eq x nil) y)
(t (r (cdr x) (cons (car x) y)))))
14. Другие формы рекурсии: параллельная, взаимная и рекурсия более высокого порядка. Примеры.
Параллельная – тело определения функции f содержит вызов некоторой функции g, несколько аргументов которой являются рекурсивными вызовами функции f.
(defun f …
…(g …(f …)…(f…)…)
…)
(defun copy2 (x)
(cond ((eq x nil) nil)
((atom (car x)) (cons (car x) (copy2 (cdr x))))
(t (cons (copy2 (car x)) (copy2 (cdr x))))))
Взаимная – в определении функции f вызывается некоторая функция g которая содержит вызов функции f.
(defun f…
… (g …) … )
(defun g …
… (f …) … )
(defun mov (x y)
(cond ((eq x nil) y)
(t (mov (cdr x) (cons (rev2 (car x)) y)))))
(defun rev2 (x)
(cond ((atom x) x)
(t (mov x nil))))
Рекурсия более высокого порядка – аргументом рекурсивного вызова является рекурсивный вызов.
(defun f …
… (f … (f … ) … )
… )
(defun lev (x y)
(cond ((eq x nil) y)
((atom x) (cons x y))
(t (lev (car x) (lev (cdr x) y)))))
(defun level1 (x)
(lev x nil))
