Fundamentos del lenguaje
31 pasos en 9 series de Erlang.
Erlang se construyó dentro de Ericsson en los años 80 para correr centrales telefónicas: sistemas que no pueden detenerse, donde la falla se espera y se maneja en vez de prevenirse. Sus respuestas — millones de procesos baratos que no comparten nada, paso de mensajes como única comunicación, supervisores reiniciando lo que muere, código cambiado en un sistema corriendo — se volvieron el plano que todo sistema de actores copió desde entonces. WhatsApp sirvió célebremente cientos de millones de usuarios sobre él con un equipo de docenas.
Este tour teclea el núcleo a través de una central telefónica, naturalmente: variables de asignación única y átomos, tuplas y listas con matching de cabeza y cola, cabezas de función y guardas como el idioma de ramificación, case e if, recursión de cola con acumuladores, comprensiones de lista, el módulo lists, funs, maps y records y proplists, strings contra binarios, tuplas ok/error, try/catch con sus tres clases de error — y el corazón del lenguaje: spawn, !, receive con timeouts, la forma llamada-y-respuesta, y monitores que vuelven mensaje la muerte de un proceso. El Bis es el trío de scripts de siempre en Erlang honesto con sabor a OTP.
Valores
- La forma del escriptEl script Erlang más pequeño: main/1 y directivas de io:format.
- Variables y átomosLos nombres en mayúscula atan una vez; las palabras en minúscula se significan.
- Tuplas y listasFormas fijas entre llaves, cadenas crecientes entre corchetes.
Coincidencia de patrones
- Matching en la cabezaUna función, varias cláusulas: la cabeza hace la ramificación.
- Guardaswhen refina una cláusula después de que su patrón matchea.
- caseMatchea un valor contra patrones, en orden, como expresión.
- ifTodo guardas, probadas en orden; true es el brazo else.
Recursión y comprensiones
- RecursiónEl bucle es una función llamándose; el acumulador la deja en cola.
- Comprensiones de listaMapea y filtra en un corchete; los generadores se cruzan.
- Componer etapasNo hay operador pipe: anida las llamadas o nombra las etapas.
El módulo lists
- El módulo listsmap, filter, foldl, sort: el kit diario.
- Funsfun ... end hace un valor de función; las cláusulas ramifican adentro.
- zip y seqlists:seq cuenta, zip empareja, unzip separa de vuelta.
- Ordenarsort toma un fun; keysort ordena tuplas etiquetadas por posición.
Formas de datos
- Maps=> escribe, := actualiza y matchea, maps:get lee con defectos.
- RecordsUna tupla nombrada con azúcar de campos en compilación.
- ProplistsTuplas etiquetadas en una lista: el estilo clásico de opciones.
- Maps a escalamaps:fold, filter y merge trabajan la tabla entera de una vez.
Texto y números
- Strings y binariosListas de caracteres por tradición, binarios para bytes.
- Directivas de formato~s, ~p, ~B, ~.2f: el vocabulario de io:format.
- Partir stringsstring:split y lexemes vuelven datos las líneas del libro.
- Númerosdiv y rem para enteros, / para flotantes, desborde jamás.
Errores como datos
- Tuplas ok y error{ok, Valor} y {error, Razon}: la convención que toda API guarda.
- try/catchTres clases de error: throw, error y exit, atrapadas por nombre.
Procesos
- spawn y enviarUn proceso es barato; ! envía, receive espera un match.
- receive ... afterafter le pone reloj al receive.
- Llamada y respuestaEtiqueta pedidos con self(); matchea la respuesta por forma.
- MonitoresUn monitor vuelve mensaje la muerte de otro proceso.
Bis
- word_freq.erlUna tabla de frecuencias con lexemes, maps:update_with y un orden.
- grade_report.erlBoletines desde tuplas etiquetadas, notas por guardas, ~4.1f.
- temp_stats.erlUna semana de temperaturas: extremo por pliegue, barras, saltos.