File: tgettype2.nim

package info (click to toggle)
nim 2.2.0-1
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 1,911,644 kB
  • sloc: sh: 24,603; ansic: 1,761; python: 1,492; makefile: 1,013; sql: 298; asm: 141; xml: 13
file content (99 lines) | stat: -rw-r--r-- 2,668 bytes parent folder | download | duplicates (4)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
discard """
output: '''
############
#### gt ####
############
gt(Foo):	typeDesc[Foo]
gt(Bar):	typeDesc[Bar]
gt(Baz):	typeDesc[int]
gt(foo):	distinct[int]
gt(bar):	distinct[int]
gt(baz):	int, int
gt(v):	seq[int]
gt(vv):	seq[float]
gt(t):	distinct[tuple[int, int]]
gt(tt):	distinct[tuple[float, float]]
gt(s):	distinct[tuple[int, int]]
#############
#### gt2 ####
#############
gt2(Foo): 	Foo
gt2(Bar): 	Bar
gt2(Baz): 	Baz
gt2(foo): 	Foo
gt2(bar): 	Bar
gt2(baz): 	Baz
gt2(v): 	seq[int]
gt2(vv): 	seq[float]
gt2(t): 	MyType[system.int]
gt2(tt): 	MyType[system.float]
gt2(s): 	MySimpleType
'''
"""

import macros, typetraits

type Foo = distinct int
type Bar = distinct int
type Baz = int

let foo = 0.Foo
let bar = 1.Bar
let baz = 2.Baz

type MyType[T] = distinct tuple[a,b:T]
type MySimpleType = distinct tuple[a,b: int]

var v: seq[int]
var vv: seq[float]
var t: MyType[int]
var tt: MyType[float]
var s: MySimpleType

echo "############"
echo "#### gt ####"
echo "############"

macro gt(a: typed): string =
  let b = a.getType
  var str = "gt(" & $a & "):\t" & b.repr
  if b.kind == nnkSym: # bad predicat to check weather the type has an implementation
    str = str & ", " & b.getType.repr  # append the implementation to the result
  result = newLit(str)

echo gt(Foo) # typeDesc[Foo]
echo gt(Bar) # typeDesc[Bar]
echo gt(Baz) # typeDesc[int]     shouldn't it be typeDesc[Baz]?
echo gt(foo) # distinct[int]     I would prefer Foo, distinct[int]
echo gt(bar) # distinct[int]     I would prefer Bar, distinct[int]
echo gt(baz) # int, int          I would prefer Baz, int

echo gt(v)   # seq[int], ok
echo gt(vv)  # seq[float], ok
echo gt(t)   # MyType, distinct[tuple[int, int]]      I would prefer MyType[int],   distinct[tuple[int, int]]
echo gt(tt)  # MyType, distinct[tuple[float, float]]  I would prefer MyType[float], distinct[tuple[int, int]]
echo gt(s)   # distinct[tuple[int, int]]              I would prefer MySimpleType, distinct[tuple[int,int]]

echo "#############"
echo "#### gt2 ####"
echo "#############"

# get type name via typetraits

macro gt2(a: typed): string =
  let prefix = "gt2(" & $a & "): \t"
  result = quote do:
    `prefix` & `a`.type.name

echo gt2(Foo) # Foo  shouldn't this be typeDesc[Foo] ?
echo gt2(Bar) # Bar  shouldn't this be typeDesc[Bar] ?
echo gt2(Baz) # Baz  shouldn't this be typeDesc[Baz] ?
echo gt2(foo) # Foo
echo gt2(bar) # Bar
echo gt2(baz) # Baz

echo gt2(v)   # seq[int]
echo gt2(vv)  # seq[float]
echo gt2(t)   # MyType[system.int]      why is it system.int and not just int like in seq?
echo gt2(tt)  # MyType[system.float]    why is it system.float and not just float like in seq?
echo gt2(s)   # MySimpleType