1 //: Containers contain a fixed number of elements of different types. 2 3 :(before "End Mu Types Initialization") 4 //: We'll use this container as a running example in scenarios below. 5 type_ordinal point = put(Type_ordinal, "point", Next_type_ordinal++); 6 get_or_insert(Type, point); // initialize 7 get(Type, point).kind = CONTAINER; 8 get(Type, point).name = "point"; 9 get(Type, point).elements.push_back(reagent("x:number")); 10 get(Type, point).elements.push_back# Dump the contents of a NimNode import macros proc dumpit(n: NimNode): string {.compileTime.} = if n == nil: return "nil" result = $n.kind add(result, "(") case n.kind of nnkEmpty: discard # same as nil node in this representation of nnkNilLit: add(result, "nil") of nnkCharLit..nnkInt64Lit: add(result, $n.intVal) of nnkFloatLit..nnkFloat64Lit: add(result, $n.floatVal) of nnkStrLit..nnkTripleStrLit: add(result, $n.strVal) of nnkIdent: add(result, $n.ident) of nnkSym, nnkNone: assert false else: add(result, dumpit(n[0])) for j in 1..n.len-1: add(result, ", ") add(result, dumpit(n[j])) add(result, ")") macro dumpAST(n): untyped = # dump AST as a side-effect and return the inner node let n = callsite() echo dumpit(n) result = n[1] dumpAST: proc add(x, y: int): int = return x + y proc sub(x, y: int): int = return x - y