summary refs log tree commit diff stats
path: root/tests/closure/tclosure2.nim
blob: d2c16eac961fd3ec199e46af049698f765bbc6f1 (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
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
90
91
92
93
94
95
96
97
98
99
100
101
discard """
  output: '''0
11
1
11
2
11
3
11
4
11
5
11
6
11
7
11
8
11
9
11
11
py
py
py
py
px
6'''
"""

when true:
  proc ax =
    for xxxx in 0..9:
      var i = 0
      proc bx =
        if i > 10: 
          echo xxxx
          return
        i += 1
        #for j in 0 .. 0: echo i
        bx()
      
      bx()
      echo i

  ax()

when true:
  proc accumulator(start: int): (proc(): int {.closure.}) =
    var x = start-1
    #let dummy = proc =
    #  discard start
    
    result = proc (): int = 
      #var x = 9
      for i in 0 .. 0: x = x + 1
      
      return x

  var a = accumulator(3)
  let b = accumulator(4)
  echo a() + b() + a()


  proc outer =

    proc py() =
      # no closure here:
      for i in 0..3: echo "py"

    py()
    
  outer()


when true:
  proc outer2 =
    var errorValue = 3
    proc fac[T](n: T): T =
      if n < 0: result = errorValue
      elif n <= 1: result = 1
      else: result = n * fac(n-1)
  
    proc px() {.closure.} =
      echo "px"

    proc py() {.closure.} =
      echo "py"

    const
      mapping = {
        "abc": px,
        "xyz": py
      }
    mapping[0][1]()
    
    echo fac(3)


  outer2()