Строковая интерполяция

В scala вы легко включаете содержимое переменной в строку, например так:

val nm = "Arrr"
println(s"my name is , $nm")

Возможно ли это в Nim, и в таком случае как?

3 ответа

Решение

Модуль strfmt имеет некоторую экспериментальную интерполяцию строк:

import strfmt
let nm = "Arrr"
echo interp"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

Модуль strformat теперь считается лучшим способом сделать это:

      import strformat
let nm = "Arrr"
echo fmt"my name is , {nm}"
Другие вопросы по тегам