Интерпретатор языка COMMON LISP и вычисление выражений

Любая LISP-система имеет интерактивный интерфейс, с помощью которого можно взаимодействовать с интерпретатором языка. Интерпретатор языка COMMON LISP представляет собой бесконечный цикл типа прочитать-вычислить-записать. Он непрерывно читает выражение, напечатанное пользователем, вычисляет его и отображает результат. Чтобы сообщить, что система ожидает новые выражения, она выводит приглашение. Часто в качестве такого приглашения используется символ «>».

Программы на Лиспе состоят из символьных выражений. Символьным выражением может быть атом или список, который, в свою очередь, может состоять из произвольного количества символьных выражений. Типы символьных выражений представлены на рис. 7.2.

Типы символьных выражений

Рис. 7.2. Типы символьных выражений

Как было отмечено выше, представление данных и программ в виде символьных выражений является важной особенностью языка COMMON LISP. Данная особенность предоставляет инженерам широкие возможности символьной обработки, что делает язык удобным для решения задач в области искусственного интеллекта. Также инженерам предоставляется возможность разрабатывать программы, которые создают новые программы в процессе своей работы. Более подробно перечисленные возможности будут рассмотрены ниже.

Далее для краткости наряду с термином символьное выражение будет использоваться термин выражение.

Если ввести в интерпретатор число 0 после приглашения, то он просто отобразит его, после чего выведет очередное приглашение, ожидая новых выражений:

> 0

В данном случае введенное выражение выглядит так же, как и полученное значение. Такие выражения называют само-вычисляемыми. Числа, строки являются самовычисляемыми объектами.

Выражения, которые вызывают элементарные функции, вычисляются следующим образом: сначала вычисляется каждый из параметров выражения независимо от порядка их следования. Затем элементарная функция применяется к значениям параметров, и отображается результат. Данный порядок называется правилом вычисления для COMMON LISP.

Язык COMMON LISP содержит элементарные функции для выполнения основных арифметических операций. К ним относятся + , -, * и / для сложения, вычитания, умножения и деления, соответственно. Функции * и + могут иметь несколько параметров, но могут и совсем не иметь их. Если функция * задана без параметров, она возвращает 1; если функция + задана без параметров, она возвращает 0. Функция + складывает все свои параметры вместе, функция * перемножает их. Функции / и - могут иметь несколько параметров. При вычитании все параметры, кроме первого, вычитаются из первого. При делении все параметры после первого являются его делителями.

Таким образом, выражение для сложения чисел 3, 7, 2, имеет следующий вид:

>(+375)

12

В выражении (+ 3 75) знак + является оператором, а числа 3, 7, 2 — аргументами. Такую структуру принято называть префиксной нотацией, так как первым располагается оператор.

Выражения могут быть вложенными:

> (- (* 3 4) (+ 2 3))

7

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

Как уже было отмечено, перед вычислением функции в соответствии правилом вычисления для COMMON LISP сначала вычисляется каждый из параметров функции, затем элементарная функция применяется к значениям параметров. Однако в некоторых случаях параметрами являются данные в виде атомов, списков. Очевидно, что в этих случаях параметры не должны вычисляться. Примером может служить функция, определяющая, количество вхождений заданного знака в заданный список. Функция имеет два параметра (символ и список), ни один из них не должен вычисляться.

Чтобы избежать вычисления выражения, существует элементарная функция QUOTE или оператор цитирования. У оператора QUOTE есть собственное правило вычисления, которое заключается в том, что ничего вычислять не нужно. Оператор QUOTE принимает один аргумент в качестве параметра и возвращает его текстовую запись без изменения:

> (QUOTE (* 3 7))

(* 3 7)

Без использования оператора QUOTE выражение (* 3 7) вернет 21:

>(*37)

21

Следует отметить, что цитирование предотвращает вычисление всего выражения, включая все его элементы.

Для удобства в COMMON LISP можно использовать сокращение для обозначения оператора QUOTE, которое заключается в простом приписывании перед выражением символа апострофа С). Таким образом, вместо (QUOTE (А В С)) можно использовать обозначение ‘ (А В С): ‘ (* 3 7) вернет (* 3 7)

 
Посмотреть оригинал
< Пред   СОДЕРЖАНИЕ   ОРИГИНАЛ     След >