
3 Что делает функция
(DEFUNF1
(X)
(IF(ATOMX)X
(IF (AND
(LISTPX)
(EQ
(CARX)
'QUOTE))
(Fl
(CADRX))
(CONS(Fl
(CARX))
(Fl
(CDRX))))))?
Эта функция имеет три ветви. Для того, чтобы их стало лучше видно, перепишем
эту функцию с использованием функции
COND:
(DEFUN F1 (X)
(COND
( (АТОМ X) X)
((AND
(LISTP X) (EQ (CAR X)
'QUOTE))
(Fl (CADR
X)))
(T (CONS (Fl
(CARX))
(Fl
(CDRX))))))
Первая проверка соответствует терминальной ветви. Аргумент функции F1
станет значением самой функции, если он является атомом. Последняя ветвь
соответствует схеме общей рекурсии, поэтому первая ветвь будет обрабатывать как
конец списка - NIL, так и произвольный символьный атом, являющийся головой
некоторого списка.
Во второй ветви проверяется, что аргумент функции F1 является списком с
головой QUOTE. При выполнении этого условия возвращается результат применения
этой же функции ко второму аргументу списка. Вспомним, что функция QUOTE имеет
всего один аргумент. Таким образом, результат применения F1 к функции QUOTE
равен результату применения F1 к ее аргументу.
Таким образом, функция F1 "очищает" переданный список от апострофов.
Заметим, что символьный атом QUOTE, не являющийся именем функции, не будет
удален, то есть (Fl
'(QUOTE
QUOTE))
даст QUOTE. Функция Fl предполагает
также,
что функция QUOTE всегда имеет ровно один параметр, то есть длина списка с головой
QUOTE равна 2. Это означает, что (Fl
'(QUOTE
А В
С))
равно просто А, остальные
аргументы игнорируются. Последнее замечание: функция F1 удаляет апострофы на
любом уровне вложенности, то есть
(Fl
'(QUOTE
(LIST (QUOTE (QUOTE (QUOTE
A))))))
равно (LIST A).
Таким образом, правильный ответ - функция
Fl
заменяет все функции QUOTE их
первыми аргументами на всех уровнях вложенности.
47