Scheme 定义一个 lambda

Scheme define a lambda

我有以下函数来计算方案中函数从 AB 的总和:

(define (SUM summation-function A increment-function B)
  (if (> A B)
      0
      (+ (summation-function A)
         (SUM
           summation-function (increment-function A) increment-function B))))

目前我在调用函数前定义了两个过程,例如:

(define (self x) x)     ; do nothing, just sum itself
(define (inc x) (+ x 1)); normal +1 increment
(SUM self 0 inc 5)

我如何才能在调用本身中定义过程,例如:

; in pseudocode
(SUM, lambda x: x, 0, lambda x: (+ x 1), 5)

通常,我们会像这样使用 lambda

(SUM (lambda (x) x) 0 (lambda (x) (+ x 1)) 5)

特别是对于上面的例子,一些 Scheme 解释器已经提供了内置的过程来精确地做你想要的,我们可以简单地说:

(SUM identity 0 add1 5)

您可以这样重写您的定义:

(define self 
  (lambda (x) 
    x))

(define inc 
  (lambda (x) 
    (+ x 1)))

现在您已经拆分创建变量 selfinc 以及创建闭包的 lambda 语法。这与您在问题中所写的完全相同。

根据替换规则,您应该能够用变量定义中的表达式替换变量:

(SUM self 0 inc 5)

;; is the same as
(SUM (lambda (x) 
        x)
     0
     (lambda (x) 
        (+ x 1))
     5)

请注意,较早的 Scheme 报告 ,但 SUMsum 在后来的报告中是两个不同的名称。对变量使用小写 space 字母也很常见,正如我之前展示的那样,过程名称是变量。这就是当您为变量 list 定义值时过程 list 停止工作的原因。一个名字space来统治他们。