RosettaCodeData/Task/Extend-your-language/Nim/extend-your-language.nim
2023-07-01 13:44:08 -04:00

62 lines
1.1 KiB
Nim

import macros
proc newIfElse(c, t, e: NimNode): NimNode {.compiletime.} =
result = newIfStmt((c, t))
result.add(newNimNode(nnkElse).add(e))
macro if2(x, y: bool; z: untyped): untyped =
var parts: array[4, NimNode]
for i in parts.low .. parts.high:
parts[i] = newNimNode(nnkDiscardStmt).add(NimNode(nil))
assert z.kind == nnkStmtList
assert z.len <= 4
for i in 0 ..< z.len:
assert z[i].kind == nnkCall
assert z[i].len == 2
var j = 0
case $z[i][0]
of "then": j = 0
of "else1": j = 1
of "else2": j = 2
of "else3": j = 3
else: assert false
parts[j] = z[i][1].last
result = newIfElse(x,
newIfElse(y, parts[0], parts[1]),
newIfElse(y, parts[2], parts[3]))
if2 2 > 1, 3 < 2:
then:
echo "1"
else1:
echo "2"
else2:
echo "3"
else3:
echo "4"
# Missing cases are supported:
if2 2 > 1, 3 < 2:
then:
echo "1"
else2:
echo "3"
else3:
echo "4"
# Order can be swapped:
if2 2 > 1, 3 < 2:
then:
echo "1"
else2:
echo "3"
else1:
echo "2"
else3:
echo "4"