blob: 4cd57b3bd6dbe65f6cbbb5f61c7623b3f2b1daa2 (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
|
discard """
output:
'''
@[0, 1, 2]
@[3, 4, 5]
@[0, 1, 2]
3
4
'''
"""
template runNTimes(n: int, f : untyped) : untyped =
var accum: seq[type(f)]
for i in 0..n-1:
accum.add(f)
accum
var state {.compileTime.} : int = 0
proc fill(): int {.compileTime.} =
result = state
inc state
# invoke fill() at compile time as a compile time expression
const C1 = runNTimes(3, fill())
echo C1
# invoke fill() at compile time as a set of compile time statements
const C2 =
block:
runNTimes(3, fill())
echo C2
# invoke fill() at compile time after a compile time reset of state
const C3 =
block:
state = 0
runNTimes(3, fill())
echo C3
# evaluate fill() at compile time and use the results at runtime
echo fill()
echo fill()
|