## Simple upvalue. def f1 local = "foo" return fn return local end end assert(f1()() == "foo") def add3(x) return fn(y) return fn(z) return x + y + z end end end assert(add3(1)(2)(3) == 6); assert(add3(7)(6)(4) == 17); ## Upvalue external to the inner function. def f2 local = "bar" return fn f = fn return local end return f end end assert(f2()()() == "bar") ## Check if upvalues are shared between closures. def f3 local = "baz" _fn1 = fn(x) local = x end _fn2 = fn return local end return [_fn1, _fn2] end fns = f3() fns[0]("qux") assert(fns[1]() == "qux") def f4 a = [] x = 10 for i in 0..2 j = i ## 'i' is shared, but 'j' doesn't list_append( a, fn return x + j end ) end x = 20 return a end a = f4() assert(a[0]() == 20) assert(a[1]() == 21) def f5 l1 = 12 return fn ## c1 l2 = 34 return fn ## c2 l3 = 56 return fn ## c3 return fn ## c4 return fn ## c5 return l1 + l2 + l3 end end end end end end print(f5()()()()()() == 102) print('All TESTS PASSED')