2015-04-17 15 views
5

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?

risposta

7

Il strfmt module presenta alcune sperimentale string interpolation:

import strfmt 
let nm = "Arrr" 
echo interp"my name is $nm" 
+1

Impressionante, davvero dovrebbero essere inclusi nel libreria standard. – bluenote10

+0

Sono d'accordo con bluenote10. Grazie def- – Arrrrrrr

4

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 
+0

Questa è una buona soluzione personalizzata. Potrebbe funzionare senza variabili inizializzate in fase di compilazione? – Arrrrrrr

+0

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

+0

@Arrrrrrrr perché no? La macro non fa nulla alle variabili, trasforma solo i letterali per rompere aggiungendo alcune linee "runtime" ad esempio: –