Pular para o conteúdo

Condicionais

given, orif, otherwise, o ternário e a seleção múltipla com match.

given / orif / otherwise#

A estrutura condicional do DataForge. given lê-se "dado que":

dataforge
action classificar(n):
    given n bigger 0:
        yield "positivo"
    orif n smaller 0:
        yield "negativo"
    otherwise:
        yield "zero"

cycle n in [5, -3, 0]:
    out $"{n} -> {classificar(n)}"
saída
5 -> positivo
-3 -> negativo
0 -> zero

Pode haver quantos orif você precisar, e o otherwise é opcional.

A ordem importa#

Os ramos são testados de cima para baixo, e o primeiro verdadeiro vence. Coloque sempre o mais específico primeiro:

dataforge
action conceito(nota):
    given nota bigger_eq 9:
        yield "A"
    orif nota bigger_eq 7:      # só chega aqui se não for >= 9
        yield "B"
    orif nota bigger_eq 5:
        yield "C"
    otherwise:
        yield "D"

O ternário#

Para escolher entre dois valores, sem abrir um bloco:

dataforge
n := 4
rotulo := "par" given n % 2 is 0 otherwise "impar"
out rotulo

Lê-se: "este valor, dado que a condição vale, senão o outro". Associa à direita, então encadeia:

dataforge
n := 0
x := "positivo" given n bigger 0 otherwise "zero" given n is 0 otherwise "negativo"
out x

match — seleção múltipla#

Quando a decisão depende do formato do valor, e não de uma condição booleana, o match é a ferramenta:

dataforge
action dia(n):
    match n:
        point 1:
            yield "segunda"
        point 2:
            yield "terca"
        point 3:
            yield "quarta"
        default:
            yield "desconhecido"

out dia(1), dia(3), dia(9)

Diferente de um switch de C, não há fall-through: o ramo que casa executa e o match termina.

Alternativas com or#

dataforge
action tipo(n):
    match n:
        point 1 or 2 or 3:
            yield "pequeno"
        point 100 or 200:
            yield "redondo"
        default:
            yield "outro"

O match do DataForge vai muito além de comparar valores — ele desmonta estruturas, testa tipos e aceita guardas. Isso está em Pattern matching.

Verdadeiro e falso#

Em contexto booleano, estes valores são falsos:

  • void
  • no
  • 0 e 0.0
  • "" (texto vazio)
  • [] (lista vazia)
  • {} (vault vazio)

Todo o resto é verdadeiro. Ainda assim, comparar explicitamente costuma ler melhor:

dataforge
given len(itens) is 0:        # claro
given not itens:              # funciona, mas menos explícito