;ACME 0.97 ; "assert" macro !macro a @r { !if @r != 1 { !error "assertion failed" } } three = 3 five = 5 seven = 7 fp = 123.456 abcdef = $abcdef ; literals +a 255 == $ff +a 255 == 0xFF +a 255 == %#1#1#1#1 +a 255 == 0b1111#### +a 255 == &377 +a 33 == '!' ; test monadic operators +a NOT 1 == -2 +a -three == -3 +a abcdef == $cd +a ^abcdef == $ab +a addr(abcdef) == abcdef +a int(abcdef) == abcdef +a float(three) == three +a three == float(three) +a float(fp) != int(fp) +a int(fp) != float(fp) +a float(three) == int(three) +a int(three) == float(three) +a sin(3.14) > 0 +a cos(0.1) > 0.9 +a tan(3.1415 / 2) > 1 +a arcsin(1) > 1.57 +a arccos(0) > 1.57 +a arctan(1) > 0.78 ; test dyadic operators +a three^five == 3*3*3*3*3 +a three*five == 15 +a 15 / 2 == 7 +a 15.0 / 2 == 7.5 +a 15.0 DIV 2.0 == 7 +a 17 % 3 == 2 +a 3 << 3 == 24 +a -5 >> 2 == -2 +a 24 >> 3 == 3 +a -1 >> 3 == -1 +a 24 >>> 3 == 3 +a five + three == 8 +a five - three == 2 +a 2*3 == 1+5 +a 2<=3 +a 2<=2 +a 2<3 +a 3>=3 +a 3>=2 +a 3>2 +a 2!=3 +a (abcdef & $a0c0e0) == $a0c0e0 +a (abcdef | $ff0001) == $ffcdef ; +a ($aa eor $55) == $ff +a ($aa xor $55) == $ff ; priorities +a 3 + 4 * 5 == 23 +a 4 * 5 + 3 == 23 +a 4.1 * 5.1 + 3.1 > 23.1 +a (15 or 3 xor 5) == (15 or (3 xor 5)) +a (15 or 3 xor 5) != ((15 or 3) xor 5) +a (15 xor 3 and 5) == (15 xor (3 and 5)) +a (15 xor 3 and 5) != ((15 xor 3) and 5) +a (5 and 3 == 3) == (5 and (3 == 3)) +a (5 and 3 == 3) != ((5 and 3) == 3) +a (1 == 2 != 0) == (1 == (2 != 0)) +a (1 == 2 != 0) != ((1 == 2) != 0) +a (0 != 3 < 2) == (0 != (3 < 2)) +a (0 != 3 < 2) != ((0 != 3) < 2) ; < and > comparisons have the same priority, so this actually checks left-associativity: +a (3 <= 3 > 0) == ((3 <= 3) > 0) +a (3 <= 3 > 0) != (3 <= (3 > 0)) +a (<257 > 1) == ((<257) > 1) +a (<257 > 1) != (<(257 > 1)) +a (<256 >> 4) == (<(256 >> 4)) +a (<256 >> 4) != ((<256) >> 4) ; shifts have the same priority, so this actually checks left-associativity: +a (16 >>> 2 >> 1) == ((16 >>> 2) >> 1) +a (16 >>> 2 >> 1) != (16 >>> (2 >> 1)) +a (16 >> 2 << 1) == ((16 >> 2) << 1) +a (16 >> 2 << 1) != (16 >> (2 << 1)) +a (8 << 4 >>> 2) == ((8 << 4) >>> 2) +a (8 << 4 >>> 2) != (8 << (4 >>> 2)) +a (3 >> 1 + 5) == (3 >> (1 + 5)) +a (3 >> 1 + 5) != ((3 >> 1) + 5) ; + and - have the same priority, so this actually checks left-associativity: +a (3 - 5 + 7) == ((3 - 5) + 7) +a (3 - 5 + 7) != (3 - (5 + 7)) ; test left-associativity +a 11-5-3 == 3 +a 11-5-3 != 9 +a (3 + 5 * 7) == (3 + (5 * 7)) +a (3 + 5 * 7) != ((3 + 5) * 7) ; *, /, DIV and MOD have the same priority, so this actually checks left-associativity: +a (7 * 5 MOD 7) == ((7 * 5) MOD 7) +a (7 * 5 MOD 7) != (7 * (5 MOD 7)) +a (-14 + 5) == ((-14) + 5) +a (-14 + 5) != (-(14 + 5)) +a (-3^2) == -(3^2) +a (-3^2) != (-3)^2 ; test right-associativity +a 2^3^4 == 2^(3^4) +a 2^3^4 != (2^3)^4 +a NOT 3 ^ 5 == ((NOT 3) ^ 5) +a NOT 3 ^ 5 != (NOT (3 ^ 5)) +a int(3 + 4) + .8 == (int(3 + 4) + .8) +a int(3 + 4) + .8 != int((3 + 4) + .8) +a 3*(4+5)+7 == (3*(4+5))+7 +a 3*(4+5)+7 != 3*((4+5)+7) ; test dyadics with different arg types ; int/int +a 3 ^ 2 == 9 +a 3 * 2 == 6 +a 6 / 2 == 3 +a 5 DIV 2 == 2 +a 3 + 2 == 5 +a 6 - 4 == 2 +a 2 <= 3 +a 2 < 3 +a 3 >= 2 +a 3 > 2 +a 2 != 3 +a 2 == 2 +a 5 MOD 2 == 1 +a 5 >>> 1 == 2 +a (5 & 1) == 1 +a (5 | 2) == 7 ; +a (5 EOR 2) == 7 +a (5 XOR 2) == 7 +a 5 << 2 == 20 +a 5 >> 2 == 1 ; int/float +a 3 ^ 2.0 == 9 +a 3 * 2.0 == 6 +a 6 / 2.0 == 3 +a 5 DIV 2.0 == 2 +a 3 + 2.0 == 5 +a 6 - 4.0 == 2 +a 2 <= 3.0 +a 2 < 3.0 +a 3 >= 2.0 +a 3 > 2.0 +a 2 != 3.0 +a 2 == 2.0 +a 5 MOD 2.0 == 1 +a 5 << 2.0 == 20 +a 5 >> 2.0 == 1 ; float/int +a 3.0 ^ 2 == 9 +a 3.0 * 2 == 6 +a 6.0 / 2 == 3 +a 5.0 DIV 2 == 2 +a 3.0 + 2 == 5 +a 6.0 - 4 == 2 +a 2.0 <= 3 +a 2.0 < 3 +a 3.0 >= 2 +a 3.0 > 2 +a 2.0 != 3 +a 2.0 == 2 +a 5.0 MOD 2 == 1 +a 5.0 << 2 == 20 +a 5.0 >> 2 == 1.25 ; float/float +a 3.0 ^ 2.0 == 9 +a 3.0 * 2.0 == 6 +a 6.0 / 2.0 == 3 +a 5.0 DIV 2.0 == 2 +a 3.0 + 2.0 == 5 +a 6.0 - 4.0 == 2 +a 2.0 <= 3.0 +a 2.0 < 3.0 +a 3.0 >= 2.0 +a 3.0 > 2.0 +a 2.0 != 3.0 +a 2.0 == 2.0 +a 5.0 MOD 2.0 == 1 +a 5.0 << 2.0 == 20 +a 5.0 >> 2.0 == 1.25