I think the problem is with `process-import/export` in "collects/racket/private/unit-compiletime.rkt".
If you change (do-prefix (add-prefix id) #'pid) to (add-prefix (do-prefix id #'pid)) then it looks like the tests still pass, and your examples work more as expected. I'm not sure it's as simple as that; can you take a closer look there? At Fri, 9 May 2014 16:39:34 -0400 (EDT), [email protected] wrote: > I've been digging in to this some more, and it seems that the prefix form > works > backwards on a sig-spec, for example: > > (define-signature a^ (a)) > (define-signature dcc^ ((open (prefix d: (prefix c: (prefix c: a^)))))) > (define d@ (unit (import dcc^) (export) c:c:d:a)) > > (unit (import) > (export (prefix d: (prefix c: (prefix c: a^)))) > (define c:c:d:a 5)) > > This makes some sort of sense, I suppose, but it doesn't really match what > the > docs seem to say. > > On the other hand rename does seem to work in expected way when used by > itself: > > (define-signature da^ > ((open (rename (rename (rename a^ (b a)) (c b)) (d c))))) > (unit (import da^) (export) d) > (unit (import (rename (rename (rename a^ (b a)) (c b)) (d c))) (export) d) > > When I try to nest different combinations of rename and prefix together, > however, I get the strange behavior I was experiencing yesterday, and I > cannot > figure out how to correctly reason about what the resulting bindings should > be. > > Thanks > Dan > > > ----- Original Message ----- > From: [email protected] > To: [email protected] > Sent: Thursday, May 8, 2014 4:56:52 PM GMT -05:00 US/Canada Eastern > Subject: [racket] prefix/rename for signatures in unit and define-signature > forms > > I'm trying to make sense of how prefix/rename work for signatures, but in > trying to run some examples the actual implementation doesn't seem to match > either my intuition or the documentation. > > For example I have the following simple signature: > > (define-signature a^ (a)) > > I then try to build a new signature from a^ with a combination of open and > prefix/rename. > > (define-signature b-bad^ > ((open (prefix x: (rename (prefix y: a^) (q y:a)))))) > > This example, however, gives the error: > "open: listed identifier not present in signature specification in: x:y:a" > > I'm not sure I understand this since it appears as though prefixing x: comes > before the renaming, but I would have though that first y: is prefixed to a, > so > that y:a is in the signature which can then be renamed q. So in the end the > only variable in the signature should be x:q. > > Attempting the same in a unit form gives a similar error: > > (define u-bad > (unit (import (prefix x: (rename (prefix y: a^) (q y:a)))) > (export) > x:q)) > "unit: listed identifier not present in signature specification in: x:y:a" > > > If I change the prefix x: to y: things seem to work for some reason. > > (define-signature b-good^ > ((open (prefix y: (rename (prefix y: a^) (q y:a)))))) > > In this case, I still expect the variable in the signature to be something > like > y:q, but trying a similar renaming in a unit form fails: > > (define u-bad2 > (unit (import (prefix y: (rename (prefix y: a^) (q y:a)))) > (export) > y:q)) > > With the error: > "y:q: unbound identifier in module in: y:q" > > while the following does work > > (define u-good > (unit (import (prefix y: (rename (prefix y: a^) (q y:a)))) > (export) > q)) > > > Am I misunderstanding something obvious about the way that the > renaming/prefixing should be taking place on the level of a signature or unit > import/export clause? The results I'm seeing are completely unintuitive to me > and the documentation doesn't seem to clarify this for me. > > Thanks > Dan > ____________________ > Racket Users list: > http://lists.racket-lang.org/users > ____________________ > Racket Users list: > http://lists.racket-lang.org/users ____________________ Racket Users list: http://lists.racket-lang.org/users

