tgettype2.nim 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. import macros, typetraits
  2. type Foo = distinct int
  3. type Bar = distinct int
  4. type Baz = int
  5. let foo = 0.Foo
  6. let bar = 1.Bar
  7. let baz = 2.Baz
  8. type MyType[T] = distinct tuple[a,b:T]
  9. type MySimpleType = distinct tuple[a,b: int]
  10. var v: seq[int]
  11. var vv: seq[float]
  12. var t: MyType[int]
  13. var tt: MyType[float]
  14. var s: MySimpleType
  15. echo "############"
  16. echo "#### gt ####"
  17. echo "############"
  18. macro gt(a: typed): string =
  19. let b = a.getType
  20. var str = "gt(" & $a & "):\t" & b.repr
  21. if b.kind == nnkSym: # bad predicat to check weather the type has an implementation
  22. str = str & ", " & b.getType.repr # append the implementation to the result
  23. result = newLit(str)
  24. echo gt(Foo) # typeDesc[Foo]
  25. echo gt(Bar) # typeDesc[Bar]
  26. echo gt(Baz) # typeDesc[int] shouldn't it be typeDesc[Baz]?
  27. echo gt(foo) # distinct[int] I would prefer Foo, distinct[int]
  28. echo gt(bar) # distinct[int] I would prefer Bar, distinct[int]
  29. echo gt(baz) # int, int I would prefer Baz, int
  30. echo gt(v) # seq[int], ok
  31. echo gt(vv) # seq[float], ok
  32. echo gt(t) # MyType, distinct[tuple[int, int]] I would prefer MyType[int], distinct[tuple[int, int]]
  33. echo gt(tt) # MyType, distinct[tuple[float, float]] I would prefer MyType[float], distinct[tuple[int, int]]
  34. echo gt(s) # distinct[tuple[int, int]] I would prefer MySimpleType, distinct[tuple[int,int]]
  35. echo "#############"
  36. echo "#### gt2 ####"
  37. echo "#############"
  38. # get type name via typetraits
  39. macro gt2(a: typed): string =
  40. let prefix = "gt2(" & $a & "): \t"
  41. result = quote do:
  42. `prefix` & `a`.type.name
  43. echo gt2(Foo) # Foo shouldn't this be typeDesc[Foo] ?
  44. echo gt2(Bar) # Bar shouldn't this be typeDesc[Bar] ?
  45. echo gt2(Baz) # Baz shouldn't this be typeDesc[Baz] ?
  46. echo gt2(foo) # Foo
  47. echo gt2(bar) # Bar
  48. echo gt2(baz) # Baz
  49. echo gt2(v) # seq[int]
  50. echo gt2(vv) # seq[float]
  51. echo gt2(t) # MyType[system.int] why is it system.int and not just int like in seq?
  52. echo gt2(tt) # MyType[system.float] why is it system.float and not just float like in seq?
  53. echo gt2(s) # MySimpleType