【发布时间】:2018-02-18 08:36:54
【问题描述】:
我是 Racket 的初学者,以下代码来自华盛顿大学的 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。这是怎么回事?
【问题讨论】:
-
我很确定
(define s "hello")只是定义了一个变量s(如"hello")。这不是一个函数。同样,three将绑定到(pow2 3)的结果。 -
我的错。我不是在问s。我只是想知道三个将如何执行。 (三 2) 返回 9 但为什么呢?那2去哪儿了?
-
请注意
(define (id id id) expression)只是(define id (lambda (id id) expression))的缩写。 -
有一点值得知道,
(define (x ...) ...)是 Racket 中(define x (lambda (...) ...)的语法简写(以及更普遍的 Scheme 中)。所以pow2可以定义为(define (pow2 x) (lambda (y) (pow1 x y))),这可能更清楚:pow2是一个返回函数的函数。 -
大伙儿请检查编辑。
标签: lambda functional-programming lisp racket