added test cases from strange loop event
This commit is contained in:
parent
429d337ef6
commit
9ab1a3c724
6 changed files with 152 additions and 0 deletions
57
tests/showoff/tformatopt.nim
Normal file
57
tests/showoff/tformatopt.nim
Normal file
|
|
@ -0,0 +1,57 @@
|
|||
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)
|
||||
Loading…
Add table
Add a link
Reference in a new issue