startup classage expr18 { main(String[] args) { print("[ROUND 1]"); create X(); print("[ROUND 2]"); create Y(); print("[ROUND 3]"); create XY(3); print("[ROUND 4]"); create XY(true); print("[ROUND 5]"); create YX(3); print("[ROUND 6]"); create YX(true); // note: round 3 and round 5 print out the same result, which // shows the communicativeness of the compound process. // similarly, round 4 and round 6 print out the same result. } } classage XY = X + Y with A >> B { XY(int x) { :X(); :Y(); } XY(boolean b) {:Y(); :X(); } } classage YX = Y + X with B >> A { YX(int x) { :X(); :Y(); } YX(boolean b) {:Y(); :X(); } } classage X { X() { ::t(); } mixer A { export void t0() { print("OK from export t0 of A"); } import void t1() export void t1() { print("OK from export t1 of A"); } export void t2() { print("OK from export t2 of A"); } export void t3() { print("passive call for t0"); t0(); print("passive call for t1"); t1(); } } void t() { print("[1]"); A::t0(); print("[2]"); A::t1(); print("[3]"); A::t2(); print("[4]"); A::t3(); return; } } classage Y { Y() { ::t(); } mixer B { import void t0() export void t0() { print("OK from export t0 of B"); return; } export void t1() { print("OK from export t1 of B"); return; } } void t() { print("[4]"); B::t0(); print("[5]"); B::t1(); return; } }