
7 Куков будет результат оценки системой
muLisp
выражения
(SET
(OR
(SETQA
NIL)(SET
'A
'B))
(AND (CAR
'(A
B))
A))
Оценим первый аргумент функции SET - (OR (SETQ A
NIL)(SET
'A
Функция OR оценивает свои аргументы и возвращает в качестве результата первую
отличную от NIL оценку или NIL, если таких нет. Оценка первого аргумента - (SETQ
A NIL) - даст NIL, причем в процессе вычисления этой функции изменится значение
символьного атома А. При вычислении функции SET оба аргумента берутся без
оценки (точнее, оцениваются значения функций QUOTE), поэтому атом А приобретает
значение В, значением функции SET и, соответственно, функции OR также будет
символьный атом
В.
\
Оценим второй аргумент функции SET- (AND (CAR
'(А
В))
А)).
Эта функция
прекращает оценку своих аргументов, как только встретился первый NIL, в противном
случае значение функции равно оценке последнего аргумента. Оценкой функции CAR
является отличный от NIL атом
А,
поэтому оценка аргументов продолжается. Оценкой
символьного атома А заведомо является В, поскольку соответствующее присваивание
выполнено при вычислении значения функции OR. Этот символьный атом В и станет
результатом функции AND.
Таким образом, оценки обоих аргументов функции SET дали В, поэтому
значением символьного атома В станет сам этот символьный атом, и результатом
оценки всего
s-выражения
также будет символьный атом В.
8 Написать
функцию,
имеющую один аргумент-список и возвращающую
список из 2-го и 4-го элемента, если они оба являются атомами, иначе
квадрат 1-го элемента, если этот элемент - число, и NIL в противном
случае.
Условие, накладываемое на
аргументы,
является "трехэтажным", поэтому для
программирования такого условия удобнее использовать функцию
COND,
чем
Ш.
Аргументы функции COND записываются парами (<условие> <результат>), причем
анализ таких пар, или веток, идет до тех пор, пока не найдется ветка с истинным
условием (смотри пункт 1.3.8). Это дает возможность проверять каждое условие
только один раз
Обозначим формальный параметр нашей функции через X. 2-ой и 4-ый элементы
этого списка получим с помощью функций (CADR X) и (CADDDR X) соответственно.
Тогда первая ветка функции COND будет иметь вид
((AND
(ATOM (CADR
X))
(ATOM
(CADDDR
X)))
(LIST (CADR X) (CADDDR
X))).
21