我正在学习Scheme,我无法弄清楚我在这段代码中做错了什么:
(define (distance a b)
(define c 1)
(define loop
(lambda (a b c)
((if (<= c b)
(begin
(display (c (* a c)))
(newline)
(apply loop '(a b (+ c 1))))
'done)))))
我正在尝试制作一个速度和小时的程序,然后在单独的一行显示每小时行进的距离。当我在解释器中运行代码时,我得到一个空体错误:
宏扩展期间出错:空体#f
我正在使用Larceny解释器运行代码。
我重写了代码,从距离函数的主体调用内部函数循环,代码完美地工作。更新的代码:
(define (distance a b)
(define c 1)
(define (loop x y z)
(if (<= z y)
(begin
(display "Hour: ")
(display z)
(display " Speed: ")
(display x)
(display " Distance: ")
(display (* x z))
(newline)
(loop x y (+ z 1)))
'done))
(loop a b c))
似乎有一个遗失的身体。在Scheme中,lambda定义为
(lambda (args ...)
(define local-binding ...) ...
body ...)
在distance
c
和loop
是当地的定义,但没有身体。因此distance
不会对a
或b
做任何事情,如果它有效,它将总是返回一个未定义的值。例如。不是一个非常有用的程序。
当你修好了,你可能想看看My code signals the error “application: not a procedure” or “call to non procedure”