type main: string -> integer function entry: main type rec: [integer: x; integer: y] type T1: integer -> integer type T2: rec -> integer type arr: 1 -> integer function foo: T1 function bar1: T2 function bar2: T2 foo (x) := { return x * x; } bar1 (x, y) := { return x * y; } bar2 (r,s) := { return r * s; } entry (arg) := { [ integer: result ; rec: w] result := foo(5); w := reserve w; (* see types.alpha – reserve returns a value of type address, which can be assigned to array and record variables*) w.x := 5; w.y := 7; result := bar1(w); (* pass w (a rec type value) to bar1 *) result := bar2(5,7); (* implicitly build a rec type value, assign 5 and 7 to fields x and y, but call them r and s *) return 0; }