[racket] define-values/invoke-unit not working when generated by a macro

From: Nick Main (david.nick.main at gmail.com)
Date: Tue Aug 6 17:11:26 EDT 2013

I am attempting to write a macro to clean up the use
of define-values/invoke-unit and finding some confusing behavior.

My macros module is:

#lang racket
(provide (all-defined-out))

(define-signature dog^

(define mutt@
    (export dog^)
    (define (woof) (printf "Wuf !!\n"))
    (define (bark) (printf "RarRarRar !!\n"))))

(define-syntax use-dog
  (syntax-rules ()
    ([_ dog-unit]
     (define-values/invoke-unit dog-unit
       (export dog^)))))

..and the module using it is:

#lang racket
(require "macros.rkt")

(define-values/invoke-unit mutt@
  (export dog^))

(use-dog mutt@)


I am trying to make the "use-dog" macro expand to the equivalent
define-values/invoke-unit form as shown.
If I comment out the define-value/invoke-unit form I get warning about
unbound identifier woof - implying that the (use-dog dog^) form is not
doing the job. Moreover, the second module as it stands does not give a
warning about duplicate definitions for woof or bark (as it does if I
duplicate the define-values/invoke-unit form) - further indicating the
non-action of use-dog.

The macro stepper shows use-dog expand exactly as expected, but it then
seems to be ignored without any warnings.

Is there something I am misunderstanding here, or is this a bug ?
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.racket-lang.org/users/archive/attachments/20130806/e2462b85/attachment-0001.html>

Posted on the users mailing list.