首页 > 解决方案 > apply、apply-primitive-procedure 和 apply-in-underlying-scheme

问题描述

Apply4.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 the Evaluator as a Program”中的定义引用为:

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

所以apply-primitive-procedure是由apply-in-underlying-scheme

尽管如此,请参阅脚注:

Apply-in-underlying-schemeapply我们在前面章节中使用的过程。元循环评估apply程序([[4.1.1]])模拟了这个原语的工作。调用两个不同的东西apply会导致运行元循环评估器的技术问题,因为定义元循环评估器 apply将掩盖原语的定义。解决此问题的一种方法是重命名元循环 =apply= 以避免与原始过程的名称冲突。相反,我们假设我们已经通过
(define apply-in-underlying-scheme apply)
在定义 metacircular 之前保存了对底层 =apply= 的引用applyapply这允许我们以不同的名称访问原始版本。

它指出apply-in-underlying-schemeapply4.1.1 中。

总结:

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

我想这不是递归。

我的理解有什么问题?

标签: schemesicp

解决方案


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

Apply又细分为2种程序申请情况:

--实现语言的系统内部

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

在这里,您需要评估每个参数(通过eval)并将生成的对象转换为源语言中的类似对象,然后才能调用源语言的应用程序函数。对于某些参数,eval->apply可能会发生递归。

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

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

因此,在组合的情况下, in 中也存在递归apply,但它是一种将完成的递归(函数应用函数是一个原始递归函数),因为您每次都评估一个较小的部分(运算符、操作数与完整的初始表达式) .

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


推荐阅读