The answer is roughly "that is not possible". In general, the meaning of a macro cannot be represented by a run-time value (but see below), so if you want to do something reflection-based with macros, you probably need to change your design to deal with terms (represented by syntax objects) instead of values.

Actually, it does make sense to talk about the run-time value that corresponds to a macro in the case of identifier macros---macros that can be used like variables. For example, if you use 'contract-out' to provide a variable 'f' with a contract, it actually creates an auxiliary identifier macro and provides that as 'f'. The expansion of the provided 'f' macro fills in the negative blame part of the contract with the module where the expansion occurred and applies the contract to the original 'f' variable.

That's the situation handled by the extension of 'dynamic-require' to macros. So doing

  (dynamic-require mod macro-name)

is approximately the same as

  (parameterize ((current-namespace (make-empty-base-namespace)))
    (namespace-require mod)
    (eval macro-name))

(except that it uses 'namespace-attach-module' instead of just 'namespace-require'). If 'macro-name' happens to be a macro that acts like a variable, then 'eval' produces a value. Otherwise, if it's something like 'define' or 'match' or 'for/list', you get an error, and it's exactly the same error you would get if you wrote something like

  #lang racket
  for/list

What to do next depends on what you want to do with the macros.

Ryan


On 02/01/2013 02:57 AM, Dan Grossman wrote:

Cody and I would love an answer to this question from 1.5 months ago if
anybody can point us in the right direction and/or ask us to clarify the
question.  Or if the answer is "that is not possible" then we'll do
something else.

Much thanks!

--Dan

On Mon, Dec 17, 2012 at 9:20 PM, Cody Schroeder <codeblac...@gmail.com
<mailto:codeblac...@gmail.com>> wrote:

       I'm in a position that I would like to use dynamic-require
    
<http://docs.racket-lang.org/reference/Module_Names_and_Loading.html#(def._((quote._~23~25kernel)._dynamic-require))>
 to
    gain access to all of the provides in a module.  This is quite
    straightforward for normal procedures, but I also want this to
    include syntax.  However, I get this error when trying to
    dynamically require the blah macro from my test module:

    (dynamic-require "test.rkt" 'blah)
    blah: use does not match pattern: (blah body) in: blah

       From the spec, it says that "If the module exports provided as
    syntax, then a use of the binding is expanded and evaluated in a
    fresh namespace to which the module is attached" when using
    dynamic-require.  I don't understand how it's being used, though.

       Is there a way to use dynamic-require how I want?  Is there a
    better way?
    Cody

    ____________________
       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

Reply via email to