Late bindings example for an interface:
    
    
    # File ex_macro.nim
    import macros
    
    type MyBinaryFunc* = enum
      Add
      Mul
      Equal
    
    # Here "myAdd", "myMul" and "myEqual" are not visible in this scope
    # so we need late bindings
    
    let Mapping* {.compileTime.} = [
      Add: ident"myAdd",
      Mul: ident"myMul",
      Equal: ident"myEqual"
    ]
    
    
    Run
    
    
    import ./ex_macro
    import macros
    
    proc myAdd(a, b: int): int =
      a + b
    
    proc myMul(a, b: int): int =
      a * b
    
    proc myEqual(a, b: int): bool =
      a == b
    
    macro dispatch(kind: static MyBinaryFunc, a, b: int): untyped =
      result = newCall(Mapping[kind], a, b)
    
    
    echo dispatch(Add, 2, 3)
    echo dispatch(Mul, 2, 3)
    echo dispatch(Equal, 2, 3)
    
    
    Run

Reply via email to