Scheme--程序如何将其他程序作为参数?

时间:2012-11-13 16:27:35

标签: scheme

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

所以我开始了

(定义proc4(lamdda(w x)(lambda y z)... 然后我想做if部分。就像是 (if(>(apply w(y z))(apply x(w z)))但我不断收到错误。

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

3 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

@ ChrisJester-Young答案的一些语法糖 - 你可以声明一个返回另一个程序的程序:

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

在上面的代码中,第一个过程接收过程fg作为参数,然后返回一个作为参数xy接收的过程。我们知道fg是程序,因为它们在定义的主体内使用的方式,但它们可以有你想要的任何名称。当然,您可以通常的方式调用该过程:

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

此示例中的关注点是过程也可以作为参数传递(并作为值返回),您不需要apply它们,只需调用过程像任何其他程序一样接收参数。另请注意,此问题的所有答案都是等效的,但我使用的简写语法可能并非在所有解释器中都可用。

答案 2 :(得分:0)

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

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