Comparação com JavaScript
O que muda para quem vem de JavaScript ou TypeScript.
A tabela#
| JavaScript / TypeScript | DataForge | Nota |
|---|---|---|
let x = 1 | x := 1 | |
const X = 1 | steady X := 1 | |
console.log(x) | out x | |
` ${x} ` | $"{x}" | |
if/else if/else | given/orif/otherwise | |
c ? a : b | a given c otherwise b | ordem diferente |
switch/case | match/point | sem fall-through |
for (const x of xs) | cycle x in xs: | |
for (let i=1; i<=5; i++) | cycle i from 1 to 5: | |
while | persist | |
do…while | perform … persist | |
break/continue | halt/skip | |
function/return | action/yield | |
function* + yield | stream action + emit | |
(x) => e | lambda x: e | |
class/new | blueprint/spawn | |
this | self | |
super | root | |
interface | record ou trait | record é valor; trait é contrato |
enum (TS) | enum | |
import/export | adopt/relay | |
try/catch/finally | monitor/handle/ensure | |
throw | trigger | |
true/false/null | yes/no/void | |
?. | ?. | igual |
?? | ?? | igual |
... | ... | igual |
.filter().map().reduce() | >> sift >> morph >> distill | |
Math.floor(a/b) | a ~/ b | |
@decorator | mark @decorator | |
await | await | sí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 ?? 8080A 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 valorTipagem#
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 editorTraduzindo#
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)}"