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
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
|
discard """
output: '''
0
-2
48
hel
lo
my awesome concat
'''
"""
block tnoalias2:
# bug #206
template optimizeOut{testFunc(a, b)}(a: int, b: int{alias}): untyped = 0
proc testFunc(a, b: int): int = result = a + b
var testVar = 1
echo testFunc(testVar, testVar)
template ex{a = b + c}(a : int{noalias}, b, c : int) =
a = b
inc a, b
echo "came here"
var x = 5
x = x + x
block tpartial:
proc p(x, y: int; cond: bool): int =
result = if cond: x + y else: x - y
template optP{p(x, y, true)}(x, y): untyped = x - y
template optP{p(x, y, false)}(x, y): untyped = x + y
echo p(2, 4, true)
block tpatterns:
template optZero{x+x}(x: int): int = x*3
template andthen{`*`(x,3)}(x: int): int = x*4
template optSubstr1{x = substr(x, a, b)}(x: string, a, b: int) = setlen(x, b+1)
var y = 12
echo y+y
var s: array[0..2, string]
s[0] = "hello"
s[0] = substr(s[0], 0, 2)
echo s[0]
# Test varargs matching
proc someVarargProc(k: varargs[string]) = doAssert(false) # this should not get called
template someVarargProcSingleArg{someVarargProc([a])}(a: string) = echo a
someVarargProc("lo")
block tstar:
var
calls = 0
proc `&&`(s: varargs[string]): string =
result = s[0]
for i in 1..len(s)-1: result.add s[i]
inc calls
template optConc{ `&&` * a }(a: string): string = &&a
let space = " "
echo "my" && (space & "awe" && "some " ) && "concat"
# check that it's been optimized properly:
doAssert calls == 1
# bug #7524
template in_to_out(typIn, typOut: typedesc) =
proc to_out(x: typIn{lit}): typOut = result = ord(x)
# Generating the proc via template doesn't work
in_to_out(char, int)
# This works
proc to_out2(x: char{lit}): int = result = ord(x)
|