Scheme 应用、应用原语过程和应用于基础方案

Scheme 应用、应用原语过程和应用于基础方案,scheme,sicp,Scheme,Sicp,Apply在中定义为: 我引用了“4.1.4将评估员视为程序”中的应用基本程序的定义,如下所示: 因此,apply原语过程由底层方案中的apply实现 尽管如此,请参阅脚注: 在基础方案中应用是我们在前面章节中使用的应用过程。元循环评估器的apply程序 ([[4.1.1]])对该原语的工作进行建模。有两个不同的 名为apply的东西会在运行 元循环计算器,因为定义元循环计算器的 apply将屏蔽原语的定义。解决此问题的一种方法是重命名metacircular=apply=以避免与名称冲突 原始

Apply
在中定义为:

我引用了“4.1.4将评估员视为程序”中的
应用基本程序的定义,如下所示:

因此,
apply原语过程
由底层方案中的
apply实现

尽管如此,请参阅脚注:

在基础方案中应用
是我们在前面章节中使用的
应用
过程。元循环评估器的
apply
程序 ([[4.1.1]])对该原语的工作进行建模。有两个不同的 名为
apply
的东西会在运行 元循环计算器,因为定义元循环计算器的
apply
将屏蔽原语的定义。解决此问题的一种方法是重命名metacircular=apply=以避免与名称冲突 原始程序的一部分。相反,我们认为我们已经节省了 通过执行
(在基础方案应用中定义应用)

在定义元循环之前,应用
。这允许我们以不同的名称访问
apply
的原始版本

它说明基础方案中的
apply
是4.1.1中的
apply

总而言之:

 ,-> apply -> apply-primitive-procedure -> apply-in-underlying-scheme --.
 '----------------------------------------------------------------------'
我想这不是一个递归


我的理解有什么问题?

Apply
表示对非特殊形式的所有内容进行功能应用(特殊形式在
eval
中考虑)<代码>应用
是一个将永远完成的递归函数

应用
细分为两种程序应用情况:

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

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

在调用源语言的应用程序函数之前,您需要计算每个参数(通过
eval
)并将结果对象转换为源语言中的类似对象。对于某些参数,
eval->apply
的递归可能会发生

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

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

因此,在组合的情况下,
apply
中也有递归,但这是一种将结束的递归(函数application function是a),因为每次求值的片段较小(运算符、操作数与完整的初始表达式)


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

我想,“[w]我们假设在定义元循环
apply
”之前,我们已经保存了对底层
apply
[…]的引用,这一点非常清楚。最后,我明白了,
apply
并没有被神秘化为
eval
,而是被神秘化为
cons
list
,它们认为使用它是理所当然的@molbdniloI我不确定是
(在基础方案应用中定义应用)
,应用是方案的内置
应用
,还是
中定义的应用(定义(应用过程参数)
?哦,我明白了,我们没有将原语应用定义为eval,而是使用原语应用作为cons和list。
(define (apply-primitive-procedure proc args)
  (apply-in-underlying-scheme
   (primitive-implementation proc) args))
 ,-> apply -> apply-primitive-procedure -> apply-in-underlying-scheme --.
 '----------------------------------------------------------------------'