编写一个名为'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)))但我不断收到错误。
我一直在努力寻求互联网上的帮助,但到目前为止我所看到的一切对我来说都没有意义。
答案 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))
在上面的代码中,第一个过程接收过程f
和g
作为参数,然后返回一个作为参数x
和y
接收的过程。我们知道f
和g
是程序,因为它们在定义的主体内使用的方式,但它们可以有你想要的任何名称。当然,您可以通常的方式调用该过程:
((proc4 + *) 10 20)
=> #<procedure:*>
此示例中的关注点是过程也可以作为参数传递(并作为值返回),您不需要apply
它们,只需调用过程像任何其他程序一样接收参数。另请注意,此问题的所有答案都是等效的,但我使用的简写语法可能并非在所有解释器中都可用。
答案 2 :(得分:0)
我无法理解这个(显然是家庭作业)的问题,但我会这样做:
(define proc4
(lambda (w x)
(lambda (y z)
(if (> (w y z) (x y z))
w
x))))