На этом шаге мы рассмотрим функцию, вычисляющую значения арифметического выражения.
Задачей этого и последующих шагов является: показать как 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
На следующем шаге мы рассмотрим перевод инфиксного выражения в префиксное.