2015-04-17 21 views
5

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?

Odpowiedz

7

strfmt module oferuje jedne eksperymentalne string interpolation:

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

Awesome, to naprawdę powinno być zawarte w standardowa biblioteka. – bluenote10

+0

Zgadzam się z bluenote10. Dzięki def- – Arrrrrrr

4

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

To dobre niestandardowe rozwiązanie. Czy może działać bez zmiennych zainicjowanych podczas kompilacji? – Arrrrrrr

+0

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

+0

@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: –