Может кто-нибудь объяснить мне на каком-нибудь примере разницу между Apply и Eval в LISP? - PullRequest
2 голосов
/ 15 января 2012

Может ли кто-нибудь объяснить мне на каком-нибудь примере разницу между «Apply» и «Eval» в LISP?Я не могу этого понять.

Ответы [ 3 ]

5 голосов
/ 15 января 2012

Какой лучший способ понять это, чем взглянуть на фактическую реализацию!См. Раздел Metacircular Evaluator в SICP , в нем очень четко объяснено внутреннее функционирование eval и apply.Цитата из книги:

Eval принимает в качестве аргументов выражение и окружение.Он классифицирует выражение и направляет его оценку.Eval структурирован как анализ случая синтаксического типа выражения для оценки.Чтобы сохранить процедуру в целом, мы выражаем определение типа выражения абстрактно, не принимая каких-либо конкретных представлений для различных типов выражений.Каждый тип выражения имеет предикат, который проверяет его, и абстрактный способ выбора его частей.Этот абстрактный синтаксис позволяет легко увидеть, как мы можем изменить синтаксис языка, используя тот же оценщик, но с другим набором синтаксических процедур.

Применить принимает два аргумента, aпроцедура и список аргументов, к которым должна применяться процедура.Apply классифицирует процедуры на два вида: он вызывает apply-primitive-процедуру для применения примитивов;он применяет сложные процедуры, последовательно оценивая выражения, составляющие основную часть процедуры.Среда для оценки тела составной процедуры создается путем расширения базовой среды, переносимой процедурой, для включения в нее фрейма, связывающего параметры процедуры с аргументами, к которым должна применяться процедура.

5 голосов
/ 15 января 2012

EVAL выполняет произвольный исходный код, составленный из структур данных Lisp. Это включает вызовы функций, макросы, специальные формы, переменные и самооценочные данные.

APPLY применяет функцию к списку аргументов.

2 голосов
/ 15 января 2012

apply применяет функцию к некоторым аргументам:

(apply + 1 2 3)
;=> 6

eval вычисляет выражение:

(eval '(+ 1 2 3))
;=> 6
...