Syntax don';不理解SICP中的方案程序

Syntax don';不理解SICP中的方案程序,syntax,scheme,sicp,Syntax,Scheme,Sicp,我正在研究SICP第1章“1.3以更高的顺序制定抽象” 程序” 我(目前)遇到的问题是,程序模板(如下所示)通过将其“槽”转换为形式参数而转换为实际程序(如下所示)。我不明白的是,在转换过程的末尾(就在结束括号之前),他们在哪里得到了下一个b 当然是模板中的b 无论如何,这是模板 (define (<name> a b) (if (> a b) 0 (+ (<term> a) (<name> (<nex

我正在研究SICP第1章“1.3以更高的顺序制定抽象” 程序”

我(目前)遇到的问题是,程序模板(如下所示)通过将其“槽”转换为形式参数而转换为实际程序(如下所示)。我不明白的是,在转换过程的末尾(就在结束括号之前),他们在哪里得到了下一个b

当然是模板中的b

无论如何,这是模板

(define (<name> a b)
  (if (> a b)
      0
      (+ (<term> a)
         (<name> (<next> a) b))))

这里要理解的关键洞见是,在Scheme中,我们可以像传递数字一样轻松地将函数作为参数传递给另一个函数。请注意,模板不完整,应为:

(define (<name> <term> a <next> b)
  (if (> a b)
      0
      (+ (<term> a)
         (<name> <term> (<next> a) <next> b))))
还请注意,
(next a)
实际上是将
next
过程应用于
a
参数,并将该应用程序的结果传递给递归-事实上,这是调用之间唯一变化的值,它有效地将递归推进到
(>a b)时
变为false。这与倒数第二个参数中发生的情况不同,这里我们传递的是函数本身,而不是应用它的结果。例如,您可以调用
sum
过程来添加
1
10
之间的所有数字:

(sum identity 1 add1 10) ; <term> is `identity` and <next> is `add1`
=> 55
(总和标识1加10);是'identity'和'add1'`
=> 55

“…(下一个a)实际上是在应用下一个过程…这不同于…传递下一个,函数本身…”伙计们欢呼道。你是一个prince@user3435279没问题!如果这个答案对您有帮助,请不要忘记点击左边的复选标记;)
    (sum            term             (next a)     next             b)
     ^              ^                ^            ^                ^
     function call  "term" function  next number  "next" function  upper limit
(sum identity 1 add1 10) ; <term> is `identity` and <next> is `add1`
=> 55