Initial data commit
This commit is contained in:
parent
72d218235f
commit
f23f22d71c
199087 changed files with 3378941 additions and 0 deletions
62
Task/Extend-your-language/Nim/extend-your-language.nim
Normal file
62
Task/Extend-your-language/Nim/extend-your-language.nim
Normal file
|
|
@ -0,0 +1,62 @@
|
|||
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"
|
||||
Loading…
Add table
Add a link
Reference in a new issue