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 --.
'----------------------------------------------------------------------'