mirror of
https://github.com/nim-lang/Nim.git
synced 2025-12-28 17:04:41 +00:00
84 lines
1.5 KiB
Nim
84 lines
1.5 KiB
Nim
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()
|