lambda - 使用 lambda 的方案

标签 lambda scheme

我在方案中有一段使用多个 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,您可以执行以下操作:

  • 将过程定义从此形式:(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))

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

关于lambda - 使用 lambda 的方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10860734/

相关文章:

c++ - 编译器如何以不同于常规函数的方式对待 lambda?

python - 请解释一下 Python 中的 Lambda 表达式用法

java - 避免 VM 启动时使用的类使用 lambda 和流

macros - 如何在 Racket 中使用宏重命名过程?

方案 - 从参数顺序运行两个过程?

lambda - Scheme - Lambda 作为一个坏的函数对象

c++ - 将 std::any_of 与 lambda 一起调用重载相等运算符

java - 在消费者方法中创建的 Lambda Collect 元素

for-loop - 在 Racket /方案中展开 'for' 循环的宏?

function - Racket : expected: procedure?