Выполнение работы. Лисп обычно используется в режиме интерпретации

Лисп обычно используется в режиме интерпретации. Интерпретатор Лиспа функционирует следующим образом: когда пользователь заканчивает ввод какого-либо выражения, интерпретатор вычисляет и выдает значение этого выражения. Рассмотрим простейший пример. Введите в окне FreeLisp Listener следующее выражение и нажмите клавишу enter:

CL-USER 1 > 3

Мы ввели число 3, которое является атомом и, следовательно, s-выражением. Интерпретатор Лиспа вычисляет значение этого s-выражения и выдает результат. Он совпадает с введенным выражением, поскольку значением числа является само это число. Введем следующее выражение:

CL-USER 2 > (+ 2 5) ; s-выражение

7 ; результат

При вычислении s-выражений интерпретатор Лиспа следует следующим правилам:

1. Если s-выражение число, то значением этого выражения является само это число.

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

Например, при вычислении значения выражения
(* (+ 1 2) (- 4 3)) интерпретатор вначале вычислит значения первого и второго аргументов функции «*». Первый и второй аргументы являются списками. В каждом из этих списков аргументы являются числами. Значением числа является само это число. Числа 1 и 2 передаются в качестве аргументов в функцию «+». Числа 4 и 3 передаются в качестве аргументов в функцию «-». Затем результаты вычисления первого и второго выражений
(3 и 1) передаются в качестве аргументов в функцию «*».

Пока что мы не рассмотрели как вычисляются s-выражения, которые являются символами. Если мы зададим следующее символьное выражение, то получим сообщение об ошибке.

CL-USER 3 > A

Error: The variable A is unbound

Символы можно использовать как переменные. В этом случае они могут обозначать некоторые выражения. У символов изначально нет какого-нибудь значения как у констант. В нашем примере интерпретатор не может вычислить значение символа, поскольку его у символа нет. Свяжем переменную A с каким-либо значением, используя функцию setf:

CL-USER 4 > (setf A 3)

Теперь, когда мы связали значение с переменной A, интерпретатор позволит нам вычислить значение s-выражение:

CL-USER 5 > A

Мы можем использовать переменную A в более сложном s-выражении:

CL-USER 6 > (+ A A)

Рассмотрим еще несколько примеров применения описанных выше функций:

CL-USER 7 > quote (+ 2 5)

(+ 2 5)

Обратите внимание на использование функции quote, которая просто возвращает переданный ей аргумент. Аналогом функции quote является символ ’.

CL-USER 8 > ’(+ 2 5)

(+ 2 5)

CL-USER 9 > (+ 2 5)

Некоторые примеры использования функций работы со списками:

CL-USER 10 > (car ’(1 2 3))

CL-USER 11 > (cdr ’(1 2 3))

(2 3)

CL-USER 12 > (nth 1 ’(1 2 3)) ; нумерация с нуля

CL-USER 13 > (first ’(1 2 3))

CL-USER 14 > (list 1 2 3)

(1 2 3)

CL-USER 15 > (cons 1 ’(2 3))

(1 2 3)

Наши рекомендации