Just for fun, if you want to be a little bit naughty, you can define
a custom #%top transformer that will make unbound identifiers that
are fully qualified automatically resolve to their imported values.
Just do a little bit of processing on the unbound identifiers:

  #lang racket

  (require (for-syntax racket/list
                       racket/match
                       racket/string
                       syntax/parse))

  (define-syntax #%top
    (syntax-parser
      [(_ . id:id)
       (define id-str (symbol->string (syntax-e #'id)))
       (define components (string-split id-str "/"))
       (match-define-values (mod-components (list mod-id-str))
                            (split-at-right components 1))
       (define mod-path (string-join mod-components "/"))
       (with-syntax ([mod-path-id (string->symbol mod-path)]
                     [mod-id (datum->syntax #'id (string->symbol mod-id-str))])
         (syntax-local-introduce
          (syntax-local-lift-require
           (syntax-local-introduce #'mod-path-id)
           (syntax-local-introduce #'mod-id))))]))

Now you can do something like this:

  > (racket/base/list 1 2 3)
  '(1 2 3)

Unfortunately, this won’t work for macros because unbound identifiers
handled by #%top cannot resolve to a macro identifier (more
specifically, the #%app introduced puts the produced syntax in an
expression context). I’m not sure if there’s a way around that, and
the explicit use of some sort of require transformer is definitely
much nicer. Just a little bit fun to see how easy it is to do
something like this. ;)

> On Jun 29, 2016, at 6:05 AM, Shakna Israel <s4b...@gmail.com> wrote:
> 
> I'm trying to introduce an implicit binding for require.
> 
> One of the features I love about Python, is the namespace binding.
> 
> import sys
> 
> sys.stdout.write("Sweet")
> 
> I know this can also be accomplished with require by specifying a prefix-in, 
> or a prefix-out with a local-require.
> 
> However, I want a require that does that for me.
> 
> (require racket/base)
> (racket/base:println "It works!")
> 
> Figuring the namespace mangling is simple enough.
> 
> However, for this to work, I think I need a require transformer, but I'm at a 
> loss. The only example I see can mess with the module path, but not the 
> symbols it exposes.
> 
> Any pointers?
> 
> -- 
> You received this message because you are subscribed to the Google Groups 
> "Racket Users" group.
> To unsubscribe from this group and stop receiving emails from it, send an 
> email to racket-users+unsubscr...@googlegroups.com.
> For more options, visit https://groups.google.com/d/optout.

-- 
You received this message because you are subscribed to the Google Groups 
"Racket Users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to racket-users+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to