strformat: introduce 'fmt' as an alias for '%'; ensure overloading resolution produces a clash between strformat.'%' and json.'%'

This commit is contained in:
Araq
2018-01-12 01:27:24 +01:00
parent 425f221440
commit 66634fe1a0

View File

@@ -226,7 +226,7 @@ template callFormatOption(res, arg, option) {.dirty.} =
else:
format($arg, option, res)
macro `%`*(pattern: string{lit}): untyped =
macro `%`*(pattern: string): untyped =
## For a specification of the ``%`` macro, see the module level documentation.
runnableExamples:
template check(actual, expected: string) =
@@ -407,6 +407,18 @@ macro `%`*(pattern: string{lit}): untyped =
when defined(debugFmtDsl):
echo repr result
template fmt*(pattern: string): untyped =
## An alias for ``%``. Helps to avoid conflicts with ``json``'s ``%`` operator.
## **Examples:**
##
## .. code-block:: nim
## import json
## import strformat except `%`
##
## let example = "oh, look no conflicts anymore"
## echo fmt"{example}"
%pattern
proc mkDigit(v: int, typ: char): string {.inline.} =
assert(v < 26)
if v < 10:
@@ -618,3 +630,8 @@ proc format*(value: string; specifier: string; res: var string) =
"invalid type in format string for string, expected 's', but got " &
spec.typ)
res.add alignString(value, spec.minimumWidth, spec.align, spec.fill)
when isMainModule:
import json
doAssert fmt"{'a'} {'b'}" == "a b"