Elixir es un lenguaje de programación funcional , concurrente y de alto nivel de propósito general que se ejecuta en la máquina virtual BEAM , que también se utiliza para implementar el lenguaje de programación Erlang . [3] Elixir se basa en Erlang y comparte las mismas abstracciones para crear aplicaciones distribuidas y tolerantes a fallos . Elixir también proporciona herramientas y un diseño extensible . Este último está respaldado por metaprogramación en tiempo de compilación con macros y polimorfismo a través de protocolos. [4]
La comunidad organiza eventos anuales en Estados Unidos, [5] Europa, [6] y Japón, [7] así como eventos y conferencias locales menores. [8] [9]
José Valim creó el lenguaje de programación Elixir como un proyecto de investigación y desarrollo en Plataformatec. Sus objetivos eran permitir una mayor extensibilidad y productividad en la máquina virtual Erlang, manteniendo al mismo tiempo la compatibilidad con el ecosistema de Erlang. [10] [11]
Elixir está orientado a sitios y aplicaciones de gran escala. Utiliza características de Ruby , Erlang y Clojure para desarrollar un lenguaje de alta concurrencia y baja latencia. Fue diseñado para manejar grandes volúmenes de datos. Elixir también se utiliza en telecomunicaciones, comercio electrónico y finanzas. [12]
En 2021, se anunció el esfuerzo de Numerical Elixir con el objetivo de incorporar aprendizaje automático, redes neuronales, compilación de GPU, procesamiento de datos y cuadernos computacionales al ecosistema Elixir. [13]
Cada una de las versiones menores admite un rango específico de versiones de Erlang/ OTP . [14] La versión de lanzamiento estable actual es 1.17.3 [1] .
with
constructo [18]Los siguientes ejemplos se pueden ejecutar en un iex
shell o guardar en un archivo y ejecutar desde la línea de comandos escribiendo .elixir <filename>
Ejemplo clásico de Hola mundo :
iex> IO . puts ( "¡Hola mundo!" ) ¡Hola mundo!
Operador de tubería:
iex> "Elixir" |> String .graphemes () |> Enum .frequency () % {"E" => 1, "i" => 2, "l " => 1, "r" => 1, "x" => 1} iex> %{ valores : 1 .. 5 } |> Mapa . get ( : valores ) |> Enumeración . map ( & &1 * 2 ) [2, 4, 6, 8, 10] iex> |> Enumeración . suma () 30
Coincidencia de patrones (también conocida como desestructuración):
iex> %{ izquierda : x } = %{ izquierda : 5 , derecha : 8 } iex> x 5 iex> { :ok , [ _ | resto ]} = { :ok , [ 1 , 2 , 3 ]} iex > resto [2, 3]
Coincidencia de patrones con múltiples cláusulas:
iex> case File . read ( "ruta/al/archivo" ) do iex> { :ok , contenidos } -> IO . puts ( "archivo encontrado: #{ contenidos } " ) iex> { :error , motivo } -> IO . puts ( "archivo faltante: #{ motivo } " ) iex> end
iex> para n <- 1 .. 5 , rem ( n , 2 ) == 1 , hacer : n * n [1, 9, 25]
Lectura asincrónica de archivos con secuencias:
1 .. 5 |> Tarea . async_stream ( & Archivo . read! ( " #{ &1 } . txt" )) |> Flujo . filter ( fn { :ok , contenido } -> Cadena . trim ( contenido ) != "" fin ) |> Enumeración . join ( " \n " )
Cuerpos con funciones múltiples y protectores :
def fib ( n ) cuando n está en [ 0 , 1 ], hacer : n def fib ( n ), hacer : fib ( n - 2 ) + fib ( n - 1 )
Bases de datos relacionales con la biblioteca Ecto:
esquema "clima" do campo :ciudad # Por defecto es tipo :cadena campo :temp_lo , :entero campo :temp_hi , :entero campo :prcp , :float , predeterminado : 0.0 fin Tiempo |> dónde ( ciudad : "Cracovia" ) |> ordenar_por ( :temp_lo ) |> límite ( 10 ) |> Repo . todo
Generando secuencialmente mil procesos:
para num <- 1 .. 1000 , hacer : spawn fn -> IO . puts ( " #{ num * 2 } " ) fin
Ejecutar una tarea de forma asincrónica :
tarea = Tarea . async fn -> realizar_acción_compleja () fin otra_acción_que_consume_tiempo () Tarea . esperar tarea
[ cita requerida ]
{{cite book}}
: Mantenimiento de CS1: ubicación ( enlace )