1

编写一个名为 'proc4' 的 Scheme 过程,它接受 2 个过程作为参数 (w,x) [注意 w 和 x 在给定两个数字作为参数时可以正常工作] 并返回一个接受 2 个数字的过程 (y,z ) 作为参数并返回应用于 y 和 z 时产生最大数字的过程(w 或 x)(即在 C++ 伪代码中 if ((ywz) > (yxz)) {return w; } else {return x;} )

所以我开始

(define proc4(lamdda (wx) (lambda yz)... 然后我想做 if 部分。像 (if (> (apply w (yz)) (apply x( wz))) 之类的东西) 但我不断收到错误.

我一直试图在互联网上寻求帮助,但到目前为止我所看到的一切对我来说都没有意义。

4

3 回答 3

2

您可以直接调用函数对象,而无需使用apply

(define (proc4 f g)
  (lambda (x y)
    (if (> (f x y) (g x y))
        f
        g)))
于 2012-11-13T17:08:14.193 回答
1

@ChrisJester-Young 回答的一些语法糖 - 您可以声明一个返回另一个过程的过程,如下所示:

(define ((proc4 f g) x y)
  (if (> (f x y) (g x y))
      f
      g))

在上面的代码中,第一个过程接收过程f和作为参数g,然后返回一个接收作为参数的x过程y。我们知道这一点f并且g是过程,因为它们在定义主体中的使用方式,但它们可以具有您想要的任何名称。当然,您可以按通常的方式调用该过程:

((proc4 + *) 10 20)
=> #<procedure:*>

这个例子的有趣之处在于,过程也可以作为参数传递(并作为值返回),您不需要apply它们,只需调用作为参数接收的过程,就像使用任何其他过程一样。另请注意,此问题的所有答案都是等效的,但我使用的速记语法可能不适用于所有解释器。

于 2012-11-13T18:24:00.410 回答
0

我无法理解这个(显然是家庭作业)问题,但我会这样做:

(define proc4
  (lambda (w x)
    (lambda (y z)
      (if (> (w y z) (x y z))
          w
          x))))
于 2012-11-13T17:10:58.320 回答