Может ли кто-нибудь объяснить мне на каком-нибудь примере разницу между «Apply» и «Eval» в LISP?Я не могу этого понять.
Какой лучший способ понять это, чем взглянуть на фактическую реализацию!См. Раздел Metacircular Evaluator в SICP , в нем очень четко объяснено внутреннее функционирование eval и apply.Цитата из книги:
eval
apply
Eval принимает в качестве аргументов выражение и окружение.Он классифицирует выражение и направляет его оценку.Eval структурирован как анализ случая синтаксического типа выражения для оценки.Чтобы сохранить процедуру в целом, мы выражаем определение типа выражения абстрактно, не принимая каких-либо конкретных представлений для различных типов выражений.Каждый тип выражения имеет предикат, который проверяет его, и абстрактный способ выбора его частей.Этот абстрактный синтаксис позволяет легко увидеть, как мы можем изменить синтаксис языка, используя тот же оценщик, но с другим набором синтаксических процедур. Применить принимает два аргумента, aпроцедура и список аргументов, к которым должна применяться процедура.Apply классифицирует процедуры на два вида: он вызывает apply-primitive-процедуру для применения примитивов;он применяет сложные процедуры, последовательно оценивая выражения, составляющие основную часть процедуры.Среда для оценки тела составной процедуры создается путем расширения базовой среды, переносимой процедурой, для включения в нее фрейма, связывающего параметры процедуры с аргументами, к которым должна применяться процедура.
Eval принимает в качестве аргументов выражение и окружение.Он классифицирует выражение и направляет его оценку.Eval структурирован как анализ случая синтаксического типа выражения для оценки.Чтобы сохранить процедуру в целом, мы выражаем определение типа выражения абстрактно, не принимая каких-либо конкретных представлений для различных типов выражений.Каждый тип выражения имеет предикат, который проверяет его, и абстрактный способ выбора его частей.Этот абстрактный синтаксис позволяет легко увидеть, как мы можем изменить синтаксис языка, используя тот же оценщик, но с другим набором синтаксических процедур.
Применить принимает два аргумента, aпроцедура и список аргументов, к которым должна применяться процедура.Apply классифицирует процедуры на два вида: он вызывает apply-primitive-процедуру для применения примитивов;он применяет сложные процедуры, последовательно оценивая выражения, составляющие основную часть процедуры.Среда для оценки тела составной процедуры создается путем расширения базовой среды, переносимой процедурой, для включения в нее фрейма, связывающего параметры процедуры с аргументами, к которым должна применяться процедура.
EVAL выполняет произвольный исходный код, составленный из структур данных Lisp. Это включает вызовы функций, макросы, специальные формы, переменные и самооценочные данные.
APPLY применяет функцию к списку аргументов.
apply применяет функцию к некоторым аргументам:
(apply + 1 2 3) ;=> 6
eval вычисляет выражение:
(eval '(+ 1 2 3)) ;=> 6