宏扩展期间出错:空体#f

时间:2018-02-28 09:56:48

标签: scheme

我正在学习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))

1 个答案:

答案 0 :(得分:1)

似乎有一个遗失的身体。在Scheme中,lambda定义为

(lambda (args ...)
  (define local-binding ...) ...
  body ...)

distance cloop是本地定义,但没有正文。因此distanceab没有任何作用,如果有效,它将始终返回未定义的值。例如。不是一个非常有用的程序。

当您修复时,您可能需要查看My code signals the error “application: not a procedure” or “call to non procedure”