Ya, the documentation says: "The syntax of require-spec can be extended via define-require-syntax ... . The pre-defined forms (as exported by racket/base) are as follows:"
and then lists, among other things, 'rename-in' I think the 'as exported' is the closest thing to a clue to someone who doesn't know about how extensible syntax transformers work that the 'require' macro is going to look for these *bindings* not these *symbols*. Jay On Tue, Aug 3, 2010 at 12:25 PM, Shriram Krishnamurthi <[email protected]> wrote: > I see: each of these is a *separate* macro! That clarifies it. Thanks. > > On Tue, Aug 3, 2010 at 2:22 PM, Jay McCarthy <[email protected]> wrote: >> You didn't provide rename-in (etc). >> >> You need to provide all the require/provide transformers you want. >> >> Jay >> >> On Tue, Aug 3, 2010 at 12:13 PM, Shriram Krishnamurthi <[email protected]> >> wrote: >>> Let me see if I can reduce my problem to the simplest case. Here is a >>> program that works fine: >>> >>> ----- >>> #lang racket >>> (require (rename-in racket/tcp >>> (tcp-accept accept) >>> (tcp-listen listen))) >>> ----- >>> >>> (It's from the docs, and it works as you would expect. I only say all >>> this to say I've checked the syntax of this expression.) >>> >>> This is illegal in ASL: >>> >>> ----- >>> #lang s-exp lang/htdp-advanced >>> (require (rename-in racket/tcp >>> (tcp-accept accept) >>> (tcp-listen listen))) >>> ----- >>> >>> require: expected a module name as a string, a `lib' form, or a >>> `planet' form, found something else in: (rename-in racket/tcp >>> (tcp-accept accept) (tcp-listen listen)) >>> >>> [Same error if I use the (module ...) form at the REPL.] >>> >>> Let's say I want to give students access to require-on-steroids. So I >>> define this language (sk-test-lang.rkt): >>> >>> ----- >>> #lang racket >>> (require [except-in lang/htdp-advanced require]) >>> (provide require >>> [except-out (all-from-out lang/htdp-advanced)]) >>> ----- >>> >>> When I check syntax and highlight "require" on the provide line, the >>> arrow points to "racket". Great. >>> >>> Now I try to use this. First I'll do something simple (and you'll see >>> why in a moment): >>> >>> ----- >>> #lang s-exp "sk-test-lang.rkt" >>> (require "lib.rkt") >>> ----- >>> >>> This works fine, importing what lib.rkt provides. When I check >>> syntax, the "require" comes from "sk-test-lang.rkt". This hopefully >>> means that by transitivity, require comes from racket. >>> >>> So now I try this: >>> >>> ----- >>> #lang s-exp "sk-test-lang.rkt" >>> (require (rename-in racket/tcp >>> (tcp-accept accept) >>> (tcp-listen listen))) >>> ----- >>> >>> But I get >>> >>> rename-in: not a require sub-form in: (rename-in racket/tcp >>> (tcp-accept accept) (tcp-listen listen)) >>> >>> The thing that boggles my mind is that this error message is NEITHER >>> the one that you would get from racket itself (since this is not an >>> error in racket), NOR the one from ASL (since I've shown you the error >>> text above). >>> >>> So: >>> >>> 1. Where is require coming from? >>> >>> 2. How could I go about figuring this for myself? (The macro stepper >>> doesn't seem useful, or at least I don't see how to use it here.) >>> >>> 3. How do I fix my program? (-: >>> >>> Shriram >>> _________________________________________________ >>> For list-related administrative tasks: >>> http://lists.racket-lang.org/listinfo/users >>> >> >> >> >> -- >> Jay McCarthy <[email protected]> >> Assistant Professor / Brigham Young University >> http://teammccarthy.org/jay >> >> "The glory of God is Intelligence" - D&C 93 >> > -- Jay McCarthy <[email protected]> Assistant Professor / Brigham Young University http://teammccarthy.org/jay "The glory of God is Intelligence" - D&C 93 _________________________________________________ For list-related administrative tasks: http://lists.racket-lang.org/listinfo/users

