我是Racket的初学者,以下代码来自华盛顿大学的球拍编程课程 -
(define s "hello")
(define (pow1 x y)
(if(= y 0)
1
(* x (pow1( - y 1)))))
(define pow2
(lambda(x)
(lambda(y)
(pow1 x y))))
(define three (pow2 3))
根据我的阅读,对于要在Racket中传递的参数,格式应为 -
(define (id id id) expression)
为什么三个不适用?三者究竟是如何运作的?
EDIT1 - 当我运行(pow1 1 2)
时,我收到错误消息,指出给定的参数数量为1,当我写(pow1 2 3 4)
时,它表示参数数量为3。发生了什么事?
答案 0 :(得分:3)
(define pow2
(lambda(x)
(lambda(y)
(pow1 x y))))
这将pow2
定义为某种lambda
表达式。
(define three (pow2 3))
这将three
定义为(pow2 3)
的结果。什么是(pow2 3)
?好吧,让我们内联pow2
:
(pow2 3)
; inline pow2
((lambda(x)
(lambda(y)
(pow1 x y)))
3)
将lambda(参数x
)应用于值(例如3
)会替换lambda主体中的值(即我们可以将x
替换为{{ 1}}):
3
现在这是(lambda(y)
(pow1 3 y))
的价值。
做three
这样做:
(three 2)
......从那以后只需拨打(three 2)
; inline three
((lambda(y)
(pow1 3 y))
2)
; apply lambda
(pow1 3 2)
。