summary refs log tree commit diff stats
path: root/tests/closure/tclosure0.nim
blob: 9952268d5a831073d75fc26d54b324ec6e8474dd (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
discard """
  output: '''foo88
23 24foo 88
18
18
99
99
99
99 99
99 99
12 99 99
12 99 99'''
"""

when true:
  # test simple closure within dummy 'main':
  proc dummy =
    proc main2(param: int) =
      var fooB = 23
      proc outer(outerParam: string) =
        var outerVar = 88
        echo outerParam, outerVar
        proc inner() =
          block Test:
            echo fooB, " ", param, outerParam, " ", outerVar
        inner()
      outer("foo")
    main2(24)

  dummy()

when true:
  proc outer2(x:int) : proc(y:int):int =   # curry-ed application
      return proc(y:int):int = x*y

  var fn = outer2(6)  # the closure
  echo fn(3)   # it works

  var rawP = fn.rawProc()
  var rawE = fn.rawEnv()

  # A type to cast the function pointer into a nimcall
  type
    TimesClosure = proc(a: int, x: pointer): int {.nimcall.}

  # Call the function with its closure
  echo cast[TimesClosure](rawP)(3, rawE)

when true:
  proc outer =
    var x, y: int = 99
    proc innerA = echo x
    proc innerB =
      echo y
      innerA()

    innerA()
    innerB()

  outer()

when true:
  proc indirectDep =
    var x, y: int = 99
    proc innerA = echo x, " ", y
    proc innerB =
      innerA()

    innerA()
    innerB()

  indirectDep()

when true:
  proc needlessIndirection =
    var x, y: int = 99
    proc indirection =
      var z = 12
      proc innerA = echo z, " ", x, " ", y
      proc innerB =
        innerA()

      innerA()
      innerB()
    indirection()

  needlessIndirection()