Skip to content

Macro import/export #3114

Closed
Closed

Description

@eholk

We need a way to export macros from modules and import them in other modules.

Currently we either prepend a string of macro definitions to every file, such as with debug!, error!, etc., or we just copy and paste the macros we need. This second approach leads to code duplication and lots of subtly different implementations.

As a temporary workaround, we could probably use include!.

Activity

  1. eholk commented on Aug 6, 2012

    @eholk
    ContributorAuthor

    This would provide a nice solution for #2247 as well.

  2. brson commented on Aug 6, 2012

    @brson
    Contributor

    Wishfully putting this on the 0.4 milestone.

  3. graydon commented on Mar 25, 2013

    @graydon
    Contributor

    non-critical for 0.6, de-milestoning

  4. brson commented on Apr 16, 2013

    @brson
    Contributor

    Nominating this for a milestone.

  5. pnkfelix commented on May 6, 2013

    @pnkfelix
    Contributor

    Does include! actually even function as a work-around for this problem? My brief experiments with using that did not seem to bear fruit.

  6. isaacaggrey commented on May 6, 2013

    @isaacaggrey

    @pnkfelix - I can't recall why, but I had to wrap the include! in a function -- see example use case in a bug I am working on #4219 (comment)

  7. pnkfelix commented on May 6, 2013

    @pnkfelix
    Contributor

    @isaacaggrey but in that case the scope of the macro will be limited to that function, yes? (At least, that matches my intuition about the usual intentions for lexically-scoped macros.) So that seems like a problem.

  8. isaacaggrey commented on May 6, 2013

    @isaacaggrey

    @pnkfelix IIUC you would think so, but it seems to not limit the macro's scope to the function. If you are trying to import macros from a separate file (in my case, integer-templates.rs), then I can call the imported macros (in my case, int_template!) anywhere in the current file (even outside of the function).

    I would link to a gist, but my Rust build is currently not working.

  9. pnkfelix commented on May 7, 2013

    @pnkfelix
    Contributor

    Hmm, I see that this pattern certainly used to work in the code base, but we do not seem to use that pattern any more; @jbclements changed it in SHA: ca147a0

    He replaced it with some #[macro_escape] attribute. See also commit SHA: 08b6057 which has a log message that explains the new scoping rules for macros (and also #5120 )

    (Let me see if I can use that information to get include to work on macro definitions.)

  10. pnkfelix commented on May 7, 2013

    @pnkfelix
    Contributor

    Or rather, the whole point is to avoid using include and instead use the modules themselves. Which is the original point of this ticket anyway. :)

  11. isaacaggrey commented on May 7, 2013

    @isaacaggrey

    Thanks for the update, @pnkfelix . I hadn't followed the last couple months of macro changes and didn't even realize that hack didn't work anymore!

    I suppose I have the same question/issue as you then now. :)

  12. pcwalton commented on May 16, 2013

    @pcwalton
    Contributor

    I do not believe this is backwards incompatible.

  13. graydon commented on Jun 13, 2013

    @graydon
    Contributor

    accepted for feature-complete milestone

  14. pnkfelix commented on Aug 14, 2013

    @pnkfelix
    Contributor

    visiting for triage, email 2013-08-05.

    I've looked at this in the past. Its something I'd like to see happen, especially coming from my experience working with Racket. (I'm not sure how many of the lessons/caveats from the Scheme community carry over here, though ... it depends in part on whether Rust has an analogue to let{,*,rec}-syntax or not.)

  15. alexcrichton commented on Nov 29, 2013

    @alexcrichton
    Member

    As pointed out in #10723, it may be possible to place #[macro_escape] at the top of a crate to let all the macros get serialized to the crate metadata. This would remove any need for importing/exporting macros, although it's not as general of a solution as having a use statement import a macro.

  16. pnkfelix commented on Jan 16, 2014

    @pnkfelix
    Contributor

    Accepted for P-low.

  17. sfackler commented on Jan 25, 2014

    @sfackler
    Member

    This was done in #11151.

  18. alexcrichton commented on Jan 25, 2014

    @alexcrichton
    Member

    Hurray! nice work @sfackler!

  19. added a commit that references this issue on May 15, 2021
  20. added a commit that references this issue on Oct 21, 2023
  21. added a commit that references this issue on Aug 21, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    A-syntaxextArea: Syntax extensionsP-lowLow priority

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions