
- •История развития фп.
- •Введение в лисп.
- •Элементарные понятия лисп.
- •Функции. Базовые функции.
- •Использование символов в качестве переменных.
- •Базовые функции.
- •Лекция № 2.
- •Арифметические функции
- •Определение функций.
- •Передача параметров глобальной и локальной переменной.
- •Дополнительные функции обработки списков.
- •Логические функции.
- •Управляющие структуры. Лекция №3.
- •Вводы выводы информации
- •Операторы вычисления локальных переменных и циклических предложений.
- •Дополнительные функции печати.
- •Циклические предложения
- •Лекция №4 (05.03.2013)
- •Рекурсия
- •Функции-функционалы
- •Лямбда-выражения
- •Свойства символов
- •Лекция №5 от 12.03.2013 Внутреннее представление списков и применяющие функционалы
- •Списочные ячейки и базовые функции
- •Сборка мусора
- •Обработка списков без разрушения
- •Разрушающие функции
- •Применяющие функционалы
- •Лекция № 19.03.2013 Массивы и Макросы
- •Макросы
- •Шаги при разработке макроса:
- •Пример программы на Lisp. Дифференцированное выражение.
- •Входные и выходные потоки
Макросы
Макросы – специальное средство, позволяющее вычислять формированное выражение в ходе выполнения программы.
(defun blancs (n))
(do ((cont n (- count 1))
((zerop cont) nil (terpri)
)
)
*(blancs 4) – осуществляет переход на следующую строку 4 раза _ _ _ _ |
(do-times ‘(terpri) 4)
Чтобы заменить terpri на то, что нам надо, используем
(defmacro do-times (operation n) (do ((count ,n (-count 1))) ((zerop count) nil) ,operation ) )
Отличия от функции: аргументы macro не вычисляются перед их использованием. Например, если мы используем (do-times (print ‘(hello) 3)
Когда макрос вызывается, ЛИСП сначала вызывает тело macro, а затем вычисляет полученное выражение.
(do-times (print count 10))
Шаги при разработке макроса:
Написать пример функции, которую макрос должен формировать.
Выделить общие части для нескольких функций и переменных.
Переменные части обозначить переменными, выделить запятыми и вынести в аргументы. Постоянные части записать напрямую.
Написать макрос, реализующий фунцию.
Задание: просматривать список, и выделять первый элемент, удовлетворяющий данному условию.
С помощью do-count можно работать со списками.
(defmacro term-search (predicate lis) (do ((tail lis (cdr tail))) ((null tail) nil (cond ((,predicate (car tail) (return (car tail)))) ) )
Пример программы на Lisp. Дифференцированное выражение.
При определении функции можно использовать механизм ключевых слов для возможности по-разному трактовать аргументы функции.
Три основных ключевых слова:
Optional – Применяется для указания необязательных аргументов. Rest – позволяет работать с хвостом списка аргументов изменяющейся длины Key – для указания ключевых параметров.
(defun bar (x &optional y) (if y x 0))
*(bar b) 0
*(bar 5 t) 5
(defun baz (&optional (x 3) (y 5)) (+ x y)) *(baz 5 6) 11
*(baz 5) 10
*(baz) 8
(defun foo (x &rest y) y)
*(foo 3) nil
*(foo 3 5 6) (5 6)
В каждом из аргументов связывается конкретное имя при вызове. Пример:
*(ff :x 5 :y 3) результат: (5. 3)
Входные и выходные потоки
Для ввода и вывода информации
(setq our-output-stream (option “sesame” :direction: output)
(princ s (setq our-output-stream (option “sesame” :direction: output))
(read our-input-stream)
Есть функция readchar – читающая символы из файла, и в качестве значения возвращающая десятичное представление кода этого символа. Единственный аргумент – текстовый поток.