Интерпретатор Lisp, или вычислитель, — это часть Emacs, которая вычисляет значение выражения, переданного ему. Когда вызывается функция, написанная на Lisp, вычислитель вычисляет значение функции, вычисляя выражения в теле функции. Таким образом, запуск любой программы на Lisp по сути означает запуск интерпретатора Lisp.
Объект Lisp, предназначенный для вычисления, называется формой или выражением8. Тот факт, что формы являются объектами данных, а не просто текстом, является одним из фундаментальных различий между языками, подобными Lisp, и типичными языками программирования. Любой объект может быть вычислен, но на практике очень часто вычисляются только числа, символы, списки и строки.
В последующих разделах мы опишем подробности того, что означает вычисление для каждого типа формы.
Очень часто читают форму Lisp, а затем вычисляют эту форму, но чтение и вычисление — это отдельные действия, и каждое из них может выполняться независимо. Само по себе чтение ничего не вычисляет; оно преобразует печатное представление объекта Lisp в сам объект. На вызывающую функцию read возлагается задача указать, является ли этот объект формой для вычисления или служит какой-то совершенно иной цели. См. Функции ввода.
Вычисление — это рекурсивный процесс, и вычисление формы часто включает вычисление частей внутри этой формы. Например, когда вы вычисляете форму вызова функции, такую как (car x), Emacs сначала вычисляет аргумент (подформу x). После вычисления аргумента Emacs выполняет функцию (car), и если функция написана на Lisp, выполнение происходит путем вычисления тела функции (в этом примере, однако, car не является функцией Lisp; это примитивная функция, реализованная на C). См. Функции, для получения дополнительной информации о функциях и вызовах функций.
Вычисление происходит в контексте, называемом окружением, которое состоит из текущих значений и привязок всех переменных Lisp (см. Переменные).9 Всякий раз, когда форма ссылается на переменную без создания для нее новой привязки, переменная вычисляется в значение, заданное текущим окружением. Вычисление формы также может временно изменить окружение, привязывая переменные (см. Локальные переменные).
Вычисление формы также может вносить изменения, которые сохраняются; эти изменения называются побочными эффектами. Примером формы, которая производит побочный эффект, является (setq foo 1).
Не путайте вычисление с интерпретацией команд. Цикл команд редактора преобразует ввод с клавиатуры в команду (интерактивно вызываемую функцию) с использованием активных карт клавиш, а затем использует call-interactively для выполнения этой команды. Выполнение команды обычно включает вычисление, если команда написана на Lisp; однако этот шаг не считается частью интерпретации команд. См. Цикл команд.
Иногда это также называют S-выражением или sexp, но мы обычно не используем эту терминологию в этом руководстве.
Это определение «окружения» специально не предназначено для включения всех данных, которые могут повлиять на результат программы.