Pular para o conteúdo

Comparação com JavaScript

O que muda para quem vem de JavaScript ou TypeScript.

A tabela#

JavaScript / TypeScriptDataForgeNota
let x = 1x := 1
const X = 1steady X := 1
console.log(x)out x
` ${x} `$"{x}"
if/else if/elsegiven/orif/otherwise
c ? a : ba given c otherwise bordem diferente
switch/casematch/pointsem fall-through
for (const x of xs)cycle x in xs:
for (let i=1; i<=5; i++)cycle i from 1 to 5:
whilepersist
do…whileperform … persist
break/continuehalt/skip
function/returnaction/yield
function* + yieldstream action + emit
(x) => elambda x: e
class/newblueprint/spawn
thisself
superroot
interfacerecord ou traitrecord é valor; trait é contrato
enum (TS)enum
import/exportadopt/relay
try/catch/finallymonitor/handle/ensure
throwtrigger
true/false/nullyes/no/void
?.?.igual
????igual
......igual
.filter().map().reduce()>> sift >> morph >> distill
Math.floor(a/b)a ~/ b
@decoratormark @decorator
awaitawaitsíncrono por enquanto

Semelhanças que ajudam#

Se você vem de TypeScript, três coisas funcionam quase igual:

TypeScript
// TypeScript
const {nome, idade} = usuario;
const todos = [...a, ...b];
const config = {...padrao, ...usuario};
const porta = cfg?.servidor?.porta ?? 8080;
DataForge
{nome, idade} := usuario
todos := [...a, ...b]
config := {...padrao, ...usuario}
porta := cfg?.servidor?.porta ?? 8080

A diferença que mais confunde#

Em JavaScript, ?? só dispara em null e undefined. Em DataForge, só em void — a mesma ideia. Mas || do JavaScript dispara também em 0 e "", e DataForge não tem esse comportamento em `??`:

dataforge
0 ?? 99        # 0   — zero é um valor
"" ?? "x"      # ""  — texto vazio é um valor
no ?? yes      # no  — falso é um valor

Tipagem#

DataForge é dinamicamente tipado com anotações opcionais — mais próximo de JSDoc que de TypeScript. A diferença: as anotações são verificadas em tempo de execução também, não só estaticamente.

dataforge
action media(nums: Cluster) -> Float:
    yield sum(nums) / len(nums)

media("texto")     # erro na chamada, não só no editor

Traduzindo#

JavaScript
const aprovados = alunos.filter(a => a.nota >= 7);
const media = alunos.reduce((s, a) => s + a.nota, 0) / alunos.length;
console.log(`${aprovados.length} aprovados, media ${media.toFixed(2)}`);
DataForge
aprovados := alunos >> sift a: a.nota bigger_eq 7
media := alunos >> morph a: a.nota >> distill s, n: s + n 0
out $"{len(aprovados)} aprovados, media {round(media / len(alunos), 2)}"