Pular para o conteúdo

Operadores

Aritméticos, comparação, lógicos, coalescência, pertinência e a precedência completa.

Aritméticos#

dataforge
out 7 + 2      # 9
out 7 - 2      # 5
out 7 * 2      # 14
out 7 / 2      # 3.5    — sempre Float
out 7 % 2      # 1
out 7 ** 2     # 49
out 7 ~/ 2     # 3      — divisão inteira
dataforge
x := 7 // 2              # divisão inteira (dígito depois)
y := total // len(xs)    # divisão inteira (chamada depois)
z := 3  // marcar item   # COMENTÁRIO
w := a // b              # COMENTÁRIO

Comparação#

Cada operador tem duas grafias, equivalentes. A forma por palavra lê melhor em condições longas; a simbólica é mais compacta.

PalavraSímboloSignificado
is==igual
isnt / is not!=diferente
bigger>maior
smaller<menor
bigger_eq>=maior ou igual
smaller_eq<=menor ou igual

Comparações encadeadas#

Funcionam como em matemática — e o termo do meio é avaliado uma única vez:

dataforge
nota := 7.5
out 0 <= nota <= 10           # yes
out 1 smaller 5 smaller 10    # yes
out 10 < 5 < 20               # no

Lógicos#

dataforge
out yes and no      # no
out yes or no       # yes
out not yes         # no

and e or têm avaliação curta-circuito: o lado direito só é avaliado se necessário.

Coalescência e acesso seguro#

dataforge
config := void
out config ?? "padrao"          # "padrao"
out config?.porta ?? 8080       # 8080, sem estourar

?? só entra em ação quando o valor é `void`. no, 0 e "" são valores legítimos, e passam direto:

dataforge
out no ?? "padrao"     # no  — falso é um valor
out 0 ?? 99            # 0   — zero é um valor
out "" ?? "vazio"      # ""  — texto vazio é um valor

Essa distinção é o que separa ?? de um or: com or, todos os três cairiam no padrão.

Pertinência#

dataforge
out 2 in [1, 2, 3]              # yes  — elemento na lista
out "a" in "casa"               # yes  — subtexto
out "chave" in {"chave": 1}     # yes  — chave do vault
out 9 not in [1, 2, 3]          # yes

Em um Vault, in testa chaves, não valores — a mesma convenção de cycle k in vault.

Atribuição composta#

dataforge
x := 10
x += 5      # 15
x -= 3      # 12
x *= 2      # 24
x /= 4      # 6.0
x %= 4      # 2.0

Precedência#

Da mais alta para a mais baixa:

NívelOperadoresAssociatividade
1() [] . ?.esquerda
2**direita
3- + not (unários)direita
4* / % ~/esquerda
5+ -esquerda
6comparaçõesencadeável
7notdireita
8andesquerda
9oresquerda
10??esquerda
11given … otherwise (ternário)direita
12>>esquerda

As consequências que mais surpreendem:

dataforge
out 2 ** 3 ** 2    # 512, e não 64 — potência associa à direita
out -2 ** 2        # -4, e não 4 — o sinal aplica depois
out 2 + 3 * 4      # 14

A tabela completa está na Referência de precedência.