summary refs log blame commit diff stats
path: root/tests/macros/tmacros1.nim
blob: 706281d133cf6d5b03b2f07d9ef0f92036ca0eb5 (plain) (tree)
1
2
3
4
5
6
7
8
9
10
           



                              




                  
                                               
                    



                                           
                     

                                                     
                                    
                                                                       
                                          
                                              
                                         
                                   






                                      


















                                          











                                     
discard """
  output: '''Got: 'nnkCall' hi
{a}
{b}
{a, b}'''
"""

import
  macros, strutils

macro outterMacro*(n, blck: untyped): untyped =
  let n = callsite()
  var j : string = "hi"
  proc innerProc(i: int): string =
    echo "Using arg ! " & n.repr
    result = "Got: '" & $n.kind & "' " & $j
  var callNode = n[0]
  expectKind(n, NimNodeKind.nnkCall)
  if n.len != 3 or n[1].kind != NimNodeKind.nnkIdent:
    error("Macro " & callNode.repr &
      " requires the ident passed as parameter (eg: " & callNode.repr &
      "(the_name_you_want)): statements.")
  result = newNimNode(NimNodeKind.nnkStmtList)
  var ass : NimNode = newNimNode(nnkAsgn)
  ass.add(newIdentNode(n[1].ident))
  ass.add(newStrLitNode(innerProc(4)))
  result.add(ass)

var str: string
outterMacro(str):
  "hellow"
echo str

type E = enum a b
macro enumerators1(): set[E] = newLit({a})

macro enumerators2(): set[E] =
  return newLit({b})

macro enumerators3(): set[E] =
  result = newLit({E.low .. E.high})

var myEnums: set[E]


myEnums = enumerators1()
echo myEnums
myEnums = enumerators2()
echo myEnums
myEnums = enumerators3()
echo myEnums

#10751

type Tuple = tuple
  a: string
  b: int

macro foo(t: static Tuple): untyped =
  doAssert t.a == "foo"
  doAssert t.b == 12345

foo((a: "foo", b: 12345))