mirror of
https://github.com/nim-lang/Nim.git
synced 2026-01-03 19:52:36 +00:00
63 lines
1.2 KiB
Nim
63 lines
1.2 KiB
Nim
discard """
|
|
output: '''Got: 'nnkCall' hi
|
|
{a}
|
|
{b}
|
|
{a, b}'''
|
|
"""
|
|
|
|
import macros
|
|
|
|
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))
|