在Scala中,您可以轻松地将变量内容嵌入字符串中,如下所示:
这在Nim中是否可能?如果是,怎么做?
val nm = "Arrr"
println(s"my name is , $nm")
这在Nim中是否可能?如果是,怎么做?
val nm = "Arrr"
println(s"my name is , $nm")
添加自己的字符串插值并不特别困难,因为标准库已经提供了大部分必要的组件:
import macros, parseutils, sequtils
macro i(text: string{lit}): expr =
var nodes: seq[PNimrodNode] = @[]
# Parse string literal into "stuff".
for k, v in text.strVal.interpolatedFragments:
if k == ikStr or k == ikDollar:
nodes.add(newLit(v))
else:
nodes.add(parseExpr("$(" & v & ")"))
# Fold individual nodes into a statement list.
result = newNimNode(nnkStmtList).add(
foldr(nodes, a.infix("&", b)))
const
multiplier = 3
message = i"$multiplier times 2.5 is ${multiplier * 2.5}"
echo message
# --> 3 times 2.5 is 7.5
proc blurb(a: int): string =
result = i"param a ($a) is not a constant"
when isMainModule:
for f in 1..10:
echo f.blurb
interpolatedFragments
在类似 "${a & "}" & b}"
这样的字符串中会出现错误,因为它只计算大括号。strfmt
目前也存在这个问题,但可以通过将 interpolatedFragments
设为 compileTime
迭代器来解决,从而允许使用 parseExpr
来正确解析表达式。 - bluenote10