I'm trying to change the type of integer literals in a const block using a macro. The macro looks like this:
import macros
macro uint32_const_type(s: stmt): stmt =
proc walk(s: NimNode) {. compiletime .} =
case s.kind:
of nnkStmtList:
for node in s:
walk(node)
of nnkConstSection:
walk(s[0])
of nnkConstDef:
let new_node = newNimNode(nnkUInt32Lit)
new_node.intVal = s[2].intVal
s[2] = new_node
else:
discard
walk(s)
result = s
compiling and running the following program, which uses the above macro
import typetraits
uint32_const_type:
const
a = 0
const
b = 0'u32
const
c = 0
echo a.type.name
echo b.type.name
echo c.type.name
results in this output (which is not what I was expecting):
$ nim c -r const_macro.nim
int
uint32
int
dumping the tree and using repr before and after the call to walk in the macro produces the following:
ConstSection
ConstDef
Sym "a"
Empty
IntLit 0
const
a = 0
ConstSection
ConstDef
Sym "a"
Empty
UInt32Lit
const
a = 0'u32
which would lead me to expect that the output I would get from running the above program should be: uint32, uint32, int?. Should this work, or am I doing something wrong in the definition of the macro? I am pretty new to Nim, so feel free to let me know if I'm doing anything stupid ;)
Why? I was trying to mangle c2nim's output to make a bunch of const literals (generated from c defines) unsigned by being lazy and doing this:
uint32_const_type:
include c2nimmed_file
for various low-level hardware related header files.
Works for me on devel. However, the bit with the include does not.
$ nim c -r test1
uint32
uint32
int