Elixir es un lenguaje de programación de propósito general funcional , concurrente y de alto nivel 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 los Estados Unidos, [5] Europa, [6] y Japón, [7] así como conferencias y eventos 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 Erlang VM mientras se mantenía la compatibilidad con el ecosistema de Erlang. [10] [11]
Elixir está dirigido 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 el aprendizaje automático, las redes neuronales, la compilación de GPU, el procesamiento de datos y los cuadernos computacionales al ecosistema de Elixir. [13]
Cada una de las versiones menores admite un rango específico de versiones de Erlang/ OTP . [14] La versión estable actual es 1.17.2 [1] .
with
construcción [18]Los siguientes ejemplos se pueden ejecutar en un iex
shell o guardar en un archivo y ejecutar desde la línea de comando escribiendo .elixir <filename>
Ejemplo clásico de Hola mundo :
iex> IO . pone ( "¡Hola mundo!" ) ¡Hola mundo!
Operador de tubería:
iex> "Elixir" |> Cadena . grafemas () |> Enum . frecuencias () %{"E" => 1, "i" => 2, "l" => 1, "r" => 1, "x" => 1} iex> %{ valores : 1 .. 5 } |> Mapa . obtener ( :valores ) |> Enum . mapa ( & &1 * 2 ) [2, 4, 6, 8, 10] iex> |> Enum . 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> archivo de caso . leer ( "ruta/al/archivo" ) hacer iex> { :ok , contenido } -> IO . puts ( "archivo encontrado: #{ contenidos } " ) iex> { :error , motivo } -> IO . puts ( "archivo faltante: #{ motivo } " ) iex> fin
iex> para n <- 1 .. 5 , rem ( n , 2 ) == 1 , hacer : n * n [1, 9, 25]
Lectura asincrónica de archivos con transmisiones:
1 .. 5 |> Tarea . async_stream ( & Archivo . leer! ( " #{ &1 } .txt " )) |> Corriente . filter ( fn { :ok , contenido } -> String . trim ( contenido ) ! = "" end ) |> Enum . unirse ( " \n " )
Cuerpos de múltiples funciones con protectores :
def fib ( n ) cuando n 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" hacer campo :ciudad # El valor predeterminado es escribir : campo de cadena :temp_lo , : campo entero :temp_hi , : campo entero :prcp , :float , predeterminado : 0.0 fin Tiempo |> dónde ( ciudad : "Cracovia" ) |> order_by ( :temp_lo ) |> límite ( 10 ) |> Repo . todo
Generando secuencialmente mil procesos:
para num <- 1 .. 1000 , haga : generar fn -> IO . pone ( " #{ num * 2 } " ) fin
Realizar una tarea de forma asincrónica :
tarea = Tarea . async fn -> perform_complex_action () finaliza other_time_consum_action () Tarea . esperar tarea
[ cita necesaria ]
{{cite book}}
: Mantenimiento CS1: ubicación ( enlace )