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

Макросы

Макросы – специальное средство, позволяющее вычислять формированное выражение в ходе выполнения программы.

(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))

Шаги при разработке макроса:

  1. Написать пример функции, которую макрос должен формировать.

  2. Выделить общие части для нескольких функций и переменных.

  3. Переменные части обозначить переменными, выделить запятыми и вынести в аргументы. Постоянные части записать напрямую.

  4. Написать макрос, реализующий фунцию.

Задание: просматривать список, и выделять первый элемент, удовлетворяющий данному условию.

С помощью 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 – читающая символы из файла, и в качестве значения возвращающая десятичное представление кода этого символа. Единственный аргумент – текстовый поток.