a Scala, si comprende facilmente il contenuto di una variabile all'interno di una stringa, come questo:String interpolazione
val nm = "Arrr"
println(s"my name is , $nm")
Questo è possibile in nim, e in quel caso, come?
a Scala, si comprende facilmente il contenuto di una variabile all'interno di una stringa, come questo:String interpolazione
val nm = "Arrr"
println(s"my name is , $nm")
Questo è possibile in nim, e in quel caso, come?
Il strfmt module presenta alcune sperimentale string interpolation:
import strfmt
let nm = "Arrr"
echo interp"my name is $nm"
Aggiungere il tuo string interpolation is not particularly had, dal momento che la libreria standard fornisce già la maggior parte dei pezzi necessari:
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
Questa è una buona soluzione personalizzata. Potrebbe funzionare senza variabili inizializzate in fase di compilazione? – Arrrrrrr
Si dovrebbe dire che 'interpolatedFragments' si interromperà su qualcosa come' "$ {a &"} "& b}', poiché conta solo le parentesi. "Strfmt' ne soffre anche questo, ma ci dovrebbe essere un modo per risolvere facendo di 'interpolatedFragments' un' iteratore 'compileTime', che permette di usare' parseExpr' per analizzare correttamente un'espressione. – bluenote10
@Arrrrrrrr perché no? La macro non fa nulla alle variabili, trasforma solo i letterali per rompere aggiungendo alcune linee "runtime" ad esempio: –
Impressionante, davvero dovrebbero essere inclusi nel libreria standard. – bluenote10
Sono d'accordo con bluenote10. Grazie def- – Arrrrrrr