Clause
← Toda a documentação

Traduzido do original em inglês · 06042fa · 2026-10-09 · Ler em inglês

Diferenças em relação ao Erlang/OTP

Comportamento observável em que o Clause difere conscientemente do OTP 29 fixado (maint-29, ver otp-reference.md). Cada entrada remete para o contrato que a rege. Uma entrada é removida quando a diferença é corrigida. As funcionalidades ainda não implementadas (assinaladas como notimpl) não constam aqui; ver features.md e o plano.

Maps

DiferençaOTPClauseResponsável
Ordem do gerador de map (K := V <- M)Os maps planos (até 32 chaves) são percorridos pela ordem das chaves, mas as chaves átomo pela ordem da tabela de átomos, que varia entre execuções da VM; os maps maiores pela ordem de hashSempre a ordem canónica das chaves (ordem dos termos)padrões
Conteúdo de bad_generators de um gerador de map num grupo zipO seu iterador: cadeia {K, V, Next} terminada em none, pela ordem do OTPA mesma cadeia, construída pela ordem canónica das chavespadrões
Impressão de maps (erlang:display/1, ~w, ~p)Ordem da disposição interna (ordem da tabela de átomos para chaves átomo, ordem de hash acima de 32 chaves)Ordem das chaves do map, como ~kw do OTPtermos
Impressão de native records (erlang:display/1)Campos pela ordem do índice na tabela de átomosOrdem da definição, como ~wnative records
== entre native records cujos campos diferem apenas como inteiro/floatO compilador pode reduzi-lo a =:= (falso)Comparação numérica (verdadeiro)native records
Impressão de funs locais (#Fun<M.Index.Uniq>)Índice da numeração de lambdas do compilador, Uniq um hash do código do móduloÍndice das funs locais do módulo pela ordem do código-fonte, Uniq sempre 0funs
Ordem de duas funs locais de um móduloPelo índice do OTPPelo índice na ordem do código-fonte, pelo que funs de funções diferentes podem ordenar-se de outra formafuns
Nomes de funs anónimas nos rastreios de pilha (-f/1-fun-N-)N da numeração do compiladorN conta as funs de f/1 pela ordem do código-fontefuns
Uma fun anónima no valor por omissão de um campo de recordCada local de construção expande a sua própria cópia: funs de dois locais são diferentesUma única fun para o valor por omissão: funs de qualquer local de construção são iguaisfuns
Ordem dos valores capturados de funs criadas dentro de comprehensionsVariáveis livres da função gerada para a comprehensionOrdem de definição na função envolvente; visível apenas ao comparar duas dessas funsfuns

Pids, referências e processos

DiferençaOTPClauseResponsável
Números de pidO primeiro processo do utilizador é aproximadamente <0.80.0>; os números são reutilizados quando a tabela de pids dá a voltaO primeiro processo é <0.1.0>; os números vêm de uma única sequência e nunca são reutilizadostermos
Código após spawn(Fun) de uma fun de outra aridadeA análise de tipos do compilador pode considerar inalcançável o código após a chamada e eliminá-lo, pelo que o chamador devolve o pid de imediatoO chamador prossegue; apenas o novo processo falha com {badarity, {Fun, []}}processos
Formatação de um termo grande (io:format/1,2)Corre em código Erlang (io_lib) e no group leader, pelo que o processo pode ser preemptado durante a formataçãoCorre até ao fim numa única chamada de builtin; os outros processos esperambuiltins
Flags de process_flag/2trap_exit, priority, message_queue_data, min_heap_size e outrasApenas trap_exit; qualquer outra flag lança badargprocessos
Ordem dos relatórios de erro de processos que falham ao mesmo tempoOrdem do loggerA ordem pela qual os respetivos workers os terminamprocessos
Sinais para um processo em execução noutro escalonadorColocados na sua fila de sinais e tratados mais tarde, enquanto o emissor prossegueO emissor espera até ao fim da fatia de tempo do destino e atua então de imediato; observável apenas na temporizaçãoprocessos
list_to_port/1 de um número nunca emitidoDevolve um termo portbadarg: só são admitidos os ports que este programa abriuports
Valores de port_info/1,2id é um índice de tabela; memory, queue_size, locking descrevem o driverid é o número do port; memory e queue_size são 0; locking é port_levelports
Escrita num ficheiro aberto só para leitura{error, eacces} no Windows, {error, ebadf} nos restantes{error, ebadf} em todo o ladoports
io:get_line, io:get_chars e file:read/2 em modo lista com entrada não ASCIICaracteres descodificados segundo a codificação do dispositivoUm elemento da lista por byteports
Resultado de os:cmd/1Caracteres Unicode descodificados da saídaOs bytes da saídaports
Argumentos vazios de {spawn_executable, F} no WindowsOmitidos da linha de comandosPassados como ""ports
{exit_status, S} e eof de um programa lançadoOrdem não especificada, exit_status pode chegar antes dos últimos dadosDepois de todos os dados, antes de eofports
Ports ocupadosUm port com demasiada saída em fila suspende os emissores; force de port_command/3 funciona nos drivers que o permitemA saída nunca suspende; force lança notsup em todos os driversports
{active, N} de socketsUm inteiro N conta as mensagens antes de {tcp_passive, S}exit(badarg); apenas true, false e onceports
Opções de afinação de sockets (nodelay, keepalive, send_timeout, delay_send, buffers)Aplicadas; outras opções inet (header, {packet, line}, http, ...) funcionamAs opções de afinação listadas são aceites e não aplicadas; as outras opções dão exit(badarg)ports
Razões de erro de socketsTodas as razões POSIX que o sistema indicaAs comuns (econnrefused, eaddrinuse, econnreset, etimedout, ...); as restantes são eioports
Entrada de um port enquanto o processo ligado retém 1024 mensagens e pode correrContinua a ler e a entregarDeixa de entregar até ao fim da fatia de tempo do processo; acima de 64 KiB retidos, deixa de ler, pelo que o programa que escreve fica bloqueadoports
gen_tcp:close/1 com saída em filaEspera, até ao valor de linger/send_timeout, que a saída seja enviadaRegressa de imediato; a thread de E/S envia a saída em fila e depois fechaports
Tipos de monitor/2process, port, time_offsetprocess e port; time_offset lança badarg (não há alterações do desvio de tempo)processos
exit/2, exit_signal/2 para uma referênciaEnvia para o alias do processo, se a referência for um alias ativoNada (não há aliases)processos
Números de referênciaCombinam um identificador de escalonador e contadores por escalonador (#Ref<0.178111994.4235460610.214105>)Um único contador para todo o programa (#Ref<0.0.0.1>), pelo que as referências se ordenam por criaçãotermos

Erros, rastreios de pilha e relatórios

DiferençaOTPClauseResponsável
Localizações nos rastreios de pilha[{file, F}, {line, L}], error_info para error/3Sempre []; sem error_infoABI
Frame superior de function_clauseLista de argumentosAridadeABI
Frame superior de undef{M, F, Args, []} da função em faltaO frame da função chamadorafuns
Frames de BIFs/operadores que falhamPresentes ({erlang, '+', Args, ...})Ausentes; nada abaixo da função de entradaABI
Tabela de átomos cheia (list_to_atom/1)O emulador aborta (no more index entries in atom_tab) e escreve um crash dumpclau: runtime failure: entry call failed: resource_limit, código de saída 70builtins
list_to_integer/1,2 com caracteres acima de 255Os primeiros dígitos usam apenas o byte inferior de cada carácter ([16#131] é 1)badargbuiltins
erlang:function_exported/3 de uma BIFVerdadeiro para todas as BIFs do emuladorVerdadeiro apenas para os builtins que este runtime fornecebuiltins
Relatórios de erro de processos que falharamEnviados ao logger, escritos mais tarde pelo seu handler por omissão (na saída padrão sob erl, frequentemente perdidos quando um escript termina primeiro)Escritos em stderr quando o processo termina, antes de qualquer saída posteriorprocessos
Chamadas a funções que nunca regressamCompiladas como chamadas de cauda (o chamador não aparece no rastreio)Chamadas normais (o chamador aparece)ABI
Memória do anfitrião esgotadaO emulador indica que não consegue alocar memória, escreve um crash dump e paraclau: runtime failure: entry call failed: out_of_memory, código de saída 70, sem dumpheap do runtime
Limite de memória por processomax_heap_size (em palavras, heap e pilha) mata o processo com a razão killed e regista um relatório de erro--max-heap / --max-stack (bytes) e o --max-memory global do runtime fazem falhar o processo que pede memória com resource_limit: clau: runtime failure: entry call failed: resource_limit, código de saída 70heap do runtime
Argumentos do programaescript passa todos os argumentos a main/1; as flags do emulador (+t) vêm de %%! ou de ERL_FLAGSAs opções do runtime iniciais (--max-atoms, --max-heap, --max-stack, --max-memory, --args-file, --) são retiradas primeiro; CLAUSE_FLAGS contém as mesmas opçõesexecutáveis
Exceção não apanhada num módulo de entrada normalescript termina com 127Termina com 1 e uma linha uncaught exception <class>: <reason> (os códigos-fonte escript mantêm 127)executáveis
Diagnósticos do compiladorFormulação do erl_lint (variable 'X' is unbound) e avisosFormulação própria (unbound variable X); os avisos de lint do OTP na maioria não são emitidos (também campos desconhecidos de native records em acesso, atualização e padrões)análise semântica

Casos-limite da linguagem

DiferençaOTPClauseResponsável
Segmento inteiro mais largo do que o limite de inteiros, valor acima dele (<<V:4194241>> só com uns)O JIT x86 faz a correspondência com um termo inválido; usá-lo faz a VM falharSem correspondênciatermos
Grupo zip cujos geradores relaxados e estritos partilham uma variávelO teste de salto mantém as variáveis dos padrões estritos nos padrões relaxadosUm passo rejeitado é saltado sempre que os padrões estritos correspondem por si sópadrões
Chamar uma fun externa, M:F(Args) ou apply/3 de um módulo fora do programaCarrega o módulo a partir do code path, undef se não existirundef; os módulos de biblioteca só entram no programa quando este os nomeia com um átomo literalfuns, biblioteca
lists e mapsOs módulos completos; maps:keys/1, values/1, to_list/1, fold/3 seguem a ordem interna do map (ordem da tabela de átomos para chaves átomo, ordem de hash acima de 32 chaves)O subconjunto da biblioteca; as funções de map seguem a ordem das chavesbiblioteca
Ficheiros sem #! passados como escriptsescript file.erl salta a primeira linhaCompilados como módulos normaisexecutáveis
Escripts com beam pré-compilado e em arquivoCorremNão suportadosexecutáveis
Um -spec cujos tipos não partilham nenhum valor com o resultado inferido, o domínio de entrada ou os argumentos de uma chamadaCompila; o Dialyzer pode avisarErro de compilação que indica os tipos declarados e inferidosanálise semântica

io

DiferençaOTPClauseResponsável
Sequências de controlo ~e ~f ~g ~x ~X ~+ ~# ~W ~P, modificador KFormatadasbadargio
~p de contentores aninhados a mais de 256 níveisImpressossystem_limitio
Larguras de campo e precisão de ~ts com caracteres combinatórios ou \r\nContam grupos de grafemasContam pontos de códigoio
Precisão ou contagem de preenchimento negativa (~.*c com -1)Ciclo infinitobadargio
Funções io além de format/1,2, put_chars/1Existemunknown module ioio