w Scala, łatwo zawierać treść zmiennej wewnątrz ciągu znaków, na przykład:interpolacja String
val nm = "Arrr"
println(s"my name is , $nm")
to możliwe w NIM, a w takim przypadku, w jaki sposób?
w Scala, łatwo zawierać treść zmiennej wewnątrz ciągu znaków, na przykład:interpolacja String
val nm = "Arrr"
println(s"my name is , $nm")
to możliwe w NIM, a w takim przypadku, w jaki sposób?
strfmt module oferuje jedne eksperymentalne string interpolation:
import strfmt
let nm = "Arrr"
echo interp"my name is $nm"
dodając własne string interpolation is not particularly had, ponieważ standardowa biblioteka już zapewnia najbardziej niezbędnych elementów:
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
To dobre niestandardowe rozwiązanie. Czy może działać bez zmiennych zainicjowanych podczas kompilacji? – Arrrrrrr
Należy wspomnieć, że "interpolatedFragmenty" będą łamać się na czymś takim jak "$ {a &"} "& b}", ponieważ tylko zlicza nawiasy klamrowe. "Strfmt" również cierpi z tego powodu, ale powinien istnieć sposób rozwiązania to przez uczynienie 'interpolatedFragments' iteratorem' compileTime', pozwalającym na użycie 'parseExpr' do prawidłowego przeanalizowania wyrażenia – bluenote10
@Arrrrrrr dlaczego by tego nie robił? Makro nie robi nic dla zmiennych, tylko przekształca literały w break je do konkatenacji.Dodano niektóre linie "uruchomieniowe" na przykład: –
Awesome, to naprawdę powinno być zawarte w standardowa biblioteka. – bluenote10
Zgadzam się z bluenote10. Dzięki def- – Arrrrrrr