apply, apply-primitive-procedure 和 apply-in-underlying-scheme

apply, apply-primitive-procedure and apply-in-underlying-scheme

Apply4.1.1 The Core of the Evaluator of SICP 中定义为:

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

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

我在“4.1.4 Rnning the Evaluator as a Program”中引用了 apply-primitive-procedure 的定义:

(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 is the apply procedure we have used in earlier chapters. The metacircular evaluator's apply procedure ([[4.1.1]]) models the working of this primitive. Having two different things called apply leads to a technical problem in running the metacircular evaluator, because defining the metacircular evaluator's apply will mask the definition of the primitive. One way around this is to rename the metacircular =apply= to avoid conflict with the name of the primitive procedure. We have assumed instead that we have saved a reference to the underlying =apply= by doing
(define apply-in-underlying-scheme apply)
before defining the metacircular apply. This allows us to access the original version of apply under a different name.

它表示 apply-in-underlying-scheme 在 4.1.1 中是 apply

总结:

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

我想这不是递归。

我的理解有什么问题吗?

Apply表示对所有非特殊形式的函数应用(特殊形式在eval中考虑)。 Apply 是一个递归函数,永远 完成。

Apply细分为2个程序申请案例:

-- 内部 到实现语言的系统

这是在目标语言和用于实现目标语言的语言(源语言)之间进行转换的地方。

这里需要对每个参数进行求值(通过eval),将得到的对象转换为源语言中类似的对象,然后调用源语言的应用函数。对于某些参数,可能会发生 eval->apply 的递归。

-- 使用目标语言提供的组合方式在目标语言中创建的组合

在这种情况下,您还需要为每个参数递归调用eval,并使用目标语言中的函数应用程序。在这种情况下,您不需要将 eval 的结果转换为源语言中的对象。

所以在组合的情况下,apply中也有递归,但这是一种会完成的递归(函数应用函数是primitive-recursive function),因为你每次评估一个较小的部分时间(运算符、操作数与完整的初始表达式)。

我认为你没有注意到 apply 是一个原始递归运算符,你担心它不会完成。