Clause
← Toute la documentation

Traduit de l'original anglais · 06042fa · 2026-10-09 · Lire en anglais

Différences avec Erlang/OTP

Comportements observables pour lesquels Clause diffère sciemment de la version d'OTP 29 de référence (maint-29, voir otp-reference.md). Chaque entrée renvoie au contrat qui en est responsable. Retirer une entrée dès que la différence est corrigée. Les fonctionnalités pas encore implémentées (signalées par notimpl) ne figurent pas ici ; voir features.md et le plan.

Maps

DifférenceOTPClauseRéférence
Ordre d'un générateur de map (K := V <- M)Les maps plates (jusqu'à 32 clés) sont parcourues dans l'ordre des clés, mais les clés atomes dans l'ordre de la table des atomes, qui varie d'une exécution de la VM à l'autre ; les maps plus grandes dans l'ordre de hachageToujours l'ordre canonique des clés (ordre des termes)motifs
Contenu de bad_generators pour un générateur de map dans un groupe zipSon itérateur : une chaîne {K, V, Next} terminée par none, dans l'ordre d'OTPLa même chaîne, construite dans l'ordre canonique des clésmotifs
Affichage des maps (erlang:display/1, ~w, ~p)Ordre de la disposition interne (ordre de la table des atomes pour les clés atomes, ordre de hachage au-delà de 32 clés)Ordre des clés de la map, comme ~kw d'OTPtermes
Affichage des native records (erlang:display/1)Champs dans l'ordre d'index de la table des atomesOrdre de définition, comme ~wnative records
== entre native records dont les champs ne diffèrent que par entier/flottantLe compilateur peut le réduire à =:= (false)Comparaison numérique (true)native records
Affichage des funs locales (#Fun<M.Index.Uniq>)Index issu de la numérotation des lambdas par le compilateur, Uniq un hachage du code du moduleIndex parmi les funs locales du module dans l'ordre du source, Uniq toujours 0funs
Ordre de deux funs locales d'un même moduleSelon l'index d'OTPSelon l'index dans l'ordre du source, donc des funs de fonctions différentes peuvent être ordonnées différemmentfuns
Noms des funs anonymes dans les traces de pile (-f/1-fun-N-)N issu de la numérotation du compilateurN compte les funs de f/1 dans l'ordre du sourcefuns
Fun anonyme dans la valeur par défaut d'un champ de recordChaque site de construction développe sa propre copie : les funs de deux sites sont différentesUne seule fun pour la valeur par défaut : les funs de tous les sites de construction sont égalesfuns
Ordre des valeurs capturées des funs créées dans des comprehensionsVariables libres de la fonction générée pour la comprehensionOrdre de définition dans la fonction englobante ; visible uniquement en comparant deux telles funsfuns

Pids, références et processus

DifférenceOTPClauseRéférence
Numéros de pidLe premier processus utilisateur est environ <0.80.0> ; les numéros sont réutilisés quand la table des pids reboucleLe premier processus est <0.1.0> ; les numéros proviennent d'une seule séquence et ne sont jamais réutiliséstermes
Code après spawn(Fun) d'une fun d'une autre aritéL'analyse de types du compilateur peut considérer le code après l'appel comme inaccessible et le supprimer, de sorte que l'appelant renvoie le pid immédiatementL'appelant continue ; seul le nouveau processus échoue avec {badarity, {Fun, []}}processus
Formatage d'un grand terme (io:format/1,2)S'exécute en code Erlang (io_lib) et dans le group leader, le processus peut donc être préempté pendant le formatageS'exécute jusqu'au bout dans un seul appel de builtin ; les autres processus attendentbuiltins
Drapeaux de process_flag/2trap_exit, priority, message_queue_data, min_heap_size et d'autresSeulement trap_exit ; tout autre drapeau lève badargprocessus
Ordre des rapports d'erreur de processus qui plantent en même tempsOrdre du loggerL'ordre dans lequel leurs threads de travail les terminentprocessus
Signaux vers un processus s'exécutant sur un autre ordonnanceurPlacés dans sa file de signaux et traités plus tard, pendant que l'émetteur continueL'émetteur attend la fin de la tranche de temps de la cible, puis agit aussitôt ; observable seulement dans les délaisprocessus
list_to_port/1 d'un numéro jamais attribuéRenvoie un terme portbadarg : seuls les ports ouverts par ce programme sont admisports
Valeurs de port_info/1,2id est un index de table ; memory, queue_size, locking décrivent le piloteid est le numéro du port ; memory et queue_size valent 0 ; locking vaut port_levelports
Écriture dans un fichier ouvert en lecture seule{error, eacces} sous Windows, {error, ebadf} ailleurs{error, ebadf} partoutports
io:get_line, io:get_chars et file:read/2 en mode liste sur une entrée non ASCIICaractères décodés selon l'encodage du périphériqueUn élément de liste par octetports
Résultat de os:cmd/1Caractères Unicode décodés depuis la sortieLes octets de la sortieports
Arguments vides de {spawn_executable, F} sous WindowsSupprimés de la ligne de commandeTransmis sous forme ""ports
{exit_status, S} et eof d'un programme lancéOrdre non spécifié, exit_status peut arriver avant les dernières donnéesAprès toutes les données, avant eofports
Ports occupésUn port avec trop de sortie en attente suspend les émetteurs ; force de port_command/3 fonctionne sur les pilotes qui le permettentLa sortie ne suspend jamais ; force lève notsup sur tous les pilotesports
{active, N} des socketsUn entier N compte les messages avant {tcp_passive, S}exit(badarg) ; seulement true, false et onceports
Options de réglage des sockets (nodelay, keepalive, send_timeout, delay_send, tampons)Appliquées ; les autres options inet (header, {packet, line}, http, ...) fonctionnentLes options de réglage listées sont acceptées mais non appliquées ; les autres options donnent exit(badarg)ports
Raisons d'erreur des socketsToute raison POSIX signalée par le systèmeLes plus courantes (econnrefused, eaddrinuse, econnreset, etimedout, ...) ; les autres deviennent eioports
Entrée d'un port pendant que le processus connecté détient 1 024 messages et peut s'exécuterContinue à lire et à livrerCesse de livrer jusqu'à la fin de la tranche de temps du processus ; au-delà de 64 Kio détenus, cesse de lire, et le programme qui écrit se bloqueports
gen_tcp:close/1 avec de la sortie en attenteAttend, au plus selon le réglage linger/send_timeout, que la sortie soit partieRetourne immédiatement ; le thread d'E/S envoie la sortie en attente, puis fermeports
Types de monitor/2process, port, time_offsetprocess et port ; time_offset lève badarg (pas de changement de décalage temporel)processus
exit/2, exit_signal/2 vers une référenceEnvoie à l'alias de processus, si la référence en est un actifRien (pas d'alias)processus
Numéros de référenceCombinent un identifiant d'ordonnanceur et des compteurs par ordonnanceur (#Ref<0.178111994.4235460610.214105>)Un seul compteur pour tout le programme (#Ref<0.0.0.1>), les références sont donc ordonnées par créationtermes

Erreurs, traces de pile et rapports

DifférenceOTPClauseRéférence
Emplacements dans les traces de pile[{file, F}, {line, L}], error_info pour error/3Toujours [] ; pas d'error_infoABI
Cadre supérieur de function_clauseListe des argumentsAritéABI
Cadre supérieur de undef{M, F, Args, []} de la fonction manquanteLe cadre de la fonction appelantefuns
Cadres des BIF/opérateurs en échecPrésents ({erlang, '+', Args, ...})Absents ; rien sous la fonction d'entréeABI
Table des atomes pleine (list_to_atom/1)L'émulateur s'arrête (no more index entries in atom_tab) et écrit un crash dumpclau: runtime failure: entry call failed: resource_limit, code de sortie 70builtins
list_to_integer/1,2 avec des caractères au-delà de 255Ses premiers chiffres n'utilisent que l'octet de poids faible de chaque caractère ([16#131] donne 1)badargbuiltins
erlang:function_exported/3 d'une BIFVrai pour toute BIF de l'émulateurVrai seulement pour les builtins fournies par ce runtimebuiltins
Rapports d'erreur des processus plantésEnvoyés au logger, écrits plus tard par son gestionnaire par défaut (sur la sortie standard sous erl, souvent perdus quand un escript s'arrête avant)Écrits sur stderr à la fin du processus, avant toute sortie ultérieureprocessus
Appels de fonctions qui ne retournent jamaisCompilés en appels terminaux (appelant absent de la trace)Appels ordinaires (appelant présent)ABI
Mémoire de l'hôte épuiséeL'émulateur signale qu'il ne peut pas allouer de mémoire, écrit un crash dump et s'arrêteclau: runtime failure: entry call failed: out_of_memory, code de sortie 70, pas de dumptas du runtime
Plafond mémoire par processusmax_heap_size (en mots, tas et pile) tue le processus avec la raison killed et journalise un rapport d'erreur--max-heap / --max-stack (octets) et --max-memory, valable pour tout le runtime, font échouer le processus demandeur avec resource_limit : clau: runtime failure: entry call failed: resource_limit, code de sortie 70tas du runtime
Arguments du programmeescript transmet tous les arguments à main/1 ; les options de l'émulateur (+t) viennent de %%! ou de ERL_FLAGSLes options du runtime placées en tête (--max-atoms, --max-heap, --max-stack, --max-memory, --args-file, --) sont retirées d'abord ; CLAUSE_FLAGS contient les mêmes optionsexécutables
Exception non capturée dans un module d'entrée ordinaireescript sort avec le code 127Sort avec le code 1 et une ligne uncaught exception <class>: <reason> (les sources escript gardent 127)exécutables
Diagnostics du compilateurFormulation d'erl_lint (variable 'X' is unbound) et avertissementsFormulation propre (unbound variable X) ; les avertissements de lint d'OTP ne sont pour la plupart pas émis (y compris les champs de native record inconnus dans les accès, mises à jour et motifs)sémantique

Cas limites du langage

DifférenceOTPClauseRéférence
Segment entier plus large que la limite des entiers, valeur au-delà (<<V:4194241>> entièrement à un)Le JIT x86 réussit le filtrage avec un terme invalide ; son utilisation fait planter la VMPas de correspondancetermes
Groupe zip dont les générateurs souples et stricts partagent une variableLe test de saut conserve les variables des motifs stricts dans les motifs souplesUne étape rejetée est sautée dès que les motifs stricts correspondent à eux seulsmotifs
Appel d'une fun externe, M:F(Args) ou apply/3 d'un module hors du programmeCharge le module depuis le chemin de code, undef s'il est absentundef ; les modules de bibliothèque ne rejoignent le programme que lorsqu'il les nomme par un atome littéralfuns, bibliothèque
lists et mapsLes modules complets ; maps:keys/1, values/1, to_list/1, fold/3 suivent l'ordre interne de la map (ordre de la table des atomes pour les clés atomes, ordre de hachage au-delà de 32 clés)Le sous-ensemble de bibliothèque ; les fonctions de map suivent l'ordre des clésbibliothèque
Fichiers sans #! passés comme escriptsescript file.erl saute la première ligneCompilés comme des modules ordinairesexécutables
Escripts beam précompilés et escripts archivesS'exécutentNon pris en chargeexécutables
Un -spec dont les types n'ont aucune valeur commune avec le résultat inféré, le domaine d'entrée ou les arguments d'un appelCompile ; Dialyzer peut avertirErreur de compilation indiquant les types déclarés et inférésanalyse sémantique

io

DifférenceOTPClauseRéférence
Séquences de contrôle ~e ~f ~g ~x ~X ~+ ~# ~W ~P, modificateur KFormatéesbadargio
~p de conteneurs imbriqués sur plus de 256 niveauxAffichéssystem_limitio
Largeurs de champ et précision de ~ts avec des caractères combinants ou \r\nComptent les grappes de graphèmesComptent les points de codeio
Précision ou nombre de remplissage négatif (~.*c avec -1)Boucle indéfinimentbadargio
Fonctions io autres que format/1,2, put_chars/1Existentunknown module ioio