class Test{} var t1 = Test(); var t2 = Test(); var eq = t1 == t2; class Integer { var value = 0; routine Integer( v = 0 ){ value = v } static routine +( A : Integer, B : int ){ io.writeln( "Integer + int" ); return Integer( A.value + B ); } # no longer supported, now the first operand must be a user type: static routine +( A : int, B : Integer ){ io.writeln( "int + Integer" ); return Integer( A + B.value ); } static routine +( A : Integer, B : Integer ){ io.writeln( "Integer + Integer" ); return Integer( A.value + B.value ); } static routine +( C : Integer, A : Integer, B : Integer ){ io.writeln( "Integer = Integer + Integer" ); C.value = A.value + B.value; return C; } routine +=( B : Integer ){ io.writeln( "Integer += Integer" ); value += B.value; return self; } static routine -( A : Integer ){ io.writeln( "- Integer" ); return Integer( - A.value ); } static routine -( A : Integer, B : Integer ){ io.writeln( "Integer - Integer" ); return Integer( A.value - B.value ); } static routine <( A : Integer, B : Integer ){ io.writeln( "Integer < Integer" ); return Integer( A.value < B.value ); } static routine !( C : Integer, A : Integer ){ io.writeln( "routine !( C : Integer, A : Integer )" ); C.value = ! A.value; return C; } static routine !( A : Integer ){ io.writeln( "routine !( A : Integer )" ); return Integer( ! A.value ); } static routine <<( C: Integer, A: Integer, B: int ){ io.writeln( "routine <<( C: Integer, B: Integer, A: int )" ); C.value = A.value << B; return C } static routine <<( A: Integer, B: int ){ io.writeln( "routine <<( C: Integer, B: Integer, A: int )" ); return Integer( A.value << B ); } static routine ~( C : Integer, A : Integer ){ io.writeln( "routine ~( C : Integer, A : Integer )" ); C.value = ~ A.value; return C; } static routine ~( A : Integer ){ io.writeln( "routine ~( A : Integer )" ); return Integer( ~ A.value ); } static routine %( A : Integer ){ io.writeln( "routine %( A : Integer )" ); return % A.value; } #{ #} routine serialize(){ return value; } } var n1 = Integer(10); var n2 = Integer(20); # n3 = 1 + n2; # no longer supported, now the first operand must be a user type; var n4 = n1 + 2; var n5 = n1 + n2; var n6 = - n5; var n7 = n5 - n4; var n8 = n5 < n4; var n9 = n5 > n4; io.writeln( n4, n5, n6, n7, n8, n9 ); #{ n8 = Integer{10}; n9 = Integer{20}; #} n9 = ! n8 io.writeln( n8, n9 ); n9 = ! n9 io.writeln( n8, n9 ); n9.value = 10; n8.value = 20; io.writeln( "=======", n8, n9 ); for(var i = 1 : 2 ) n9 = n8 + n9 io.writeln( "=======" ); n9 += n8 var ls = { n8 + n9 } std.about( n8 + n9 ); invar n11 = Integer(10); #io.writeln( % n11 ) #io.writeln( n9 + n11 ) var k : any = n9 io.writeln( "The following should raise an error!" ) io.writeln( k + n11 ) # Error