применять, применять-примитивную процедуру и применять-в-основную-схему - PullRequest
1 голос
/ 15 января 2020

Apply определено в 4.1.1 Ядро оценщика SICP как:

(define (apply procedure arguments)
  (cond ((primitive-procedure? procedure)
         (apply-primitive-procedure ;
          procedure
          arguments));

        ((compound-procedure? procedure)
        .....
        (else
        ....)

Я ссылался на определение apply-primitive-procedure в "4.1.4 Rnning «Оценщик как программа» как:

(define (apply-primitive-procedure proc args)
  (apply-in-underlying-scheme
   (primitive-implementation proc) args))

Так что apply-primitive-procedure реализовано apply-in-underlying-scheme

Тем не менее, обратитесь к сноскам:

Apply-in-underlying-scheme - это процедура apply, которую мы использовали в предыдущих главах. Процедура метациркуляционного apply ([[4.1.1]]) моделирует работу этого примитива. Наличие двух разных вещей, называемых apply, приводит к технической проблеме при запуске метациркуляционного оценщика, поскольку определение apply метациркулярного оценщика будет маскировать определение примитива. Одним из способов решения этой проблемы является переименование метациркуляра = apply =, чтобы избежать конфликта с именем примитивной процедуры. Вместо этого мы предположили, что сохранили ссылку на базовый = apply =, выполнив
(define apply-in-underlying-scheme apply)
перед определением метациркуляра apply. Это позволяет нам получить доступ к исходной версии apply под другим именем.

В нем говорится, что apply-in-underlying-scheme равно apply в 4.1.1.

В сводке :

 ,-> apply -> apply-primitive-procedure -> apply-in-underlying-scheme --.
 '----------------------------------------------------------------------'

Полагаю, это не рекурсия.

Что не так с моим пониманием?

1 Ответ

1 голос
/ 15 января 2020

Apply означает применение функции для всего, что не является специальной формой (специальные формы рассматриваются в eval). Apply является рекурсивной функцией, которая будет всегда конечной sh.

Apply подразделяется на 2 случая применения процедуры:

- внутренний в систему, которая реализует язык

Это место, где осуществляется переход между целевым языком и языком, который используется для реализации целевого языка (исходного языка).

Здесь необходимо оценить каждый параметр (через eval) и преобразовать полученный объект в аналогичный объект на исходном языке, прежде чем вызывать функцию приложения исходного языка. Для некоторых параметров может произойти рекурсия eval->apply.

- комбинация , созданная на целевом языке с использованием средств комбинации, которые обеспечивает целевой язык.

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

Так что в случае комбинаций в apply также есть рекурсия, но это своего рода рекурсия это закончится sh (функция приложения функции является примитивно-рекурсивной функцией ), потому что каждый раз вы вычисляете меньший фрагмент (оператор, операнды или полное начальное выражение).

Я думаю, что вы не заметили, что apply является примитивно-рекурсивным оператором, и вы боялись, что он не закончится sh.

...