Pular para o conteúdo

Interpolação

Strings com $ que embutem expressões, e como formatar saída legível.

Formato#

Depois de : vem o formato — a mesma mini-linguagem do format, para não haver uma notação a mais para consultar:

dataforge
x := 3.14159
out $"{x:.2f}"              // 3.14
out $"[{"ab":<10}]"         // [ab        ]
out $"[{42:>8}]"            // [      42]
out $"{1234567:,}"          // 1,234,567
out $"{0.5:.1%}"            // 50.0%

A forma#

dataforge
nome := "Ana"
idade := 30

out $"Ola {nome}, voce tem {idade} anos"

O prefixo $ liga a interpolação. Sem ele, {nome} sai literalmente.

LinguagemEquivalente
Pythonf"Ola, {nome}"
JavaScript` Ola, ${nome} `
C#$"Ola, {nome}"
Kotlin"Ola, $nome"

Por que o $ é obrigatório#

dataforge
out "{nome}"      # sai literalmente: {nome}
out $"{nome}"     # sai: Ana

Isso preserva código existente e permite escrever JSON, regex e templates de outros sistemas sem escapar nada.

O que cabe dentro#

Qualquer expressão:

dataforge
out $"{idade + 1}"                                  # aritmética
out $"{moeda(saldo)}"                               # chamada de ação
out $"{usuario["tags"][0]}"                         # índices e chaves
out $"{"par" given n % 2 is 0 otherwise "impar"}"   # ternário
out $"{[x * 2 cycle x in nums]}"                    # compreensão

Inclusive strings com aspas duplas dentro — o lexer acompanha o aninhamento.

Formatação segue a linguagem#

dataforge
out $"{yes} {no} {void}"     # "yes no void", não "True False None"

Os valores usam as mesmas regras de out: um record com toString usa o seu toString, uma lista sai como [1, 2, 3].

Chaves literais#

dataforge
out $"{{isso e literal}} e {nome} e interpolado"
# {isso e literal} e Ana e interpolado

Multilinha#

dataforge
out $"""
Relatorio de {mes}
{"-".repeat(30)}
Total: {total}
"""

Alinhar colunas#

pad_end para texto, pad_start para número:

dataforge
cycle p in produtos:
    out $"{p.nome.pad_end(12)}{str(p.qtd).pad_start(5)}{str(p.preco).pad_start(10)}"
saída
Mouse          15      80.0
Teclado         3     200.0

Comparando com concatenação#

dataforge
antigo := "Ola, " + nome + "! Voce tem " + str(idade) + " anos."
novo := $"Ola, {nome}! Voce tem {idade} anos."

A segunda tem menos ruído, menos + e nenhum str(). As duas produzem exatamente o mesmo texto.