Шаг 96.
Простейшие интерпретаторы. Вычисление значения арифметического выражения

    На этом шаге мы рассмотрим функцию, вычисляющую значения арифметического выражения.

    Задачей этого и последующих шагов является: показать как 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

    На следующем шаге мы рассмотрим перевод инфиксного выражения в префиксное.




Предыдущий шаг Содержание Следующий шаг