Clause
← Toda la documentación

Traducido del original en inglés · 06042fa · 2026-10-09 · Leer en inglés

Diferencias con Erlang/OTP

Comportamiento observable en el que Clause difiere a sabiendas de la versión fijada OTP 29 (maint-29, véase otp-reference.md). Cada entrada enlaza con el contrato al que pertenece. Una entrada se elimina cuando la diferencia se corrige. Las funcionalidades aún no implementadas (notificadas como notimpl) no se enumeran aquí; véanse features.md y el plan.

Maps

DiferenciaOTPClauseResponsable
Orden del generador de map (K := V <- M)Los maps planos (hasta 32 claves) se recorren en orden de clave, pero las claves átomo en el orden de la tabla de átomos, que varía entre ejecuciones de la VM; los maps mayores en orden de hashSiempre el orden canónico de claves (orden de términos)patrones
Contenido de bad_generators de un generador de map en un grupo zipSu iterador: cadena {K, V, Next} que termina en none, en el orden de OTPLa misma cadena, construida en el orden canónico de clavespatrones
Impresión de maps (erlang:display/1, ~w, ~p)Orden de la disposición interna (orden de la tabla de átomos para claves átomo, orden de hash por encima de 32 claves)Orden de claves del map, como ~kw de OTPtérminos
Impresión de records nativos (erlang:display/1)Campos en el orden de índice de la tabla de átomosOrden de definición, como ~wrecords nativos
== entre records nativos cuyos campos solo difieren como entero/flotanteEl compilador puede plegarlo a =:= (false)Comparación numérica (true)records nativos
Impresión de funs locales (#Fun<M.Index.Uniq>)Índice según la numeración de lambdas del compilador, Uniq un hash del código del móduloÍndice de los funs locales del módulo en orden de código fuente, Uniq siempre 0funs
Orden de dos funs locales de un mismo móduloSegún el índice de OTPSegún el índice en orden de código fuente, por lo que funs de funciones distintas pueden ordenarse de otro modofuns
Nombres de funs anónimos en trazas de pila (-f/1-fun-N-)N según la numeración del compiladorN cuenta los funs de f/1 en orden de código fuentefuns
Un fun anónimo en el valor por defecto de un campo de recordCada punto de construcción expande su propia copia: los funs de dos puntos distintos no son igualesUn único fun para el valor por defecto: los funs de cualquier punto de construcción son igualesfuns
Orden de los valores capturados de funs creados dentro de comprehensionsVariables libres de la función generada para la comprehensionOrden de definición en la función contenedora; solo visible al comparar dos de esos funsfuns

Pids, referencias y procesos

DiferenciaOTPClauseResponsable
Números de pidEl primer proceso de usuario es aproximadamente <0.80.0>; los números se reutilizan cuando la tabla de pids da la vueltaEl primer proceso es <0.1.0>; los números provienen de una única secuencia y nunca se reutilizantérminos
Código tras spawn(Fun) de un fun de otra aridadEl análisis de tipos del compilador puede considerar inalcanzable el código posterior a la llamada y eliminarlo, de modo que el llamador devuelve el pid de inmediatoEl llamador continúa; solo el nuevo proceso falla con {badarity, {Fun, []}}procesos
Formateo de un término grande (io:format/1,2)Se ejecuta en código Erlang (io_lib) y en el group leader, por lo que el proceso puede ser desalojado durante el formateoSe ejecuta hasta el final en una sola llamada a un builtin; los demás procesos esperanbuiltins
Flags de process_flag/2trap_exit, priority, message_queue_data, min_heap_size y otrosSolo trap_exit; cualquier otro flag lanza badargprocesos
Orden de los informes de error de procesos que fallan al mismo tiempoOrden del loggerEl orden en que sus workers los terminanprocesos
Señales a un proceso que se ejecuta en otro planificadorSe encolan en su cola de señales y se procesan después, mientras el emisor continúaEl emisor espera a que termine la porción de tiempo del destino y luego actúa de inmediato; solo observable como diferencia de tiemposprocesos
list_to_port/1 de un número nunca emitidoDevuelve un término de puertobadarg: solo se admiten los puertos que este programa abriópuertos
Valores de port_info/1,2id es un índice de tabla; memory, queue_size, locking describen el driverid es el número de puerto; memory y queue_size valen 0; locking es port_levelpuertos
Escritura en un archivo abierto solo para lectura{error, eacces} en Windows, {error, ebadf} en los demás sistemas{error, ebadf} en todas partespuertos
io:get_line, io:get_chars y file:read/2 en modo lista con entrada no ASCIICaracteres decodificados según la codificación del dispositivoUn elemento de lista por bytepuertos
Resultado de os:cmd/1Caracteres Unicode decodificados de la salidaLos bytes de la salidapuertos
Argumentos vacíos de {spawn_executable, F} en WindowsSe descartan de la línea de órdenesSe pasan como ""puertos
{exit_status, S} y eof de un programa lanzadoOrden no especificado, exit_status puede llegar antes de los últimos datosDespués de todos los datos, antes de eofpuertos
Puertos ocupadosUn puerto con demasiada salida encolada suspende a los emisores; force de port_command/3 funciona en los drivers que lo permitenLa salida nunca suspende; force lanza notsup en todos los driverspuertos
{active, N} de socketsUn entero N cuenta mensajes antes de {tcp_passive, S}exit(badarg); solo true, false y oncepuertos
Opciones de ajuste de sockets (nodelay, keepalive, send_timeout, delay_send, búferes)Se aplican; otras opciones de inet (header, {packet, line}, http, ...) funcionanLas opciones de ajuste enumeradas se aceptan pero no se aplican; las demás opciones dan exit(badarg)puertos
Motivos de error de socketsTodo motivo POSIX que informe el sistemaLos habituales (econnrefused, eaddrinuse, econnreset, etimedout, ...); los demás son eiopuertos
Entrada de puerto mientras el proceso conectado retiene 1.024 mensajes y puede ejecutarseSigue leyendo y entregandoDeja de entregar hasta que termina la porción de tiempo del proceso; por encima de 64 KiB retenidos, deja de leer, de modo que el programa que escribe se bloqueapuertos
gen_tcp:close/1 con salida encoladaEspera, hasta el valor de linger/send_timeout, a que la salida se envíeRetorna de inmediato; el hilo de E/S envía la salida encolada y después cierrapuertos
Tipos de monitor/2process, port, time_offsetprocess y port; time_offset lanza badarg (no hay cambios de desfase horario)procesos
exit/2, exit_signal/2 a una referenciaEnvía al alias del proceso, si la referencia es un alias activoNada (no hay alias)procesos
Números de referenciaCombinan un identificador de planificador y contadores por planificador (#Ref<0.178111994.4235460610.214105>)Un único contador para todo el programa (#Ref<0.0.0.1>), por lo que las referencias se ordenan por creacióntérminos

Errores, trazas de pila e informes

DiferenciaOTPClauseResponsable
Ubicaciones en trazas de pila[{file, F}, {line, L}], error_info para error/3Siempre []; sin error_infoABI
Marco superior de function_clauseLista de argumentosAridadABI
Marco superior de undef{M, F, Args, []} de la función inexistenteEl marco de la función que llamafuns
Marcos de BIF/operadores que fallanPresentes ({erlang, '+', Args, ...})Ausentes; nada por debajo de la función de entradaABI
Tabla de átomos llena (list_to_atom/1)El emulador aborta (no more index entries in atom_tab) y escribe un volcado de memoria (crash dump)clau: runtime failure: entry call failed: resource_limit, código de salida 70builtins
list_to_integer/1,2 con caracteres por encima de 255Sus primeros dígitos usan solo el byte bajo de cada carácter ([16#131] es 1)badargbuiltins
erlang:function_exported/3 de un BIFVerdadero para todo BIF del emuladorVerdadero solo para los builtins que proporciona este runtimebuiltins
Informes de error de procesos que han falladoSe envían al logger y su manejador por defecto los escribe más tarde (en la salida estándar con erl, a menudo se pierden cuando un escript termina antes)Se escriben en stderr cuando el proceso termina, antes de cualquier salida posteriorprocesos
Llamadas a funciones que nunca retornanCompiladas como llamadas de cola (el llamador no aparece en la traza)Llamadas ordinarias (el llamador aparece)ABI
Memoria del sistema agotadaEl emulador informa de que no puede reservar memoria, escribe un volcado de memoria y se detieneclau: runtime failure: entry call failed: out_of_memory, código de salida 70, sin volcadoheap del runtime
Límite de memoria por procesomax_heap_size (en palabras, heap y pila) mata el proceso con motivo killed y registra un informe de error--max-heap / --max-stack (bytes) y --max-memory, global para todo el runtime, hacen fallar al proceso solicitante como resource_limit: clau: runtime failure: entry call failed: resource_limit, código de salida 70heap del runtime
Argumentos del programaescript pasa todos los argumentos a main/1; los flags del emulador (+t) provienen de %%! o de ERL_FLAGSLas opciones iniciales del runtime (--max-atoms, --max-heap, --max-stack, --max-memory, --args-file, --) se extraen primero; CLAUSE_FLAGS contiene las mismas opcionesejecutables
Excepción no capturada en un módulo de entrada ordinarioescript termina con código 127Termina con código 1 y una línea uncaught exception <class>: <reason> (los fuentes escript mantienen 127)ejecutables
Diagnósticos del compiladorRedacción de erl_lint (variable 'X' is unbound) y advertenciasRedacción propia (unbound variable X); las advertencias de lint de OTP en su mayoría no se emiten (tampoco las de campos desconocidos de records nativos en accesos, actualizaciones y patrones)semántica

Casos límite del lenguaje

DiferenciaOTPClauseResponsable
Segmento entero más ancho que el límite de enteros, con un valor que lo supera (<<V:4194241>> todo unos)El JIT de x86 encaja con un término inválido; usarlo bloquea la VMNo encajatérminos
Grupo zip cuyos generadores relajados y estrictos comparten una variableLa prueba de omisión mantiene las variables de los patrones estrictos en los patrones relajadosUn paso rechazado se omite siempre que los patrones estrictos encajen por sí solospatrones
Llamada a un fun externo, M:F(Args) o apply/3 de un módulo ajeno al programaCarga el módulo desde la ruta de código, undef si no existeundef; los módulos de biblioteca solo se incorporan al programa cuando este los nombra con un átomo literalfuns, biblioteca
lists y mapsLos módulos completos; maps:keys/1, values/1, to_list/1, fold/3 siguen el orden interno del map (orden de la tabla de átomos para claves átomo, orden de hash por encima de 32 claves)El subconjunto de la biblioteca; las funciones de map siguen el orden de clavesbiblioteca
Archivos sin #! pasados como escriptsescript file.erl omite la primera líneaSe compilan como módulos ordinariosejecutables
Escripts de beam precompilado y de archivoSe ejecutanNo soportadosejecutables
Un -spec cuyos tipos no comparten ningún valor con el resultado inferido, el dominio de entrada o los argumentos de una llamadaCompila; Dialyzer puede advertirError de compilación que nombra los tipos declarado e inferidoanálisis semántico

io

DiferenciaOTPClauseResponsable
Secuencias de control ~e ~f ~g ~x ~X ~+ ~# ~W ~P, modificador KSe formateanbadargio
~p de contenedores anidados a más de 256 nivelesSe imprimensystem_limitio
Anchos de campo y precisión de ~ts con caracteres combinables o \r\nCuentan clústeres de grafemasCuentan puntos de códigoio
Precisión o número de relleno negativos (~.*c con -1)Bucle infinitobadargio
Funciones de io distintas de format/1,2, put_chars/1Existenunknown module ioio