Pular para o conteúdo

Especificação §25

Decisões recusadas

language-design.md §25 · 21 linhas · 2 min de leitura

Capacidades consideradas e descartadas conscientemente, registradas aqui pra não ressurgirem no futuro. Diferente dos em-aberto (ainda não decididos), estas estão fechadas contra. (Algumas rejeições de detalhe têm contexto na própria seção de origem: a resumability do Qwik na seção 20, a sintaxe de assembly normalizada à la Plan9 na seção 18.)

Conscientemente fora, por duas razões convergentes. A primeira: a compensação reversa é construtível com defer dentro do catch (registra o desfazer no caminho de erro; a LIFO do defer dá a ordem reversa), logo não é primitiva. A segunda: a versão durável (compensar após o crash do nó, quando a pilha some) exige estado externo persistido (banco, log de saga), explicitamente fora do escopo da linguagem. É construível em biblioteca sobre o que já existe; não vira construto.

Dois @shared foram cogitados, e ambos saíram. O primeiro: memória compartilhada entre processos (seção 5); todo caso de uso é resolvido por @transfer mais channel, sem abrir vetor de corrupção entre heaps, e o padrão é um processo que detém o dado e serve via channel. O segundo: marcador na extensão de UI; como @server/@client viraram restrições (você anota só o que é preso a um lado, e o resto atravessa por padrão), um terceiro marcador “roda nos dois” seria redundante, porque “atravessar” já é o default, não um estado a marcar.

Cogitado no início do design de @supervisor (seção 8) como um defer que só rodaria no caminho de erro. Descartado em favor do sistema de catch: um defer dentro do catch já é “defer no fracasso”, porque o catch é o caminho de erro, então qualquer defer ali só roda quando algo falha. Não precisa de construto novo.

O transpile da extensão de UI vai numa direção só (nosso .mkoui para JS, seção 20). O inverso, compilar JS/TS para a nossa linguagem ou nativo, foi descartado de propósito: seria um cavalo de Troia que sequestra o propósito da linguagem (a comunidade JS a usaria só como “JS compilado pra nativo”, ignorando o resto), além de exigir um front-end de TypeScript inteiro, de custo enorme.