Clause
← All dokumentation

Översatt från det engelska originalet · 06042fa · 2026-10-09 · Läs på engelska

Skillnader mot Erlang/OTP

Observerbart beteende där Clause medvetet skiljer sig från den fastlåsta OTP 29 (maint-29, se otp-reference.md). Varje post länkar till det kontrakt som äger den. Ta bort en post när skillnaden är åtgärdad. Funktioner som ännu inte är implementerade (rapporteras som notimpl) listas inte här; se features.md och planen.

Maps

SkillnadOTPClauseÄgare
Ordning för map-generatorer (K := V <- M)Platta maps (upp till 32 nycklar) itereras i nyckelordning, men atomnycklar i atomtabellens ordning, som varierar mellan VM-körningar; större maps i hashordningAlltid kanonisk nyckelordning (termordning)mönster
bad_generators-nyttolast för en map-generator i en zip-gruppDess iterator: en {K, V, Next}-kedja som slutar i none, i OTP:s ordningSamma kedja, byggd i kanonisk nyckelordningmönster
Utskrift av maps (erlang:display/1, ~w, ~p)Intern layoutordning (atomtabellens ordning för atomnycklar, hashordning över 32 nycklar)Map-nyckelordning, som OTP:s ~kwtermer
Utskrift av native records (erlang:display/1)Fält i atomtabellens indexordningDefinitionsordning, som ~wnative records
== mellan native records vars fält skiljer sig endast som heltal/flyttalKompilatorn kan vika det till =:= (falskt)Numerisk jämförelse (sant)native records
Utskrift av lokala funs (#Fun<M.Index.Uniq>)Index från kompilatorns lambdanumrering, Uniq en hash av modulens kodIndex bland modulens lokala funs i källkodsordning, Uniq alltid 0funs
Ordning mellan två lokala funs i en modulEnligt OTP:s indexEnligt index i källkodsordning, så funs från olika funktioner kan ordnas annorlundafuns
Namn på anonyma funs i stackspårningar (-f/1-fun-N-)N från kompilatorns numreringN räknar funs i f/1 i källkodsordningfuns
En anonym fun i ett standardvärde för ett record-fältVarje konstruktionsställe expanderar en egen kopia: funs från två ställen är olikaEn fun för standardvärdet: funs från alla konstruktionsställen är likafuns
Ordning för infångade värden i funs som skapas i comprehensionsFria variabler i comprehensionens genererade funktionDefinitionsordning i den omslutande funktionen; syns endast när två sådana funs jämförsfuns

Pids, referenser och processer

SkillnadOTPClauseÄgare
Pid-nummerDen första användarprocessen är ungefär <0.80.0>; nummer återanvänds när pid-tabellen slår runtDen första processen är <0.1.0>; nummer kommer från en enda sekvens och återanvänds aldrigtermer
Kod efter spawn(Fun) av en fun med annan aritetKompilatorns typanalys kan betrakta koden efter anropet som onåbar och ta bort den, så att anroparen genast returnerar pid:enAnroparen fortsätter; endast den nya processen misslyckas med {badarity, {Fun, []}}processer
Formatering av en stor term (io:format/1,2)Körs i Erlang-kod (io_lib) och i group leader, så processen kan avbrytas under formateringenKörs till slut i ett enda anrop av en inbyggd funktion; andra processer väntarinbyggda funktioner
Flaggor till process_flag/2trap_exit, priority, message_queue_data, min_heap_size med fleraEndast trap_exit; alla andra flaggor ger badargprocesser
Ordning för felrapporter från processer som kraschar samtidigtLoggerns ordningDen ordning i vilken deras arbetstrådar avslutar demprocesser
Signaler till en process som körs på en annan schemaläggareKöas i dess signalkö och hanteras senare, medan avsändaren fortsätterAvsändaren väntar tills målets tidsskiva tar slut och agerar sedan direkt; observerbart endast som timingprocesser
list_to_port/1 av ett nummer som aldrig delats utReturnerar en porttermbadarg: endast portar som detta program har öppnat godtasportar
Värden från port_info/1,2id är ett tabellindex; memory, queue_size, locking beskriver drivrutinenid är portnumret; memory och queue_size är 0; locking är port_levelportar
Skrivning till en fil som öppnats endast för läsning{error, eacces} på Windows, {error, ebadf} på andra system{error, ebadf} överalltportar
io:get_line, io:get_chars och file:read/2 i listläge på icke-ASCII-indataTecken avkodas enligt enhetens kodningEtt listelement per byteportar
Resultatet av os:cmd/1Unicode-tecken avkodade från utdataUtdatans byteportar
Tomma argument till {spawn_executable, F} på WindowsTas bort från kommandoradenSkickas som ""portar
{exit_status, S} och eof från ett startat programOspecificerad ordning, exit_status kan komma före sista datatEfter allt data, före eofportar
Upptagna portarEn port med för mycket köad utdata stoppar avsändare; force i port_command/3 fungerar på drivrutiner som tillåter detUtdata stoppar aldrig avsändare; force ger notsup på alla drivrutinerportar
{active, N} för socketsEtt heltal N räknar meddelanden före {tcp_passive, S}exit(badarg); endast true, false och onceportar
Inställningsalternativ för sockets (nodelay, keepalive, send_timeout, delay_send, buffertar)Tillämpas; andra inet-alternativ (header, {packet, line}, http, ...) fungerarDe listade inställningsalternativen godtas men tillämpas inte; andra alternativ ger exit(badarg)portar
Felorsaker för socketsVarje POSIX-orsak som systemet rapporterarDe vanliga (econnrefused, eaddrinuse, econnreset, etimedout, ...); andra blir eioportar
Portindata medan den anslutna processen har 1 024 meddelanden och kan körasFortsätter läsa och levereraSlutar leverera tills processens tidsskiva tar slut; över 64 KiB kvarhållet slutar den läsa, så det skrivande programmet blockerasportar
gen_tcp:close/1 med köad utdataVäntar upp till inställningen linger/send_timeout på att utdatan ska skickasReturnerar direkt; I/O-tråden skickar den köade utdatan och stänger sedanportar
Typer för monitor/2process, port, time_offsetprocess och port; time_offset ger badarg (inga ändringar av tidsförskjutning)processer
exit/2, exit_signal/2 till en referensSkickar till processaliaset, om referensen är ett aktivt sådantIngenting (inga alias)processer
ReferensnummerBlandar en schemaläggaridentifierare och räknare per schemaläggare (#Ref<0.178111994.4235460610.214105>)En enda räknare för hela programmet (#Ref<0.0.0.1>), så referenser ordnas efter skapandetidtermer

Fel, stackspårningar och rapporter

SkillnadOTPClauseÄgare
Platser i stackspårningar[{file, F}, {line, L}], error_info för error/3Alltid []; ingen error_infoABI
Översta ramen för function_clauseArgumentlistaAritetABI
Översta ramen för undef{M, F, Args, []} för den saknade funktionenDen anropande funktionens ramfuns
Ramar för BIF:ar/operatorer som misslyckasFinns ({erlang, '+', Args, ...})Saknas; ingenting under ingångsfunktionenABI
Full atomtabell (list_to_atom/1)Emulatorn avbryter (no more index entries in atom_tab) och skriver en kraschdumpclau: runtime failure: entry call failed: resource_limit, slutstatus 70inbyggda funktioner
list_to_integer/1,2 med tecken över 255De första siffrorna använder endast varje teckens låga byte ([16#131] är 1)badarginbyggda funktioner
erlang:function_exported/3 för en BIFSant för varje BIF i emulatornSant endast för de inbyggda funktioner som denna runtime tillhandahållerinbyggda funktioner
Felrapporter från kraschade processerSkickas till loggern och skrivs senare av dess standardhanterare (på standard ut under erl, går ofta förlorade när ett escript avslutas först)Skrivs på stderr när processen avslutas, före senare utdataprocesser
Anrop till funktioner som aldrig returnerarKompileras som svansanrop (anroparen saknas i spårningen)Vanliga anrop (anroparen finns med)ABI
Värdminnet är slutEmulatorn rapporterar att den inte kan allokera minne, skriver en kraschdump och stopparclau: runtime failure: entry call failed: out_of_memory, slutstatus 70, ingen dumpruntime-heap
Minnestak per processmax_heap_size (i ord, heap och stack) dödar processen med orsaken killed och loggar en felrapport--max-heap / --max-stack (byte) och runtime-gemensamma --max-memory får den begärande processen att misslyckas som resource_limit: clau: runtime failure: entry call failed: resource_limit, slutstatus 70runtime-heap
Programargumentescript skickar varje argument till main/1; emulatorflaggor (+t) kommer från %%! eller ERL_FLAGSInledande runtime-alternativ (--max-atoms, --max-heap, --max-stack, --max-memory, --args-file, --) plockas ut först; CLAUSE_FLAGS innehåller samma alternativkörbara filer
Ofångat undantag i en vanlig ingångsmodulescript avslutar med 127Avslutar med 1 och en rad uncaught exception <class>: <reason> (escript-källor behåller 127)körbara filer
KompilatordiagnostikFormuleringar från erl_lint (variable 'X' is unbound) och varningarEgna formuleringar (unbound variable X); OTP:s lint-varningar ges i regel inte (inte heller för okända fält i native records vid åtkomst, uppdatering och i mönster)semantik

Gränsfall i språket

SkillnadOTPClauseÄgare
Heltalssegment bredare än heltalsgränsen, med ett värde bortom den (<<V:4194241>> med bara ettor)x86-JIT:en matchar med en ogiltig term; att använda den kraschar VM:enIngen matchningtermer
Zip-grupp där avslappnade och strikta generatorer delar en variabelÖverhoppningstestet behåller variabler från strikta mönster i de avslappnade mönstrenEtt avvisat steg hoppas över närhelst de strikta mönstren matchar på egen handmönster
Anrop av en extern fun, M:F(Args) eller apply/3 för en modul utanför programmetLaddar modulen från kodsökvägen, undef om den saknasundef; biblioteksmoduler blir del av programmet endast när det namnger dem med en literal atomfuns, bibliotek
lists och mapsDe fullständiga modulerna; maps:keys/1, values/1, to_list/1, fold/3 följer mapens interna ordning (atomtabellens ordning för atomnycklar, hashordning över 32 nycklar)Biblioteksdelmängden; map-funktioner följer nyckelordningbibliotek
Filer utan #! som ges som escriptsescript file.erl hoppar över första radenKompileras som vanliga modulerkörbara filer
Förkompilerade beam- och arkiv-escriptsKörsStöds intekörbara filer
En -spec vars typer inte delar något värde med det härledda resultatet, ingångsdomänen eller argumenten i ett anropKompileras; Dialyzer kan varnaKompileringsfel som namnger de deklarerade och härledda typernasemantisk analys

io

SkillnadOTPClauseÄgare
Styrsekvenserna ~e ~f ~g ~x ~X ~+ ~# ~W ~P, modifieraren KFormaterasbadargio
~p av behållare nästlade djupare än 256 nivåerSkrivs utsystem_limitio
Fältbredder och precision för ~ts med kombinerande tecken eller \r\nRäknar grafemklusterRäknar kodpunkterio
Negativ precision eller utfyllnadsantal (~.*c med -1)Loopar för evigtbadargio
Andra io-funktioner än format/1,2, put_chars/1Finnsunknown module ioio