Hello,

I'm currently doing some more advanced "macro magic", and have stumbled upon a 
weird error:
    
    
    type
      TokenKind* = enum
        rtLParen, rtRParen     # ()
        rtLBracket, rtRBracket # []
        rtLBrace, rtRBrace     # {}
      Token* = object
        kind: TokenKind
    
    template token(name: untyped, stmts: untyped): untyped {.dirty.} =
      proc name(input: string): Token =
        stmts
    
    template literal(lit: string, kind: untyped): untyped {.dirty.} =
      if input == lit: result = Token(kind: kind)
    
    token lParen:
      literal("(", rtLParen)
    
    
    Run

For some reason the compiler fails: 
    
    
    ../src/rod/tokenizer.nim(24, 39) Error: undeclared field: 'rtLParen'
    
    
    Run

Even though `rtLParen` clearly is defined.

I want to achieve a template that expands like so: 
    
    
    literal("(", rtLParen)
    # into:
    if input == "(": result = Token(kind: rtLParen)
    
    literal(")" rtRParen)
    # into:
    if input == ")": result = Token(kind: rtRParen)
    
    # etc
    
    
    Run

What am I doing wrong?

Reply via email to