На этом шаге мы рассмотрим функцию, вычисляющую значения арифметического выражения.
Задачей этого и последующих шагов является: показать как LISP может быть использован для реализации простейших интерпретаторов.
Пусть список L имеет одну из следующих структур:
(+ A B) (- A B) (* A B) (/ A B)
Здесь A и B - либо атомы с численными значениями, либо списки такого же вида, как список L.
Типичным является список
(/ (+ A (- B C)) (* (/ D E) F))
представляющий выражение
(A + (B - C)) / ((D / E) * F)
Тогда функция, вычисляющая значение арифметического выражения примет вид:
(DEFUN COUNT (LAMBDA (L) (COND ( (ATOM L) L) ( (EQ (CAR L) +) (+ (COUNT (CADR L)) (COUNT (CADDR L))) ) ( (EQ (CAR L) -) (- (COUNT (CADR L)) (COUNT (CADDR L))) ) ( (EQ (CAR L) *) (* (COUNT (CADR L)) (COUNT (CADDR L))) ) ( (EQ (CAR L) /) (/ (COUNT (CADR L)) (COUNT (CADDR L))) ) ) ))
Результат вычисления выражения
(/ (+ 5 (- 4 2)) (* (/ 6 2) 3))
0.7777777
На следующем шаге мы рассмотрим перевод инфиксного выражения в префиксное.