Josef Wolf <j...@raven.inka.de> writes:

> Hello,
>
> I am trying to work through the little schemer book. In order to make it
> easier to go through the examples, I've come up with the following macro:
>
>   ;;; Helper to visualize
>
>   (define-macro (disp exp)
>     (display exp)   (newline)
>     `(display ,exp)
>   ;  (newline)  (newline)
>   )
>
> This works great, except that when I uncomment the (newline) expressions,
> the result of the evaluation is omitted:
>
>   guile> (define-macro (disp exp)
>   ...   (display exp)   (newline)
>   ...   `(display ,exp)
>   ... ;  (newline)  (newline)
>   ... )
>   guile> (disp (+ 3 4)) (newline)
>   (+ 3 4)
>   7
>   guile> (define-macro (disp exp)
>   ...   (display exp)   (newline)
>   ...   `(display ,exp)
>   ...   (newline)  (newline)
>   ... )
>   guile> (disp (+ 3 4)) (newline)
>   (+ 3 4)
>   
>   
>   
>   guile>
>
> Any hints?

The body of a define-macro definition is supposed to return the code
that should be substituted in place of the original macro call.  With
the newlines there, the body returns *unspecified*, because that is what
(newline) returns.

Do you want those newlines to happen at macro-expansion time or eval
time?  If the latter (which I would guess), the code that you want is

(define-macro (disp exp)
  (display exp)   (newline)
  `(begin
     (display ,exp)
     (newline)  (newline)))

Regards,
        Neil


Reply via email to