macro_dsl.nim 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. import macros
  2. #Inline macro.add() to allow for easier nesting
  3. proc und*(a: NimNode; b: NimNode): NimNode {.compileTime.} =
  4. a.add(b)
  5. result = a
  6. proc und*(a: NimNode; b: varargs[NimNode]): NimNode {.compileTime.} =
  7. a.add(b)
  8. result = a
  9. proc `^`*(a: string): NimNode {.compileTime.} =
  10. ## new ident node
  11. result = newIdentNode(a)
  12. proc `[]`*(a, b: NimNode): NimNode {.compileTime.} =
  13. ## new bracket expression: node[node] not to be confused with node[indx]
  14. result = newNimNode(nnkBracketExpr).und(a, b)
  15. proc `:=`*(left, right: NimNode): NimNode {.compileTime.} =
  16. ## new Asgn node: left = right
  17. result = newNimNode(nnkAsgn).und(left, right)
  18. proc lit*(a: string): NimNode {.compileTime.} =
  19. result = newStrLitNode(a)
  20. proc lit*(a: int): NimNode {.compileTime.} =
  21. result = newIntLitNode(a)
  22. proc lit*(a: float): NimNode {.compileTime.} =
  23. result = newFloatLitNode(a)
  24. proc lit*(a: char): NimNode {.compileTime.} =
  25. result = newNimNode(nnkCharLit)
  26. result.intval = a.ord
  27. proc emptyNode*(): NimNode {.compileTime.} =
  28. result = newNimNode(nnkEmpty)
  29. proc dot*(left, right: NimNode): NimNode {.compileTime.} =
  30. result = newNimNode(nnkDotExpr).und(left, right)
  31. proc prefix*(a: string, b: NimNode): NimNode {.compileTime.} =
  32. result = newNimNode(nnkPrefix).und(newIdentNode(a), b)
  33. proc quoted2ident*(a: NimNode): NimNode {.compileTime.} =
  34. if a.kind != nnkAccQuoted:
  35. return a
  36. var pname = ""
  37. for piece in 0..a.len - 1:
  38. pname.add($a[piece].ident)
  39. result = ^pname
  40. macro `?`(a: untyped): untyped =
  41. ## Character literal ?A #=> 'A'
  42. result = ($a[1].ident)[0].lit
  43. ## echo(?F,?a,?t,?t,?y)
  44. when false:
  45. macro foo(x: untyped) =
  46. result = newNimNode(nnkStmtList)
  47. result.add(newNimNode(nnkCall).und(!!"echo", "Hello thar".lit))
  48. result.add(newCall("echo", lit("3 * 45 = "), (3.lit.infix("*", 45.lit))))
  49. let stmtlist = x[1]
  50. for i in countdown(len(stmtlist)-1, 0):
  51. result.add(stmtlist[i])
  52. foo:
  53. echo y, " * 2 = ", y * 2
  54. let y = 320