Elm (lenguaje de programación)

Elm es un lenguaje de programación para crear interfaces gráficas de usuario para navegadores web. Elm es un lenguaje funcional puro y fuertemente tipificado, y está desarrollado con énfasis en usabilidad, rendimiento, y robustez. Proclama "no tener excepciones en la práctica", hecho posible por el sistema de tipado estático del compilador.[1]​

Elm

Desarrollador(es)
Evan Czaplicki
https://elm-lang.org/
Información general
Extensiones comunes|  .elm
Paradigma|  Programación funcional
Apareció en|  2012
Diseñado por|  Evan Czaplicki
Última versión estable|  0.19 (21 de agosto de 2018 (6 años, 1 mes y 15 días))
Sistema de tipos|  estático, tipado fuerte
Influido por|  Haskell, Standard ML, OCaml, F#
Licencia|  Licencia BSD[2]​

[editar datos en Wikidata]

## Historia

[editar]

Elm fue inicialmente diseñado por Evan Czaplicki en su tesis en 2012.[3]​ La versión pública de Elm vino con muchos ejemplos y un editor en línea que lo hizo fácil de probar en un navegador web.[4]​ Evan Czaplicki se unió a Prezi en 2013 para trabajar en Elm,[5]​ y en 2016 se unió a NoRedInk como Ingeniero de Software trabajando en código libre, también empezando la Elm Software Foundation.[6]​

La implementación inicial del compilador producía HTML, CSS, y Javascript.[7]​ El conjunto de herramientas del lenguaje continuó expandiéndose, ahora incluyendo un REPL,[8]​ gestor de paquetes,[9]​ depurador con viaje en el tiempo,[10]​ e instaladores para Linux, Mac y Windows.[11]​ Elm también tiene un ecosistema de librerías creadas por la comunidad[12]​ y un editor en línea avanzado que permite incluir dichas librerías y guardar el código para compartirlo.[13]​

## Características

[editar]

Elm tiene un pequeño pero expresivo conjunto de funcionalidades en el lenguaje, incluyendo expresiones if, creación de variables locales, y expresiones case para la búsqueda de patrones.[14]​ Como lenguaje funcional, tiene funciones anónimas, funciones como argumentos, y aplicación parcial (currificación) por defecto. Su semántica incluye valores inmutables, funciones puras, y tipado estático con inferencia de tipos. Los programas de Elm producen HTML a través de un sistema de DOM virtual, y pueden interoperar con otro código Javascript.

### Inmutabilidad

[editar]

Todos los valores en Elm son inmutables, un valor no puede ser modificado después de ser creado. Elm utiliza estructuras de datos persistentes para implementar sus librerías `Array`, `Dict`, y `Set`.[15]​

### Tipos estáticos

[editar]

Elm usa un sistema de tipado estático. Las anotaciones de tipos son opcionales, debido a la inferencia de tipos, pero recomendadas. Las anotaciones se ponen en la línea de arriba de la definición (no como en los lenguajes de la familia de C, donde los tipos y los nombres de las variables/parámetros están mezclados). Elm usa un solo carácter `:` para significar la definición de tipos.

Los tipos incluyen primitivas como números enteros y cadenas de texto, y estructuras de datos básicas como listas (`List` ), tuplas (`Tuple`) y records (objetos). Las funciones se escriben con flechas, por ejemplo `round : Float -> Int`. Union types (tipos de unión) permiten al programador crear tipos personalizados para representar datos de manera apropiada al dominio del problema.[16]​

Los tipos pueden referenciar otros tipos, por ejemplo, una lista de números enteros es `List Int`. Los tipos siempre empiezan con letra en mayúscula, las variables empiezan con letra en minúscula. Por ejemplo, una `List a` es una lista de valores de tipo desconocido. Hay unos cuantos tipos especiales que los programadores crean para interactionar con el sistema de ejecución de Elm. Por ejemplo, `Html Msg` representa un árbol del DOM (virtual) cuyos manejadores de eventos producen mensajes de tipo `Msg`.

En vez de permitir que cualquier valor sea null implícitamente (como `undefined` o `null` en JavaScript), la librería estándar de Elm define un tipo `Maybe a` . El código que produce o maneja valores opcionales lo hace utilizando explícitamente este tipo, y todo el código tiene garantías de que el valor que dice ser de un cierto tipo esta garantizado tener un valor de ese tipo presente.

### Sistema de módulos

[editar]

Elm tiene un sistema de módulos que permite a los usuarios dividir el código en partes más pequeñas llamadas módulos. Los módulos pueden esconder detalles de implementación, tales como funciones auxiliares, y agrupar código relacionado. Los módulos sirven como espacio de nombres a la hora de importar código, como por ejemplo `Tuple.first`. Las librerías o paquetes de terceros consisten en uno o más módulos, y están disponibles en la librería de paquetes de Elm. Todos los paquetes y librerías se versionan utilizando versionado semántico, que es verificado y hecho cumplir por el compilador y otras herramientas. Esto significa, que quitar una función, o cambiar su tipo, puede ser hecho solo incrementando la versión mayor.

### Interoperabilidad con HTML, CSS y JavaScript

[editar]

Elm utiliza una abstracción llamada ports (puertos) para comunicarse con JavaScript.[17]​ Permite que los valores fluyan hacia dentro y fuera de los programas Elm, haciendo posible la comunicación entre Elm y JavaScript.

Elm tiene una librería llamada elm-html que un programador puede utilizar para escribir HTML y CSS en Elm.[18]​ Utiliza un sistema de DOM virtual para hacer las actualizaciones en la página más eficientes.[19]​

## Limitaciones

[editar]

Al contrario que Haskell o PureScript, Elm no tiene soporte para higher-kinded types, y por lo tanto no puede proveer abstracciones genéricas para muchas operaciones comunes.[20]​ Por ejemplo, no hay funciones genéricas `map`, `apply`, `fold`, o `filter`. En vez dichos nombres hay que utilizar un prefijo con el módulo del tipo al que nos queremos referir, por ejemplo `List.map` y `Dict.map`.

## Código de ejemplo

[editar]

-- Esto es un comentario de una linea

{- Este es un comentario multi-linea
Puedes escribir en varias lineas

{- Puedes {- anidar -} comentarios multi-linea -}

-- Aquí definimos un valor llamado ''greeting''. El tipo es inferido como cadena de texto (String)
greeting =
"Hola Mundo!"

-- Es mejor añadir anotaciones de tipos como documentación
hello : String
hello =
"Hola."

-- Las funciones se declaran de la misma manera, con los argumentos siguiendo al nombre de la función.
add x y =
x + y

-- De nuevo, mejor con anotaciones de tipos
hypotenuse : Float -> Float -> Float
hypotenuse a b =
sqrt (a^2 + b^2)

-- Las funciones están currificadas
-- Por ejemplo aquí usamos la aplicación parcial de la multiplicación con 2
multiplyBy2 : number -> number
multiplyBy2 =
(*) 2

-- Las expresiones if se usan para decidir que hacer basado en una condición. Es obligatorio que este siempre el else
absoluteValue : number -> number
absoluteValue number =
if number < 0 then negate number else number

-- Records (objetos) son usados para poner valores con nombre
book : { title : String, author : String, pages : Int }
book =
{ title = "Steppenwolf"
, author = "Hesse"
, pages = 237

-- Para acceder a un campo del objeto, utilizamos `.`
title : String
title =
book.title

-- El acceso a campos `.` también se puede utilizar como función
author : String
author =
.author book

-- Podemos crear nuevos tipos con la palabra `type`
-- El siguiente tipo corresponde a la representación de 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 ->

Node value left right ->
1 + max (depth left) (depth right)

## Véase también

[editar]

* TypeScript: lenguaje de programación fuertemente tipado que compila a JavaScript

## Referencias

[editar]

1. ↑ «Elm home page».
2. ↑ «elm/compiler». GitHub.
3. ↑ «Elm: Concurrent FRP for Functional GUIs».
4. ↑ «Try Elm». elm-lang.org. Archivado desde el original el 21 de mayo de 2017. Consultado el 5 de octubre de 2018.
5. ↑ «elm and prezi». elm-lang.org. Archivado desde el original el 24 de mayo de 2015. Consultado el 5 de octubre de 2018.
6. ↑ «new adventures for elm». elm-lang.org.
7. ↑ «elm-lang/elm-compiler». GitHub.
8. ↑ «repl». elm-lang.org. Archivado desde el original el 31 de mayo de 2015. Consultado el 5 de octubre de 2018.
9. ↑ «package manager». elm-lang.org. Archivado desde el original el 13 de marzo de 2016. Consultado el 5 de octubre de 2018.
10. ↑ «Time Travel made Easy». http://elm-lang.org.
11. ↑ «elm/compiler». GitHub.
12. ↑ «Elm Packages». package.elm-lang.org. Archivado desde el original el 11 de febrero de 2015. Consultado el 5 de octubre de 2018.
13. ↑ «Ellie, the Elm Live Editor».
14. ↑ «Sintaxis». elm-lang.org. Archivado desde el original el 13 de marzo de 2016. Consultado el 5 de octubre de 2018.
15. ↑ «core 5.1.1». package.elm-lang.org.
16. ↑ «Custom Types». guide.elm-lang.org. Consultado el 5 de octubre de 2018.
17. ↑ «JavaScript Interop». guide.elm-lang.org.
18. ↑ «elm/html». package.elm-lang.org.
19. ↑ «blazing fast html». elm-lang.org. Archivado desde el original el 13 de marzo de 2016. Consultado el 5 de octubre de 2018.
20. ↑ «Higher-Kinded types Not Expressible? #396». github.com/elm-lang/elm-compiler. Consultado el 6 de marzo de 2015.

## Enlaces externos

[editar]

* Web oficial
* Guía oficial de Elm (Inglés)

Control de autoridades|

* Proyectos Wikimedia
* Datos: Q5366250

|

* Datos: Q5366250