)abbrev package TSNEST7Z TestNestedFunctions TestNestedFunctions(): with f1 : (Integer -> Integer, Integer) -> Integer f1a : (Integer->(Integer->Integer), Integer) -> (Integer->Integer) f2 : Integer -> Integer f2a : Integer -> Integer f2b : Integer -> Integer f2c : Integer -> Integer f3 : ((Integer, Float) -> Integer, Integer) -> Integer f4 : Integer -> Integer f4a : Integer -> Integer f4b : Integer -> Integer f4c : Integer -> Integer a3cl : Integer -> (Integer -> (Integer -> Integer)) -- a3cn : Integer -> (Integer -> (Integer -> Integer)) a4cl : Integer -> (Integer -> (Integer -> (Integer -> Integer))) -- a3cn : Integer -> (Integer -> (Integer -> (Integer -> Integer))) testIt: () -> Void == add -- Helper f1a(f, i) == f(i) f1(f: Integer->Integer, i: Integer): Integer == f i f2(i: Integer): Integer == f1(x +-> x + 1, i) f2a(i: Integer): Integer == f1((x : Integer) : Integer +-> x + 1, i) f2b(i: Integer): Integer == f1(((x : Integer) : Integer) +-> x + 1, i) f2c(i: Integer): Integer == f1((x +-> x + 1)@(Integer -> Integer), i) f2d(i: Integer): Integer == au1(x : Integer) : Integer == x + 1 f1(au1, i) f3(f: (Integer, Float) -> Integer, i: Integer): Integer == f(i, 0.0) f4(i: Integer) : Integer == f3((x, y) +-> 1 + i, i) f4a(i: Integer) : Integer == f3((x, y) +-> x + i, 1) f4b(i: Integer) : Integer == f3(((x: Integer, y : Float): Integer) +-> x + i, 1) f4c(i: Integer) : Integer == f3(((x, y) +-> x + i)@((Integer, Float) -> Integer), 1) a3cl(x) == y +-> (z +-> x + y + z) )if false -- Does not work since compWithMappingMode tries to compile -- the whole body as a function of #1 a3cn(x) == au1(y : Integer):(Integer -> Integer) == -- z +-> x + y + z au2(z : Integer): Integer == x + y + z -- (b:Integer):Integer +-> f1(au2, b) au2 au1 )endif a4cl(x) == y +-> (z +-> (w +-> x + y + z + w)) )if false -- like a3cn does not work a4cn(x) == au1(y : Integer):(Integer -> (Integer -> Integer)) == au2(z : Integer): (Integer -> Integer) == au3(w : Integer) == x + y + z + w au3 au2 au1 )endif import OutputPackage reportFailure(s : String, args : OutputForm, ex : Integer, _ ress : Integer) : Void == output(concat(s, " failed at: "), args) output("expected: ", ex :: OutputForm) output("obtained: ", ress :: OutputForm) failedAcl(s : String, args : List(Integer), ex : Integer, _ ress : Integer) : Void == reportFailure(s, args :: OutputForm, ex, ress) testAdder(f : Integer -> Integer, s : String, n : Integer) : Void == if (ress := f(n)) ~= n + 1 then reportFailure(s, n ::OutputForm, n + 1, ress) testIt() : Void == for n in [0, 1, 15, 667, -17]@List(Integer) repeat testAdder(f2, "f2", n) testAdder(f2a, "f2a", n) testAdder(f2b, "f2b", n) testAdder(f2c, "f2c", n) testAdder(f2d, "f2d", n) testAdder(f4, "f4", n) testAdder(f4a, "f4a", n) testAdder(f4b, "f4b", n) testAdder(f4c, "f4c", n) for m in [-5, 1, 19] repeat if (ress := (((a3cl)(n))(m))(4)) ~= (ex := n + m + 4) then failedAcl("a3cl", [n, m, 4], ex, ress) if (ress := ((((a4cl)(n))(m))(14))(37)) ~= _ (ex := n + m + 14 + 37) then failedAcl("a4cl", [n, m, 14, 37], ex, ress) -- )endif