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



             

Именование значений и подвыражений


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

Атом может быть как переменной, так и фактическим аргументом. Некоторые сложности вызывает то обстоятельство, что иногда аргументы могут быть переменными, вычисляемыми внутри вызова другой функции.

Часть интерпретатора, которая при вычислении функций связывает переменные, называется APPLY. Когда APPLY встречает функцию, начинающуюся с LAMBDA, список переменных попарно связывается со списком аргументов и добавляется к началу ассоциативного списка.

Часть интерпретатора, которая потом вычислит переменные, называется EVAL. При вычислении тела функции универсальная функция EVAL может обнаружить переменные. Она их ищет в ассоциативном списке. Если переменная встречается там несколько раз, то используется последнее или самое новое значение.

Проиллюстрируем это рассуждение на примере. Предположим, интерпретатор получает следующее S-выражение:

((LAMBDA (X Y) (CONS X Y)) 'A 'B)

Функция:

(LAMBDA (X Y) (CONS X Y))

Аргументы: (A B)

EVAL передает эти аргументы функции APPLY. (См. параграф 6).

(apply #'(LAMBDA (X Y) (CONS X Y)) '(A B) Nil )

APPLY свяжет переменные и передаст функцию и удлинненный а-список EVAL для вычисления.

(eval '(CONS X Y) ' ((X . A) (Y . B) ))

EVAL вычисляет переменные и сразу передает их функции CONS, строящий из них бинарный узел.

(Cons 'A 'B) = (A . B)

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

(defun UNION- (x y) (let ( (a-x (CAR x)) (d-x (CDR x)) ) (COND ((NULL x) y) ((MEMBER a-x y) (UNION d-x y) ) (T (CONS a-x (UNION d-x y)) ) ) ))

Пример 8.1.

(html, txt)

Обычно переменная считается связанной в области действия лямбда-конструктора функции, который связывает переменную внутри тела определения функции методом размещения пары из имени и значения в начале ассоциативного списка (а-списка).


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