Elm es un lenguaje de programación específico de dominio para crear declarativamente interfaces gráficas de usuario basadas en navegadores web . Elm es puramente funcional y se desarrolla con énfasis en la usabilidad , el rendimiento y la robustez . Anuncia "sin excepciones en tiempo de ejecución en la práctica", [ 10 ] lo cual es posible gracias a la verificación de tipos estática del compilador de Elm .
Historia
Elm fue diseñado inicialmente por Evan Czaplicki como su tesis en 2012. [ 11 ] La primera versión de Elm incluía muchos ejemplos y un editor en línea que facilitaba su uso en un navegador web . [ 12 ] Czaplicki se unió a Prezi en 2013 para trabajar en Elm, [ 13 ] y en 2016 pasó a NoRedInk como ingeniero de código abierto, fundando también la Elm Software Foundation. [ 14 ]
La implementación inicial del compilador Elm apunta al lenguaje de marcado de hipertexto ( HTML ), hojas de estilo en cascada (CSS) y JavaScript . [ 15 ] El conjunto de herramientas principales ha seguido expandiéndose, incluyendo ahora un bucle de lectura-evaluación-impresión (REPL), [ 16 ] un gestor de paquetes , [ 17 ] un depurador con función de viaje en el tiempo, [ 18 ] e instaladores para macOS y Windows . [ 19 ] Elm también cuenta con un ecosistema de bibliotecas creadas por la comunidad , [ 20 ] y Ellie, un editor en línea avanzado que permite guardar el trabajo e incluir bibliotecas de la comunidad. [ 21 ]
Características
Elm tiene un pequeño conjunto de construcciones de lenguaje, incluyendo expresiones if tradicionales, expresiones let para almacenar valores locales y expresiones case para la coincidencia de patrones . [ 22 ] Como lenguaje funcional, admite funciones anónimas , funciones como argumentos y funciones que pueden devolver funciones, estas últimas a menudo mediante la aplicación parcial de funciones currificadas . Las funciones se llaman por valor. Su semántica incluye valores inmutables, funciones sin estado y tipado estático con inferencia de tipos. Los programas Elm renderizan HTML a través de un DOM virtual y pueden interoperar con otro código utilizando "JavaScript como servicio".
Inmutabilidad
En Elm, todos los valores son inmutables , lo que significa que un valor no puede modificarse después de su creación. Elm utiliza estructuras de datos persistentes para implementar sus matrices, conjuntos y diccionarios en la biblioteca estándar. [ 23 ]
Tipos estáticos
Elm es un lenguaje de tipado estático. Las anotaciones de tipo son opcionales (debido a la inferencia de tipos), pero se recomiendan encarecidamente. Las anotaciones se encuentran en la línea superior a la definición (a diferencia de los lenguajes de la familia C, donde los tipos y los nombres se intercalan). Elm utiliza dos puntos para indicar que un tipo es "tiene tipo".
Los tipos incluyen primitivos como enteros y cadenas, y estructuras de datos básicas como listas, tuplas y registros. Las funciones tienen tipos escritos con flechas, por ejemplo . Los tipos personalizados permiten al programador crear tipos personalizados para representar datos de una manera que se ajuste al dominio del problema. [ 24 ]round : Float -> Int
Los tipos pueden referirse a otros tipos, por ejemplo, a List Int. Los tipos siempre se escriben con mayúscula inicial; los nombres en minúscula son variables de tipo. Por ejemplo, a List aes una lista de valores de tipo desconocido. Es el tipo de la lista vacía y del argumento de List.length, que es independiente de los elementos de la lista. Hay algunos tipos especiales que los programadores crean para interactuar con el entorno de ejecución de Elm. Por ejemplo, Html Msgrepresenta un árbol DOM (virtual) cuyos manejadores de eventos producen mensajes de tipo Msg.
En lugar de permitir que cualquier valor sea implícitamente anulable (como en JavaScript undefinedo un puntero nulo ), la biblioteca estándar de Elm define un Maybe atipo. El código que produce o maneja un valor opcional lo hace explícitamente usando este tipo, y todo el demás código tiene la garantía de que existe un valor del tipo declarado.
Elm proporciona un número limitado de clases de tipos integradas : numberque incluye Inty Floatpara facilitar el uso de operadores numéricos como (+)o (*), comparableque incluye números, caracteres, cadenas, listas de cosas comparables y tuplas de cosas comparables para facilitar el uso de operadores de comparación, y appendableque incluye cadenas y listas para facilitar la concatenación con (++). Elm no proporciona un mecanismo para incluir tipos personalizados en estas clases de tipos o crear nuevas clases de tipos (ver Límites ).
Sistema de módulos
Elm cuenta con un sistema de módulos que permite a los usuarios dividir su código en partes más pequeñas llamadas módulos. Los módulos pueden ocultar detalles de implementación, como funciones auxiliares, y agrupar código relacionado. Los módulos sirven como espacio de nombres para el código importado, como por ejemplo Bitwise.and. Las bibliotecas (o paquetes) de terceros constan de uno o más módulos y están disponibles en la Biblioteca Pública de Elm . Todas las bibliotecas están versionadas según semver , que es aplicado por el compilador y otras herramientas. Es decir, eliminar una función o cambiar su tipo solo se puede hacer en una versión principal.
Interoperabilidad con HTML, CSS y JavaScript
Elm utiliza una abstracción llamada puertos para comunicarse con JavaScript . [ 25 ] Permite que los valores fluyan hacia dentro y hacia fuera de los programas Elm, lo que hace posible la comunicación entre Elm y JavaScript.
Elm tiene una biblioteca llamada elm/html que un programador puede usar para escribir HTML y CSS dentro de Elm. [ 26 ] Utiliza un enfoque de DOM virtual para hacer que las actualizaciones sean eficientes. [ 27 ]
Backend
Elm no admite oficialmente el desarrollo del lado del servidor. Czaplicki lo considera un objetivo primordial, pero el progreso público en este sentido ha sido lento. No obstante, existen varios proyectos independientes que intentan explorar Elm en el backend. [ 28 ]
La principal plataforma Elm de pila completa es Lamdera, una bifurcación de Elm de núcleo abierto. [ 29 ] [ 30 ] [ 31 ] Czaplicki también ha insinuado Elm Studio, una posible alternativa a Lamdera, pero aún no está disponible para el público. [ 32 ] Las demostraciones de Czaplicki aparentemente utilizan una versión futura de Elm que admite la generación de tablas Postgres con tipado seguro . [ 33 ] También se especula que las futuras versiones de Elm se compilarían a C y usarían Emscripten para generar WASM , pero esto no ha sido confirmado por Czaplicki. [ 34 ]
Para los frameworks full-stack, a diferencia de los productos BaaS , elm-pages es probablemente la opción de código abierto más popular. [ 35 ] No extiende el lenguaje Elm (aunque utiliza componentes de código abierto del compilador Lamdera mencionado anteriormente), sino que ejecuta el JavaScript compilado en Node.js. También admite scripting mediante la BackendTaskAPI. Existe además Pine, un compilador de Elm a .NET, que permite una interoperabilidad segura con C#, F# y otros lenguajes CLR . [ 36 ]
También hubo intentos en versiones de Elm anteriores a la 0.19.0 de usar BEAM (máquina virtual de Erlang) para ejecutar Elm, pero actualmente no funcionan debido a la eliminación del código nativo en la versión 0.19.0 y a los cambios en el gestor de paquetes. Uno de los proyectos ejecutaba Elm directamente en el entorno, [ 37 ] mientras que otro lo compilaba a Elixir. [ 38 ]
La arquitectura del olmo (patrón TEA)
La arquitectura Elm es un patrón de diseño de software , conocido como patrón TEA , para la creación de aplicaciones web interactivas. Las aplicaciones Elm se construyen de forma natural siguiendo este patrón, pero otros proyectos también pueden encontrar útil este concepto.
Un programa Elm siempre se divide en tres partes:
- Modelo: el estado de la aplicación
- Vista: una función que convierte el modelo en HTML.
- Actualizar: una función que actualiza el modelo en función de los mensajes.
Esos son los elementos centrales de la arquitectura de Elm.
Por ejemplo, imagina una aplicación que muestra un número y un botón que incrementa el número al presionarlo. [ 39 ] En este caso, solo necesitamos almacenar un número, por lo que nuestro modelo puede ser tan simple como type alias Model = Int. La viewfunción se definiría con la Htmlbiblioteca y mostraría el número y el botón. Para que el número se actualice, necesitamos poder enviar un mensaje a la updatefunción, lo cual se hace a través de un tipo personalizado como type Msg = Increase. El Increasevalor se adjunta al botón definido en la viewfunción de manera que cuando un usuario hace clic en el botón, Increasese pasa a la updatefunción, que puede actualizar el modelo incrementando el número.
En la arquitectura Elm, enviar mensajes updatees la única forma de cambiar el estado. En aplicaciones más sofisticadas, los mensajes pueden provenir de diversas fuentes: interacción del usuario, inicialización del modelo, llamadas internas update, suscripciones a eventos externos (cambio de tamaño de ventana, reloj del sistema, interoperabilidad con JavaScript, etc.) y cambios y solicitudes de URL.
Límites
Elm no admite el polimorfismo de orden superior , [ 40 ] que ofrecen lenguajes relacionados como Haskell , Scala y PureScript , ni tampoco admite la creación de clases de tipos .
Esto significa que, por ejemplo, Elm no tiene una mapfunción genérica que funcione en múltiples estructuras de datos como Listy Set. En Elm, dichas funciones se invocan normalmente calificadas por el nombre de su módulo, por ejemplo, llamando a List.mapy Set.map. En Haskell o PureScript, solo habría una función map. Esta es una solicitud de característica conocida que está en la hoja de ruta preliminar de Czaplicki desde al menos 2015. [ 41 ] Por otro lado, las implementaciones del patrón TEA en lenguajes avanzados como Scala no sufren tales limitaciones y pueden beneficiarse de las clases de tipos de Scala , las construcciones de programación a nivel de tipo y de clase . [ 42 ]
Otro resultado es una gran cantidad de código repetitivo en proyectos de tamaño mediano a grande, como lo ilustra el autor de "Elm in Action", un antiguo miembro del equipo central de Elm, en su ejemplo de aplicación de una sola página [ 43 ] con fragmentos casi idénticos que se repiten en las funciones de actualización, vista, suscripciones, análisis de rutas y construcción.
Código de ejemplo
-- Este es un comentario de una sola línea.{- Este es un comentario de varias líneas. Es {- anidable. -} -}-- Aquí definimos un valor llamado `greeting`. El tipo se infiere como una `String`. greeting = "¡Hola Mundo!"-- Lo mejor es añadir anotaciones de tipo a las declaraciones de nivel superior. hello : String hello = "Hola."-- Las funciones se declaran de la misma manera, con los argumentos después del nombre de la función. add x y = x + y-- De nuevo, lo mejor es añadir anotaciones de tipo. hipotenusa : Float -> Float -> Float hipotenusa a b = sqrt ( a ^ 2 + b ^ 2 )-- Podemos crear funciones lambda con la sintaxis `\[arg] -> [expresión]`. hello : String -> String hello = \ s -> "Hola, " ++ s-- Las declaraciones de funciones pueden tener nombres de parámetros anónimos denotados por `_`, -- que coinciden pero no se utilizan en el cuerpo. const : a -> b -> a const k _ = k-- Las funciones también se currifican; aquí hemos currificado la multiplicación -- operador infijo con un `2` multiplyBy2 : número -> número multiplyBy2 = (*) 2-- Las expresiones if se utilizan para ramificar en valores `Bool` absoluteValue : number -> number absoluteValue number = if number < 0 then negate number else number-- Los registros se utilizan para almacenar valores con campos con nombre. book : { title : String , author : String , pages : Int } book = { title = "Steppenwolf" , author = "Hesse" , pages = 237 }-- El acceso al registro se realiza con `.` título : String título = libro.título-- El acceso al registro `.` también se puede usar como una función autor : String autor = . autor libro-- Podemos crear uniones etiquetadas con la palabra clave `type`. -- El siguiente valor representa un árbol binario. type Tree a = Empty | Node a ( Tree a ) ( Tree a )-- Es posible inspeccionar estos tipos con expresiones case. depth : Tree a -> Int depth tree = case tree of Empty -> 0 Node _ left right -> 1 + max ( depth left ) ( depth right )Véase también
- PureScript : un lenguaje de programación funcional y fuertemente tipado que se compila a JavaScript.
- Reason : una extensión de sintaxis y un conjunto de herramientas para OCaml que también puede transcompilar a JavaScript.
Referencias
- ↑ Czaplicki, Evan (30 de marzo de 2012). "¡Mi tesis finalmente está terminada! "Elm: FRP concurrente para interfaces gráficas de usuario funcionales"" . Reddit .
- ↑ "Versiones: elm/Compiler" . GitHub .
- ↑ "elm/compiler" . GitHub . 16 de octubre de 2021.
- ↑ "Arte previo - Redux" . redux.js.org . 28 de abril de 2024.
- ↑ "Formas de errores por venir" . Blog de Rust . Consultado el 8 de octubre de 2016. Aquellos
familiarizados con el estilo de Elm reconocerán que los mensajes --explain actualizados se inspiran en gran medida en el enfoque de Elm.
- ↑ "Comparación con otros frameworks — Vue.js" .
- ↑ "roc/roc-for-elm-programmers.md en main · roc-lang/roc" . GitHub . Consultado el 17 de febrero de 2024. Roc
es un descendiente directo del lenguaje de programación Elm. ¡Ambos lenguajes son similares, pero no idénticos!
- ↑ "¿Por qué Derw: un lenguaje similar a Elm que se compila a TypeScript?" . 20 de diciembre de 2021.
- ↑ "Gren 0.1.0 ha sido lanzado" .
- ↑ "Página principal de Elm" .
- ↑ "Elm: FRP concurrente para GUI funcionales" (PDF) .
- ↑ "Prueba Elm" . elm-lang.org . Consultado el 26 de abril de 2025 .
- ↑ "elm y prezi" . elm-lang.org .
- ↑ "Nuevas aventuras para Elm" . elm-lang.org .
- ↑ "elm/compiler" . GitHub . 16 de octubre de 2021.
- ↑ "repl" . elm-lang.org .
- ↑ "gestor de paquetes" . elm-lang.org .
- ↑ "Inicio" . elm-lang.org .
- ↑ "Instalar" . guide.elm-lang.org .
- ↑ "Paquetes de Elm" . Elm-lang.org .
- ↑ "Ellie" . Ellie-app.com .
- ↑ "sintaxis" . elm-lang.org . Consultado el 26 de abril de 2025 .
- ↑ "elm/core" . package.elm-lang.org .
- ↑ "Modelar el problema" . Elm . Consultado el 4 de mayo de 2016 .
- ↑ "Interoperabilidad con JavaScript" . elm-lang.org .
- ↑ "elm/html" . package.elm-lang.org .
- ↑ "HTML increíblemente rápido" . elm-lang.org .
- ↑ "¿Cuándo se publicará el trabajo de backend de Evan?" . Elm . 18-02-2025 . Consultado el 14-04-2026 .
- ↑ Elm Europe (28/11/2019). Mario Rogic - Elm como servicio . Recuperado el 27/03/2025 – vía YouTube.
- ↑ Reunión en línea de Elm (23/07/2021). Creando un clon de Meetup en Lamdera - Martin Stewart . Consultado el 27/03/2025 a través de YouTube.
- ↑ "Episodio 38: Lamdera" . Podcast de Elm Radio . Consultado el 27 de marzo de 2025 .
- ↑ "Elm Studio" . www.elm.studio . Consultado el 27 de marzo de 2025 .
- ^ Cesarini, Francesco (22 de mayo de 2023). "@evancz tentando a los dioses de la demostración..." . Gorjeo . Consultado el 26 de marzo de 2025 .
- ↑ "Actualización de estado - 3 de noviembre de 2021" . Elm . 3 de noviembre de 2021. Consultado el 27 de marzo de 2025 .
- ↑ "elm-pages - importa datos elm tipificados a tus páginas" . elm-pages . Consultado el 27 de marzo de 2025 .
- ↑ "Pino — Elmo de pantano por todas partes" . pine-vm.org . Consultado el 27 de marzo de 2025 .
- ↑ "Kofigumbs/Elm-beam" . GitHub . 24 de septiembre de 2021.
- ↑ "¿Qué es?" . GitHub . 24 de septiembre de 2021.
- ↑ "Botones · Una introducción a Elm" . guide.elm-lang.org . Consultado el 15 de octubre de 2020 .
- ↑ "¿Tipos de orden superior no expresables? #396" . github.com/elm-lang/elm-compiler . Consultado el 6 de marzo de 2015 .
- ↑ "Tipos de orden superior no expresables #396" . github.com/elm-lang/elm-compiler . Consultado el 19 de noviembre de 2019 .
- ↑ "La arquitectura del olmo" . tyrian.indigoengine.io . Consultado el 7 de septiembre de 2024 .
- ↑ "Main.elm" . github.com/rtfeldman/elm-spa-example . Consultado el 30 de junio de 2020 .
Enlaces externos
- Sitio web oficial

- Elm en GitHub
- Software de 2012
- Lenguajes de programación específicos de dominio
- Lenguajes funcionales
- Familia de lenguajes de programación Haskell
- Lenguajes de programación que coinciden con patrones
- Lenguajes de programación creados en 2012
- Compiladores de código fuente a código fuente
- Lenguajes de programación de tipado estático
- marcos de trabajo web
- Software que utiliza la licencia MIT.