2017-11-22 8 views

답변

5

인수를 반복하는 varargs 매크로를 사용하여 노드의 문자열 리터럴과 해당 값을 모두 인쇄하는 AST를 생성 할 수 있습니다. 이런 식으로 뭔가 :

import macros 

macro debug*(n: varargs[typed]): untyped = 
    result = newNimNode(nnkStmtList, n) 
    for i in 0..n.len-1: 
    if n[i].kind == nnkStrLit: 
     # pure string literals are written directly 
     result.add(newCall("write", newIdentNode("stdout"), n[i])) 
    else: 
     # other expressions are written in <expression>: <value> syntax 
     result.add(newCall("write", newIdentNode("stdout"), toStrLit(n[i]))) 
     result.add(newCall("write", newIdentNode("stdout"), newStrLitNode(": "))) 
     result.add(newCall("write", newIdentNode("stdout"), n[i])) 
    if i != n.len-1: 
     # separate by ", " 
     result.add(newCall("write", newIdentNode("stdout"), newStrLitNode(", "))) 
    else: 
     # add newline 
     result.add(newCall("writeLine", newIdentNode("stdout"), newStrLitNode(""))) 

사용 예제 :

let x = 2 
let y = 3 
debug("hello", x, y, x*y) 

출력 :

hello, x: 1, y: 2, x * y: 6