Scheme——过程如何将其他过程作为参数?

Scheme——过程如何将其他过程作为参数?,scheme,Scheme,编写一个名为“proc4”的Scheme过程,该过程将2个过程作为参数(w,x)[注意,当给定两个数字作为参数时,w和x可以正常工作] 并返回一个以2个数字(y,z)为参数的过程,并返回 当应用于y和z时产生最大数量的程序(w或x) (即在C++伪代码中((y w z)>(y x z)){返回W;}否则{返回x;}) 所以我开始 (定义过程4(lamdda(wx)(lambda y z)。。。 然后我想做if部分,比如 (如果(>(应用w(y z))(应用x(w z)))但我不断得到错误 我一直

编写一个名为“proc4”的Scheme过程,该过程将2个过程作为参数(w,x)[注意,当给定两个数字作为参数时,w和x可以正常工作] 并返回一个以2个数字(y,z)为参数的过程,并返回 当应用于y和z时产生最大数量的程序(w或x) (即在C++伪代码中((y w z)>(y x z)){返回W;}否则{返回x;})

所以我开始

(定义过程4(lamdda(wx)(lambda y z)。。。 然后我想做if部分,比如 (如果(>(应用w(y z))(应用x(w z)))但我不断得到错误


我一直试图在internet上找到帮助,但迄今为止我所看到的一切对我来说都没有意义。

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

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

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

(define proc4
  (lambda (w x)
    (lambda (y z)
      (if (> (w y z) (x y z))
          w
          x))))

@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:*>
((proc4+*)10 20)
=> #

本例中的重点是,过程也可以作为参数传递(并作为值返回),您不需要应用它们,只需像调用任何其他过程一样调用作为参数接收的过程即可。还要注意,这个问题的所有答案都是等效的,但我使用的简写语法可能无法在所有口译员中使用。

+1我喜欢您的答案,但我觉得有必要指出,尽管有许多Scheme实现支持,但该语法不是标准Scheme,因此它可能适用于OP.@ChrisJester-Young,谢谢!我在最后添加了一个注释来澄清这一点。顺便说一句,您已经在C/C++中看到了这一点。系统库qsort将函数作为参数。请看;这是调用的第四个参数。so将函数作为参数传递对您来说并不奇怪。