#? strongSpaces discard """ output: '''35 true true 4 true 1 false 77 (Field0: 1, Field1: 2, Field2: 2) ha true tester args all all args 19 -3 false -2 ''' """ echo 2+5 * 5 # Keyword operators echo 1 + 16 shl 1 == 1 + (16 shl 1) echo 2 and 1 in {0, 30} echo 2+2 * 2 shr 1 echo false or 2 and 1 in {0, 30} proc `^`(a, b: int): int = a + b div 2 echo 19 mod 16 ^ 4 + 2 and 1 echo 18 mod 16 ^ 4 > 0 # echo $foo gotcha let foo = 77 echo $foo echo (1, 2, 2) template `&`(a, b: int): expr = a and b template `|`(a, b: int): expr = a - b template `++`(a, b: int): expr = a + b == 8009 when true: let b = 66 let c = 90 let bar = 8000 if foo+4 * 4 == 8 and b&c | 9 ++ bar: echo "ho" else: echo "ha" let booA = foo+4 * 4 - b&c | 9 + bar # is parsed as let booB = ((foo+4)*4) - ((b&c) | 9) + bar echo booA == booB template `|`(a, b): expr = (if a.len > 0: a else: b) const tester = "tester" args = "args" echo tester & " " & args|"all" echo "all" | tester & " " & args echo "all"|tester & " " & args # Test arrow like operators. See also tests/macros/tclosuremacro.nim proc `+->`(a, b: int): int = a + b*4 template `===>`(a, b: int): expr = a - b shr 1 echo 3 +-> 2 + 2 and 4 var arrowed = 3+->2 + 2 and 4 # arrowed = 4 echo arrowed ===> 15 echo (2 * 3+->2) == (2*3 +-> 2) echo arrowed ===> 2 + 3+->2