apply, apply-primitive-procedure 和 apply-in-underlying-scheme
apply, apply-primitive-procedure and apply-in-underlying-scheme
Apply
在 4.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
是一个原始递归运算符,你担心它不会完成。
Apply
在 4.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 theapply
procedure we have used in earlier chapters. The metacircular evaluator'sapply
procedure ([[4.1.1]]) models the working of this primitive. Having two different things calledapply
leads to a technical problem in running the metacircular evaluator, because defining the metacircular evaluator'sapply
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 metacircularapply
. This allows us to access the original version ofapply
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
是一个原始递归运算符,你担心它不会完成。