Отчет оформляется каждым студентом самостоятельно и содержит номер, название, цели и задачи лабораторной работы, задание и результаты реализации (листинг программы, схемы, контрольный пример, результаты), ответы на контрольные вопросы.
Контрольные вопросы.
1. Вычислите значения следующих вызовов:
a) (apply ’list ’(a b))
b) (funcall ’list ’(a b))
c) (funcall ’apply ’list ’(a b))
d) (funcall ’list ’apply ’(a b))
e) (funcall ’funcall ’funcall ’list ’list ’(a b))
2. Определите функционал FUNCALL через функционал APPLY.
3. Реализуйте рекурсивную функцию my-find, которая в качестве аргументов получает предикат и список элементов, и возвращает первый элемент списка, который удовлетворяет предикату. Если в списке нет элементов, удовлетворяющих предикату, то ответом должно быть NIL.
Пример:
>(my-find ‘numberp ‘(a b 2 C))
4. Реализуйте рекурсивную функцию subsets, которая возвращает список всех подсписков для переданного в качестве аргумента списка. Подсписки могут быть перечислены в любом порядке.
Примеры:
>(subsets nil)
(NIL)
>(subsets ’(A B C))
(NIL (A) (B) (C) (A B) (A C) (B C) (A B C))
5. Определите функционал (MAPLIST fn список) для одного списочного аргумента.
6. Напишите программу генератора, порождающего следующую последовательность: (A), (B A), (A B A), (B A B A) …
7. Определите в виде макроса форму (REPEAT e UNTIL p), соответствующую оператору REPEAT языка Паскаль.