blob: f33ed6921eb233bbd3263e582441f925dd088073 (
plain) (
tree)
|
|
discard """
output: '''(a: 3
b: 4
s: abc
)'''
"""
import macros
proc invalidFormatString() =
echo "invalidFormatString"
template formatImpl(handleChar: expr) =
var i = 0
while i < f.len:
if f[i] == '$':
case f[i+1]
of '1'..'9':
var j = 0
i += 1
while f[i] in {'0'..'9'}:
j = j * 10 + ord(f[i]) - ord('0')
i += 1
result.add(a[j-1])
else:
invalidFormatString()
else:
result.add(handleChar(f[i]))
i += 1
proc `%`*(f: string, a: openArray[string]): string =
template identity(x: expr): expr = x
result = ""
formatImpl(identity)
macro optFormat{`%`(f, a)}(f: string{lit}, a: openArray[string]): expr =
result = newNimNode(nnkBracket)
let f = f.strVal
formatImpl(newLit)
result = nestList(!"&", result)
template optAdd1{x = y; add(x, z)}(x, y, z: string) =
x = y & z
proc `/&` [T: object](x: T): string =
result = "("
for name, value in fieldPairs(x):
result.add("$1: $2\n" % [name, $value])
result.add(")")
type
MyObject = object
a, b: int
s: string
let obj = MyObject(a: 3, b: 4, s: "abc")
echo(/&obj)
|