【问题标题】:Scheme define a lambda方案定义一个 lambda
【发布时间】:2021-04-28 21:39:46
【问题描述】:

我有以下函数来计算方案中函数从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)

【问题讨论】:

    标签: scheme lisp


    【解决方案1】:

    你可以像这样重写你的定义:

    (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 报告 wasn't case sensitive,但 SUMsum 在以后的报告中是两个不同的名称。变量使用小空格字母也很常见,正如我之前所展示的,过程名称是变量。这就是为什么当您为变量list 定义一个值时过程list 停止工作的原因。一个命名空间来统治它们。

    【讨论】:

      【解决方案2】:

      通常,我们会像这样使用lambdas:

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

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

      (SUM identity 0 add1 5)
      

      【讨论】:

        猜你喜欢
        • 2011-02-26
        • 2014-05-30
        • 1970-01-01
        • 1970-01-01
        • 2018-06-23
        • 2018-05-17
        • 1970-01-01
        • 2020-08-27
        • 1970-01-01
        相关资源
        最近更新 更多