【问题标题】:scheme using lambda使用 lambda 的方案
【发布时间】:2012-09-15 11:22:03
【问题描述】:

我的方案中有一段代码使用了几个 lambda。它基本上返回一个中间的数字。

(define foo
  (lambda (x)
    (letrec
      ((h (lambda (y z)
        (cond
          ((null? y) 'undefined)
          ((null? (cdr y)) (car z))
          (else (h (cddr y) (cdr z)))))))
  ((lambda (y) (h y y)) x))))

我必须重写代码,使其不使用任何 lambda。我该怎么做?

【问题讨论】:

    标签: lambda scheme


    【解决方案1】:

    要删除表达式中的所有 lambda,您可以这样做:

    • 将过程定义从此形式:(define f (lambda (x) x)) 替换为等效形式:(define (f x) x)
    • letrec 表达式替换为内部定义
    • 用另一个内部定义替换最后一行的lambda,命名并在最后调用它
    • 更简单:注意你实际上并不需要最后一个lambda,这相当于直接调用(h x x)

    在连续应用上述每个替换后,过程最终如下所示:

    (define (foo x)
      (define (h y z)
        (cond
          ((null? y) 'undefined)
          ((null? (cdr y)) (car z))
          (else (h (cddr y) (cdr z)))))
      (h x x))
    

    请注意,lambdas 并没有真正被消除,它们仍然在幕后 - 隐藏在一些语法糖后面。

    【讨论】:

      【解决方案2】:

      这取决于上下文和您所学的内容。如果您发布更多上下文,您很可能会得到更好的答案。

      但是,首先要注意,

      (define (foo x) (+ x 1)) 
      

      等价于

      (define foo (lambda (x) (+ x 1))).
      

      要摆脱letrec,将其重写为内部定义。

      【讨论】:

      • 谢谢,我已经设法将代码简化为:(define (foo x) (letrec ((h (lambda (y z) (cond ((null?y) 'undefined) ((null? (cdr y)) (car z)) (else (h (cddr y) (cdr z))))))) (h x x))) 但我不确定如何删除最后一个 lambda(也许是一些内部定义?)
      猜你喜欢
      • 2023-03-26
      • 1970-01-01
      • 2018-05-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-26
      • 1970-01-01
      相关资源
      最近更新 更多