Is there a way to get unmodified / uninterpreted source code (as either string or AST) of an expression in a macro?
motivation 1: to allow writing logging functions that show exact expression on left hand side, eg: mylog(1+1) # prints 1+1=2 motivation 2: to allow writing smart assert function that shows values of expression in assert when it failed, eg: myassert(1+1==3) #errors with: assert failed: 1+1(=2) == 3(3) in Nim I wasn't able to make it work with toStrLit as it seems to do const-folding before it's being passed as AST, so my implementations of mylog and myassert only work well with runtime expressions that aren't const-folded: macro mylog(x:typed): typed = result = newNimNode(nnkStmtList, x) result.add(newCall("write", newIdentNode("stdout"), toStrLit(x))) result.add(newCall("write", newIdentNode("stdout"), newStrLitNode(":"))) result.add(newCall("writeLine", newIdentNode("stdout"), x)) var x=1 mylog(x+1) # x + 1:2 (OK but I'd rather want exact source code with spacing eg: `x+1:2`) mylog(1+1) # 2:2 (not OK, I want: 1+1: 2) NOTE: In D I had a PR that achieved exactly that: [https://github.com/dlang/dmd/pull/7821](https://github.com/dlang/dmd/pull/7821) ; you can see further motivations for this feature there.