123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129 |
- import macros
- block: # test usage
- macro modify(sec) =
- result = copy sec
- result[0][0] = ident(repr(result[0][0]) & "Modified")
- block:
- let foo {.modify.} = 3
- doAssert fooModified == 3
- block: # in section
- let
- a = 1
- b {.modify.} = 2
- c = 3
- doAssert (a, bModified, c) == (1, 2, 3)
- block: # with single argument
- macro appendToName(name: static string, sec) =
- result = sec
- result[0][0] = ident(repr(result[0][0]) & name)
- block:
- let foo {.appendToName: "Bar".} = 3
- doAssert fooBar == 3
- block:
- let
- a = 1
- b {.appendToName("").} = 2
- c = 3
- doAssert (a, b, c) == (1, 2, 3)
- macro appendToNameAndAdd(name: static string, incr: static int, sec) =
- result = sec
- result[0][0] = ident(repr(result[0][0]) & name)
- result[0][2] = infix(result[0][2], "+", newLit(incr))
- block: # with multiple arguments
- block:
- let foo {.appendToNameAndAdd("Bar", 5).} = 3
- doAssert fooBar == 8
- block:
- let
- a = 1
- b {.appendToNameAndAdd("", 15).} = 2
- c = 3
- doAssert (a, b, c) == (1, 17, 3)
- block: # in other kinds of sections
- block:
- const
- a = 1
- b {.appendToNameAndAdd("", 15).} = 2
- c = 3
- doAssert (a, b, c) == (1, 17, 3)
- doAssert static(b) == b
- block:
- var
- a = 1
- b {.appendToNameAndAdd("", 15).} = 2
- c = 3
- doAssert (a, b, c) == (1, 17, 3)
- b += a
- c += b
- doAssert (a, b, c) == (1, 18, 21)
- block: # with other pragmas
- macro appendToNameAndAdd(name: static string, incr, sec) =
- result = sec
- result[0][0][0] = ident(repr(result[0][0][0]) & name)
- result[0][0][1].add(ident"deprecated")
- result[0][2] = infix(result[0][2], "+", incr)
- var
- a = 1
- foo {.exportc: "exportedFooBar", appendToNameAndAdd("Bar", {'0'..'9'}), used.} = {'a'..'z', 'A'..'Z'}
- b = 2
-
- doAssert (a, b) == (1, 2)
- let importedFooBar {.importc: "exportedFooBar", nodecl.}: set[char]
- doAssert importedFooBar == fooBar #[tt.Warning
- ^ fooBar is deprecated
- ]#
-
- block: # with stropping
- macro `cast`(def) =
- let def = def[0]
- let
- lhs = def[0]
- typ = def[1]
- ex = def[2]
- addrTyp = if typ.kind == nnkEmpty: typ else: newTree(nnkPtrTy, typ)
- result = quote do:
- let tmp: `addrTyp` = unsafeAddr(`ex`)
- template `lhs`: untyped = tmp[]
-
- macro assign(def) =
- result = getAst(`cast`(def))
- block:
- let s = @["foo", "bar"]
- let a {.`assign`.} = s[0]
- doAssert a == "foo"
- doAssert a[0].addr == s[0][0].addr
- block:
- let
- s = @["foo", "bar"]
- a {.`cast`.} = s[0]
- doAssert a == "foo"
- doAssert a[0].addr == s[0][0].addr
- block: # bug #15920
- macro foo(def) =
- result = def
- proc fun1()=
- let a {.foo.} = 1
- template fun2()=
- let a {.foo.} = 1
- fun1() # ok
- fun2() # BUG
|