Scheme 定义一个 lambda
Scheme define a lambda
我有以下函数来计算方案中函数从 A
到 B
的总和:
(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)))
现在您已经拆分创建变量 self
和 inc
以及创建闭包的 lambda 语法。这与您在问题中所写的完全相同。
根据替换规则,您应该能够用变量定义中的表达式替换变量:
(SUM self 0 inc 5)
;; is the same as
(SUM (lambda (x)
x)
0
(lambda (x)
(+ x 1))
5)
请注意,较早的 Scheme 报告 ,但 SUM
和 sum
在后来的报告中是两个不同的名称。对变量使用小写 space 字母也很常见,正如我之前展示的那样,过程名称是变量。这就是当您为变量 list
定义值时过程 list
停止工作的原因。一个名字space来统治他们。
我有以下函数来计算方案中函数从 A
到 B
的总和:
(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)))
现在您已经拆分创建变量 self
和 inc
以及创建闭包的 lambda 语法。这与您在问题中所写的完全相同。
根据替换规则,您应该能够用变量定义中的表达式替换变量:
(SUM self 0 inc 5)
;; is the same as
(SUM (lambda (x)
x)
0
(lambda (x)
(+ x 1))
5)
请注意,较早的 Scheme 报告 SUM
和 sum
在后来的报告中是两个不同的名称。对变量使用小写 space 字母也很常见,正如我之前展示的那样,过程名称是变量。这就是当您为变量 list
定义值时过程 list
停止工作的原因。一个名字space来统治他们。