mirror of
https://github.com/nim-lang/Nim.git
synced 2025-12-29 01:14:41 +00:00
* merge actiontable tests
* merge arithm tests
* merge array tests
* merge assign tests
* merge bind tests
* merge casestmt tests
* merge closure tests
* merge cnt seq tests
* merge collections tests
* merge concept issues tests
* merge concept tests
* fix failing tests
* smaller outputs
Use `doAssert` where possible.
* fix wrong output
* split `tcomputedgoto`
* revert merging concepts
* fix failing test
(cherry picked from commit 7f18d7cbc1)
181 lines
2.7 KiB
Nim
181 lines
2.7 KiB
Nim
discard """
|
|
file: "tnested.nim"
|
|
output: '''
|
|
foo88
|
|
23 24foo 88
|
|
foo88
|
|
23 24foo 88
|
|
11
|
|
int: 108
|
|
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
|
|
'''
|
|
"""
|
|
|
|
|
|
block tnestedclosure:
|
|
proc main(param: int) =
|
|
var foo = 23
|
|
proc outer(outerParam: string) =
|
|
var outerVar = 88
|
|
echo outerParam, outerVar
|
|
proc inner() =
|
|
block Test:
|
|
echo foo, " ", param, outerParam, " ", outerVar
|
|
inner()
|
|
outer("foo")
|
|
|
|
# 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()
|
|
|
|
main(24)
|
|
|
|
# Jester + async triggered this bug:
|
|
proc cbOuter() =
|
|
var response = "hohoho"
|
|
block:
|
|
proc cbIter() =
|
|
block:
|
|
proc fooIter() =
|
|
doAssert response == "hohoho"
|
|
fooIter()
|
|
cbIter()
|
|
cbOuter()
|
|
|
|
|
|
block tnestedproc:
|
|
proc p(x, y: int): int =
|
|
result = x + y
|
|
|
|
echo p((proc (): int =
|
|
var x = 7
|
|
return x)(),
|
|
(proc (): int = return 4)())
|
|
|
|
|
|
block deeplynested:
|
|
# bug #4070
|
|
proc id(f: (proc())): auto =
|
|
return f
|
|
|
|
proc foo(myinteger: int): (iterator(): int) =
|
|
return iterator(): int {.closure.} =
|
|
proc bar() =
|
|
proc kk() =
|
|
echo "int: ", myinteger
|
|
kk()
|
|
id(bar)()
|
|
|
|
discard foo(108)()
|
|
|
|
|
|
block tclosure2:
|
|
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"
|
|
|
|
let
|
|
mapping = {
|
|
"abc": px,
|
|
"xyz": py
|
|
}
|
|
mapping[0][1]()
|
|
|
|
echo fac(3)
|
|
|
|
|
|
outer2()
|