diff options
Diffstat (limited to 'tests/template/ttempl3.nim')
-rw-r--r-- | tests/template/ttempl3.nim | 83 |
1 files changed, 83 insertions, 0 deletions
diff --git a/tests/template/ttempl3.nim b/tests/template/ttempl3.nim new file mode 100644 index 000000000..17421cd87 --- /dev/null +++ b/tests/template/ttempl3.nim @@ -0,0 +1,83 @@ +discard """ +action: compile +""" + + +template withOpenFile(f: untyped, filename: string, mode: FileMode, + actions: untyped): untyped = + block: + # test that 'f' is implicitly 'injecting': + var f: File + if open(f, filename, mode): + try: + actions + finally: + close(f) + else: + quit("cannot open for writing: " & filename) + +withOpenFile(txt, "ttempl3.txt", fmWrite): + writeLine(txt, "line 1") + txt.writeLine("line 2") + +var + myVar: array[0..1, int] + +# Test zero argument template: +template ha: untyped = myVar[0] + +ha = 1 +echo(ha) + + +# Test identifier generation: +template prefix(name): untyped = `"hu" name` + +var `hu "XYZ"` = "yay" + +echo prefix(XYZ) + +template typedef(name: untyped, typ: typeDesc) {.dirty.} = + type + `T name`* = typ + `P name`* = ref `T name` + +typedef(myint, int) +var x: PMyInt + + +# Test UFCS + +type + Foo = object + arg: int + +proc initFoo(arg: int): Foo = + result.arg = arg + +template create(typ: typeDesc, arg: untyped): untyped = `init typ`(arg) + +var ff = Foo.create(12) + +echo ff.arg + + +import macros + +# bug #11494 +macro staticForEach(arr: untyped, body: untyped): untyped = + result = newNimNode(nnkStmtList) + arr.expectKind(nnkBracket) + for n in arr: + let b = copyNimTree(body) + result.add quote do: + block: + type it {.inject.} = `n` + `b` + +template forEveryMatchingEntity*() = + staticForEach([int, string, float]): + var a {.inject.}: it + echo a + +forEveryMatchingEntity() |