Введение в программирование на Лиспе



             

Вычисление


Явное определение такой функции позволяет достичь четкости механизмов обработки Лисп-программ.

(eval '((LAMBDA (x y) (CONS (CAR x) y)) '(A B) '(C D) )) = (A C D)

Вводим две основные функции eval и apply для обработки форм и обращения к функциям соответственно. Каждая из этих функций использует ассоциативный список для хранения связанных имен - значений переменных и определений функций. Сначала этот список пуст.

Вернемся к синтаксической сводке вычислимых форм.

<форма> ::= <переменная> | (QOUTE <S-выражение>) | (COND (<форма> <форма>) ... (<форма> <форма>)) | (<функция> <аргумент> ... <аргумент>)

<аргумент> ::= <форма>

<переменная> ::= <идентификатор>

<функция> ::= <название> | (LAMBDA <список_переменных> <форма>) | (DEFUN <название> <функция>)

<список_переменных> ::= (<переменная> ... )

<название> = <идентификатор>

<идентификатор> ::= <атом>

Пример 6.1. Синтаксическая сводка программ на языке Лисп (html, txt)

Каждой ветви этой сводки соответствует ветвь универсальной функции:

(DEFUN eval (e) (ev e '((Nil . Nil))))

Вспомогательная функция ev понадобилась, чтобы ввести накапливающий параметр – ассоциативный список, в котором будут храниться связи между переменными и их значениями и названиями функций и их определениями.

(defun ev (e a) (COND ( (atom e) (cdr (assoc e a)) ) ( (eq (car e) 'QUOTE) (cadr e)) ( (eq(car e) 'COND) (evcon (cdr e) a)) ( T (apply (car e) (evlis (cdr e) a) a) )) )

Поясним ряд пунктов этого определения.

Первый аргумент ev - форма. Если она - атом, то этот атом может быть только именем переменной, а значение переменной должно бы уже находиться в ассоциативном списке.

Если CAR от формы - QUOTE, то она представляет собой константу, значение которой вычисляется как CADR от нее самой.

Если CAR от формы - COND, то форма - условное выражение. Вводим вспомогательную функцию EVCON, (определение ее будет дано ниже), которая обеспечивает вычисление предикатов (пропозициональных термов) по порядку и выбор формы, соответствующей первому предикату, принимающему значение "истина".


Содержание  Назад  Вперед