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