trfc_341.nim 807 B

12345678910111213141516171819202122232425262728
  1. # test for https://github.com/nim-lang/RFCs/issues/341
  2. import std/json
  3. import std/jsonutils
  4. import std/macros
  5. macro fn1(a: untyped): string = newLit a.lispRepr
  6. doAssert fn1(a.?b.c) == """(DotExpr (Infix (Ident ".?") (Ident "a") (Ident "b")) (Ident "c"))"""
  7. template `.?`(a: JsonNode, b: untyped{ident}): JsonNode =
  8. a[astToStr(b)]
  9. proc identity[T](a: T): T = a
  10. proc timesTwo[T](a: T): T = a * 2
  11. template main =
  12. let a = (a1: 1, a2: "abc", a3: (a4: 2.5))
  13. let j = a.toJson
  14. doAssert j.?a1.getInt == 1
  15. doAssert j.?a3.?a4.getFloat == 2.5
  16. doAssert j.?a3.?a4.getFloat.timesTwo == 5.0
  17. doAssert j.?a3.identity.?a4.getFloat.timesTwo == 5.0
  18. doAssert j.identity.?a3.identity.?a4.identity.getFloat.timesTwo == 5.0
  19. doAssert j.identity.?a3.?a4.identity.getFloat.timesTwo == 5.0
  20. static: main()
  21. main()