matt_m
matt_m

Reputation: 3

Error during macro expansion: Empty body #f

I'm learning Scheme and I can't figure out what I did wrong with this code:

(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)))))

I'm trying to make a program that takes in speed and hours, then displays the distance traveled for each hour on a separate line. When I run the code in an interpreter, I get an empty body error:

Error during macro expansion: Empty body #f

I'm running the code with the Larceny interpreter.

edit:

I rewrote the code to call the inside function loop from the body of the distance function and the code works perfectly. Updated code:

(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))

Upvotes: 0

Views: 527

Answers (1)

Sylwester
Sylwester

Reputation: 48745

There seems to be a missing body. In Scheme a lambda is defined as

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

In distance c and loop are local defines, but there is no body. Thus distance doesn't do anything with a or b and if it worked it would always return an undefined value. eg. not a very useful procedure.

When you'e fixed that you might want to have a look at My code signals the error “application: not a procedure” or “call to non procedure”

Upvotes: 1

Related Questions