Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Logicheskoe_i_funktsionalnoe_programmirovanie (...doc
Скачиваний:
0
Добавлен:
28.11.2019
Размер:
691.2 Кб
Скачать

4.4 Выполнение работы

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

CL-USER 1 > 3

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)

3

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

CL-USER 5 > A

3

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

CL-USER 6 > (+ A A)

6

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

CL-USER 7 > quote (+ 2 5)

(+ 2 5)

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

CL-USER 8 > ’(+ 2 5)

(+ 2 5)

CL-USER 9 > (+ 2 5)

7

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

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

1

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

(2 3)

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

2

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

1

CL-USER 14 > (list 1 2 3)

(1 2 3)

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

(1 2 3)

4.5 Задание на лабораторную работу

  1. Записать и вычислить s-выражения для следующих формул:

    1. (3 * 17) + (4 * 19)

  2. Построить диаграммы списочных ячеек для выражений:

    1. (+ 3 5)

    2. (x (a b (c)))

    3. (((nil)))

  3. Вычисление выражения (caadr (cadr ’(a ’(b (c))))) вернет результат b. Если же мы вычислим вторую часть этого выражения, то есть (cadr ’(a ’(b (c)))), то получим ’(b (c)). Вычисление же (caadr ’(b (c))) даст в результате c. Необходимо объяснить, почему так получается.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]