Введение

Функция в языке программирования, которая вычисляет строку.

В некоторых языках программирования `eval`, сокращение от английского `evaluate`, — это функция, которая вычисляет строку так, как если бы это было выражение на этом языке, и возвращает результат; в других — она выполняет несколько строк кода, как если бы они были включены вместо строки, содержащей `eval`. Входные данные для `eval` не обязательно должны быть строкой; это может быть структурированное представление кода, такое как абстрактное синтаксическое дерево (например, формы Lisp), или специальный тип, например, код (как в Python). Аналогом оператора является `exec`, который выполняет строку (или код в другом формате) как если бы это был оператор; в некоторых языках, таких как Python, присутствуют оба, а в других — только один из `eval` или `exec`. `Eval` и `apply` являются примерами метациркулярных вычислителей, интерпретаторов языка, которые могут быть вызваны внутри самого языка.

Реализация

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

ActionScript (по умолчанию)

В ActionScript (язык программирования Flash) функцию eval нельзя использовать для вычисления произвольных выражений. Согласно документации Flash 8, её применение ограничено выражениями, представляющими собой "имя переменной, свойства, объекта или фрагмента анимации для получения значения. Этот параметр может быть как строкой, так и прямой ссылкой на экземпляр объекта". ActionScript 3 не поддерживает функцию eval. Библиотека ActionScript 3 Eval и API D.eval были проектами по разработке аналогов eval для ActionScript 3. Оба проекта были закрыты, поскольку жизненный цикл Adobe Flash Player завершен.

REAL основной

В REALbasic есть класс под названием RBScript, который может выполнять код REALbasic во время выполнения. RBScript сильно изолирован – в нем присутствуют только самые основные функции языка, и вам необходимо явно предоставлять ему доступ к ресурсам, которые вы хотите использовать. Вы можете необязательно назначить объект свойству "контекст". Это позволяет коду в RBScript вызывать функции и использовать свойства этого объекта-контекста. Однако он по-прежнему ограничен пониманием только самых простых типов данных, поэтому, если функция возвращает Словарь или MySpiffyObject, RBScript не сможет его использовать. Вы также можете взаимодействовать с RBScript через события Print и Input.

VBScript

В интерпретируемом языке Microsoft VBScript предусмотрено две конструкции. Eval – это вычислитель выражений, который может включать вызовы пользовательских функций. (Эти функции могут иметь побочные эффекты, например, изменять значения глобальных переменных.) Execute выполняет одно или несколько выражений, разделенных двоеточием, которые могут изменять глобальное состояние. И VBScript, и JScript eval доступны разработчикам скомпилированных Windows-приложений (написанных на языках, не поддерживающих Eval) через ActiveX-элемент управления Microsoft Script Control, метод Eval которого может вызываться кодом приложения. Для поддержки вызова пользовательских функций необходимо сначала инициализировать элемент управления методом AddCode, который загружает строку (или строковый ресурс), содержащую библиотеку пользовательских функций, определенных на выбранном языке, перед вызовом Eval.

Visual Basic для приложений

Visual Basic for Applications (VBA), язык программирования Microsoft Office, является языком виртуальной машины, в котором среда выполнения компилирует и исполняет p-код. Его реализация Eval поддерживает только вычисление выражений, при этом выражение может включать пользовательские функции и объекты (но не пользовательские имена переменных). Важно отметить, что вычислитель отличается от VBS, и вызов определенных пользовательских функций может работать иначе в VBA, чем тот же код в VBScript.

bs -

bs имеет функцию eval, принимающую один строковый аргумент. Эта функция является одновременно вычислителем выражений и исполнителем команд. В последнем качестве она также может использоваться для обработки ошибок. Примеры и текст ниже взяты из страницы руководства bs, как она представлена в Руководстве программиста UNIX System V Release 3.2.

Оболочки Unix

Команда eval присутствует во всех Unix-оболочках, включая оригинальную "sh" (оболочка Bourne). Она объединяет все аргументы через пробелы, затем повторно разбирает и выполняет полученную строку как команду.

Микрокод

В 1966 году IBM Conversational Programming System (CPS) представила микропрограммированную функцию EVAL для выполнения "интерпретативной оценки выражений, записанных в модифицированной польской обратной нотации" на IBM System/360 Model 50. Микрокодирование этой функции было "более чем в пять раз" быстрее, чем интерпретация оператора присваивания.