scheme - apply、apply-primitive-procedure 和 apply-in-underlying-scheme
问题描述
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 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-scheme
是apply
我们在前面章节中使用的过程。元循环评估apply
程序([[4.1.1]])模拟了这个原语的工作。调用两个不同的东西apply
会导致运行元循环评估器的技术问题,因为定义元循环评估器apply
将掩盖原语的定义。解决此问题的一种方法是重命名元循环 =apply= 以避免与原始过程的名称冲突。相反,我们假设我们已经通过
(define apply-in-underlying-scheme apply)
在定义 metacircular 之前保存了对底层 =apply= 的引用apply
。apply
这允许我们以不同的名称访问原始版本。
它指出apply-in-underlying-scheme
在apply
4.1.1 中。
总结:
,-> apply -> apply-primitive-procedure -> apply-in-underlying-scheme --.
'----------------------------------------------------------------------'
我想这不是递归。
我的理解有什么问题?
解决方案
Apply
表示对所有非特殊形式的函数应用(特殊形式在 中考虑eval
)。 Apply
是一个将永远完成的递归函数。
Apply
又细分为2种程序申请情况:
--实现语言的系统内部
这是在目标语言和用于实现目标语言(源语言)的语言之间进行转换的地方。
在这里,您需要评估每个参数(通过eval
)并将生成的对象转换为源语言中的类似对象,然后才能调用源语言的应用程序函数。对于某些参数,eval->apply
可能会发生递归。
--使用目标语言提供的组合方式以目标语言创建的组合。
在这种情况下,您还需要递归调用eval
每个参数并使用目标语言中的函数应用程序。在这种情况下,您不需要将结果转换为eval
源语言中的对象。
因此,在组合的情况下, in 中也存在递归apply
,但它是一种将完成的递归(函数应用函数是一个原始递归函数),因为您每次都评估一个较小的部分(运算符、操作数与完整的初始表达式) .
我认为您没有注意到这apply
是一个原始递归运算符,您担心它不会完成。
推荐阅读
- python - 将复数字符串转换为实数
- sql - SQL Server HASHBYTES 不同的值
- php - 请问如何在MySQL数据库代码下面解决这个问题
- vim - 如何让 vim 在他们的配对标签上显示行?
- r - 怎么刮在 R 中
- python - 为什么我无法访问应用程序内部 gitlab-ci 中定义的 env 变量?
- postgresql - 如何对json数组进行postgresql sequelize查询
- r - 如何使用 ggplot 包在 x 轴的文本之间添加空格?
- javascript - 在快速服务器的成员变量(类实例)之间传递数据的架构/方法
- python-3.x - 命令'KEYS *'如何影响redis内存管理?