primitive int = 0; struct bool { var value: int; } struct char { var value: int; } type string = char*; type usize = int; struct _ptr { var value: int; } struct _fun { var value: int; } intrinsic operator+(int, int) -> int = 0; intrinsic operator-(int, int) -> int = 1; intrinsic operator*(int, int) -> int = 2; intrinsic operator/(int, int) -> int = 3; intrinsic operator%(int, int) -> int = 4; intrinsic operator&(int, int) -> int = 5; intrinsic operator|(int, int) -> int = 6; intrinsic operator^(int, int) -> int = 7; intrinsic operator<<(int, int) -> int = 8; intrinsic operator>>(int, int) -> int = 9; intrinsic operator-(int) -> int = 10; intrinsic operator==(int, int) -> bool = 11; intrinsic operator!=(int, int) -> bool = 12; intrinsic operator<(int, int) -> bool = 13; intrinsic operator>(int, int) -> bool = 14; intrinsic operator<=(int, int) -> bool = 15; intrinsic operator>=(int, int) -> bool = 16; intrinsic getInt() -> int = 17; intrinsic putInt(int) = 18; intrinsic drawAddr(int) = 19; intrinsic drawData(int) = 20; intrinsic drawSwap(int) = 21; intrinsic noreturn halt() = 22; // int fun inline operator+(a: int) -> int { return a; } fun inline operator~(a: int) -> int { return a ^ -1; } fun inline operator++(a: int&) { a = a + 1; } fun inline operator--(a: int&) { a = a - 1; } fun inline operator+=(a: int&, b: int) { a = a + b; } fun inline operator-=(a: int&, b: int) { a = a - b; } fun inline operator*=(a: int&, b: int) { a = a * b; } fun inline operator/=(a: int&, b: int) { a = a / b; } fun inline operator%=(a: int&, b: int) { a = a % b; } fun inline operator&=(a: int&, b: int) { a = a & b; } fun inline operator|=(a: int&, b: int) { a = a | b; } fun inline operator^=(a: int&, b: int) { a = a ^ b; } fun inline operator<<=(a: int&, b: int) { a = a << b; } fun inline operator>>=(a: int&, b: int) { a = a >> b; } // bool fun inline operator@(a: int) -> bool { return a != 0; } fun inline operator@(a: bool) -> int { return a.value; } fun inline operator==(a: bool, b: bool) -> bool { return a.value == b.value; } fun inline operator!=(a: bool, b: bool) -> bool { return a.value != b.value; } fun inline operator<(a: bool, b: bool) -> bool { return a.value < b.value; } fun inline operator>(a: bool, b: bool) -> bool { return a.value > b.value; } fun inline operator<=(a: bool, b: bool) -> bool { return a.value <= b.value; } fun inline operator>=(a: bool, b: bool) -> bool { return a.value >= b.value; } // char fun inline operator@(a: int) -> char { var r: char; r.value = a; return r; } fun inline operator@(a: char) -> int { return a.value; } fun inline operator+(a: char, b: int) -> char { var r: char; r.value = a.value + b; return r; } fun inline operator+(a: int, b: char) -> char { var r: char; r.value = a + b.value; return r; } fun inline operator-(a: char, b: int) -> char { var r: char; r.value = a.value - b; return r; } fun inline operator-(a: char, b: char) -> int { return a.value - b.value; } fun inline operator++(a: char&) { a = a + 1; } fun inline operator--(a: char&) { a = a - 1; } fun inline operator+=(a: char&, b: int) { a = a + b; } fun inline operator-=(a: char&, b: int) { a = a - b; } fun inline operator==(a: char, b: char) -> bool { return a.value == b.value; } fun inline operator!=(a: char, b: char) -> bool { return a.value != b.value; } fun inline operator<(a: char, b: char) -> bool { return a.value < b.value; } fun inline operator>(a: char, b: char) -> bool { return a.value > b.value; } fun inline operator<=(a: char, b: char) -> bool { return a.value <= b.value; } fun inline operator>=(a: char, b: char) -> bool { return a.value >= b.value; } fun inline getChar() -> char { return @char(getInt()); } fun inline putChar(ch: char) { putInt(@int(ch)); } // pointer fun inline operator@(a: void*) -> int { return @_ptr(a).value; } fun inline operator@(p: void*) -> bool { return p != null; } fun inline operator==(a: void*, b: void*) -> bool { return @_ptr(a).value == @_ptr(b).value; } fun inline operator!=(a: void*, b: void*) -> bool { return @_ptr(a).value != @_ptr(b).value; } fun inline operator<(a: void*, b: void*) -> bool { return @_ptr(a).value < @_ptr(b).value; } fun inline operator>(a: void*, b: void*) -> bool { return @_ptr(a).value > @_ptr(b).value; } fun inline operator<=(a: void*, b: void*) -> bool { return @_ptr(a).value <= @_ptr(b).value; } fun inline operator>=(a: void*, b: void*) -> bool { return @_ptr(a).value >= @_ptr(b).value; } // function fun inline operator@(f: fun(void)) -> bool { return f != null; } fun inline operator==(a: fun(void), b: fun(void)) -> bool { return @_fun(a).value == @_fun(b).value; } fun inline operator!=(a: fun(void), b: fun(void)) -> bool { return @_fun(a).value != @_fun(b).value; } fun inline operator<(a: fun(void), b: fun(void)) -> bool { return @_fun(a).value < @_fun(b).value; } fun inline operator>(a: fun(void), b: fun(void)) -> bool { return @_fun(a).value > @_fun(b).value; } fun inline operator<=(a: fun(void), b: fun(void)) -> bool { return @_fun(a).value <= @_fun(b).value; } fun inline operator>=(a: fun(void), b: fun(void)) -> bool { return @_fun(a).value >= @_fun(b).value; } // null fun inline operator==(a: null, b: null) -> bool { return true; } fun inline operator!=(a: null, b: null) -> bool { return false; } fun inline operator<(a: null, b: null) -> bool { return false; } fun inline operator>(a: null, b: null) -> bool { return false; } fun inline operator<=(a: null, b: null) -> bool { return true; } fun inline operator>=(a: null, b: null) -> bool { return true; } // min, max template fun inline min(a: T, b: T) -> T { return a < b ? a : b; } template fun inline max(a: T, b: T) -> T { return a > b ? a : b; }