Elixir | |
---|---|
![]() Elixir | |
Paradigms | multi-paradigm: functional, concurrent, distributed, process-oriented |
Designed by | José Valim |
First appeared | 2012 |
Stable release | |
Typing discipline | dynamic, strong |
Platform | Erlang |
License | Apache License 2.0 [2] |
Filename extensions | .ex, .exs |
Website | elixir-lang |
Influenced by | |
Clojure, Erlang, Ruby | |
Influenced | |
Gleam, LFE |
Elixir is a functional, concurrent, high-level general-purpose programming language that runs on the BEAM virtual machine, which is also used to implement the Erlang programming language. [3] Elixir builds on top of Erlang and shares the same abstractions for building distributed, fault-tolerant applications. Elixir also provides tooling and an extensible design. The latter is supported by compile-time metaprogramming with macros and polymorphism via protocols. [4]
The community organizes yearly events in the United States, [5] Europe, [6] and Japan, [7] as well as minor local events and conferences. [8] [9]
José Valim created the Elixir programming language as a research and development project at Plataformatec. His goals were to enable higher extensibility and productivity in the Erlang VM while maintaining compatibility with Erlang's ecosystem. [10] [11]
Elixir is aimed at large-scale sites and apps. It uses features of Ruby, Erlang, and Clojure to develop a high-concurrency and low-latency language. It was designed to handle large data volumes. Elixir is also used in telecommunications, e-commerce, and finance. [12]
In 2021, the Numerical Elixir effort was announced with the goal of bringing machine learning, neural networks, GPU compilation, data processing, and computational notebooks to the Elixir ecosystem. [13]
Each of the minor versions supports a specific range of Erlang/OTP versions. [14] The current stable release version is 1.18.4 [1] .
with
construct [18] The following examples can be run in an iex
shell or saved in a file and run from the command line by typing elixir <filename>
.
Classic Hello world example:
iex> IO.puts("Hello World!")Hello World!
Pipe operator:
iex> "Elixir"|>String.graphemes()|>Enum.frequencies()%{"E" => 1, "i" => 2, "l" => 1, "r" => 1, "x" => 1}iex> %{values:1..5}|>Map.get(:values)|>Enum.map(&&1*2)[2, 4, 6, 8, 10]iex> %{values:1..5}|>Map.get(:values)|>Enum.map(&&1*2)|>Enum.sum()30
Pattern matching (a.k.a. destructuring):
iex> %{left:x}=%{left:5,right:8}iex> x5iex> {:ok,[_|rest]}={:ok,[1,2,3]}iex> rest[2, 3]
Pattern matching with multiple clauses:
iex> caseFile.read("path/to/file")doiex> {:ok,contents}->IO.puts("found file: #{contents}")iex> {:error,reason}->IO.puts("missing file: #{reason}")iex> end
iex> forn<-1..5,rem(n,2)==1,do:n*n[1, 9, 25]
Asynchronously reading files with streams:
1..5|>Task.async_stream(&File.read!("#{&1}.txt"))|>Stream.filter(fn{:ok,contents}->String.trim(contents)!=""end)|>Enum.join("\n")
Multiple function bodies with guards:
deffib(n)whennin[0,1],do:ndeffib(n),do:fib(n-2)+fib(n-1)
Relational databases with the Ecto library:
schema"weather"dofield:city# Defaults to type :stringfield:temp_lo,:integerfield:temp_hi,:integerfield:prcp,:float,default:0.0endWeather|>where(city:"Kraków")|>order_by(:temp_lo)|>limit(10)|>Repo.all
Sequentially spawning a thousand processes:
fornum<-1..1000,do:spawnfn->IO.puts("#{num*2}")end
Asynchronously performing a task:
task=Task.asyncfn->perform_complex_action()endother_time_consuming_action()Task.awaittask
[ citation needed ]
{{cite book}}
: CS1 maint: location (link)