La vitesse des processeurs n'augmente plus beaucoup mais le nombre de coeurs augmente.
Source : Erlang the Movie (lien YouTube)
synchronized
Libre depuis 1998. Actuellement sous licence Apache 2.0
,
;
et .
Joe Armstrong en 1990 dans Erlang the Movie (lien YouTube)
Source : The Erlang Ecosystem - Robert Virding (lien Vimeo)
José Valim en 2019 dans The One Who Created Elixir
Quelques caractéristiques intéressantes :
|>
squares = Enum.map(1..10, fn x ->
x * x
end)
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
even_squares = Enum.filter(squares, fn x ->
rem(x, 2) == 0
end)
[4, 16, 36, 64, 100]
message = %{date: ~D[2019-11-14], author: "Bob"}
%{author: "Bob", date: ~D[2019-11-14]}
i message
Term %{author: "Bob", date: ~D[2019-11-14]} Data type Map Reference modules Map Implemented protocols Collectable, Ecto.DataType, Enumerable, IEx.Info, Inspect, Poison.Decoder, Poison.Encoder
Autres langages :
message["body"] = "C'est quoi Elixir ?"
Map.put(message, :body, "C'est quoi Elixir")
%{author: "Bob", body: "C'est quoi Elixir", date: ~D[2019-11-14]}
message
n'est pas altéré :
message
%{author: "Bob", date: ~D[2019-11-14]}
message = Map.put(message, :body, "C'est quoi Elixir ?")
message
%{author: "Bob", body: "C'est quoi Elixir ?", date: ~D[2019-11-14]}
data = copy(something)
result = do_something_with(data)
data == something
Traduction wikipedia : filtrage par motif
Traduction Alex : correspondance structurelle
texte | structures de données |
---|---|
expressions régulières | pattern matching |
La déstructuration dans d'autres langages :
>>> [author, body] = ["Bob", "C'est quoi Elixir ?"]
>>> author
'Bob'
>>> body
"C'est quoi Elixir ?"
%{author: author} = message
author
"Bob"
%{author: "Bob"} = message
%{author: "Bob", body: "C'est quoi Elixir ?", date: ~D[2019-11-14]}
%{author: "Alice"} = message # Valeur ne correspond pas
** %MatchError{term: %{author: "Bob", body: "C'est quoi Elixir ?", date: ~D[2019-11-14]}}
%{author: "Bob", title: title} = message # Clé ne correspond pas
** %MatchError{term: %{author: "Bob", body: "C'est quoi Elixir ?", date: ~D[2019-11-14]}}
case message do
%{author: "Bob", body: body} ->
"Message écrit par ce bon vieux Bob: #{body}"
%{author: author} ->
"Message écrit par une autre personne qui s'appelle #{author}"
end
"Message écrit par ce bon vieux Bob: C'est quoi Elixir ?"
Dans d'autres langages :
void shout(String s) {
System.out.println(s.toUpperCase() + "!");
}
void shout(int i) {
System.out.println(i + "!");
}
defmodule Chat do
def respond(%{author: "Bob"}), do: "Ah c'est toi !"
def respond(%{author: author}), do: "Bonjour #{author} !"
def respond(_), do: "hmm?"
end
Chat.respond(message)
"Ah c'est toi !"
Chat.respond(%{author: "José Valim", body: "J'ai créé Elixir !"})
"Bonjour José Valim !"
Chat.respond(42)
"hmm?"
<<start::size(8), type::bytes-size(3), _::binary>> = File.read!("/bin/ls")
type
"ELF"
case File.read!("/bin/ls") do
<<127, "ELF", rest::binary>> ->
"Exécutable " <> case rest do
<<1, _::binary>> -> "32 bits"
<<2, _::binary>> -> "64 bits"
end
_ -> "Autre type de fichier"
end
"Exécutable 64 bits"
defmodule Chat do
def new(), do: []
def add_message(chat, author, body) do
message = %{author: author, body: body, time: Time.utc_now()}
[message | chat] # cons
end
def display(chat) do
for message <- Enum.reverse(chat) do
IO.puts("[#{message.time}] #{message.author}: #{message.body}")
end
end
end
warning: redefining module Chat (current version defined in memory)
nofile:1
{:module, Chat, <<70, 79, 82, 49, 0, 0, 9, 40, 66, 69, 65, 77, 65, 116, 85, 56, 0, 0, 1, 46, 0, 0, 0, 33, 11, 69, 108, 105, 120, 105, 114, 46, 67, 104, 97, 116, 8, 95, 95, 105, 110, 102, 111, 95, 95, 7, 99, ...>>, {:display, 1}}
chat = Chat.new()
chat = Chat.add_message(chat, "Bob", "C'est quoi Elixir ?")
chat = Chat.add_message(chat, "Alice", "C'est un langage de programmation.")
Chat.display(chat)
[16:36:42.543080] Bob: C'est quoi Elixir ? [16:36:42.543118] Alice: C'est un langage de programmation.
[:ok, :ok]
Chat.new()
|> Chat.add_message("Bob", "C'est quoi Elixir ?")
|> Chat.add_message("Alice", "C'est un langage de programmation.")
|> Chat.display()
[16:36:42.963071] Bob: C'est quoi Elixir ? [16:36:42.963122] Alice: C'est un langage de programmation.
[:ok, :ok]
~w(liste de mots)
pid = spawn(
fn -> Process.sleep(30_000)
end)
pid
#PID<0.289.0>
Process.alive?(pid)
true
Process.exit(pid, :kill)
Process.alive?(pid)
false
:erlang.system_info(:process_count)
135
1..50_000
|> Enum.map(fn _ ->
spawn(fn -> Process.sleep(10_000) end)
end)
|> length
50000
:erlang.system_info(:process_count)
50135
:erlang.system_info(:process_limit)
262144
:erlang.system_info(:schedulers)
4
send/receive
parent_process = self() |> IO.inspect
spawn(fn ->
IO.inspect(self())
Process.sleep(2000)
send(parent_process, {:response, "j'ai fini"})
end)
receive do
{:response, message} -> "Le process m'a envoyé : #{message}"
after
5000 -> :timeout
end
#PID<0.233.0> #PID<0.17538.1>
"Le process m'a envoyé : j'ai fini"
Support : https://gitlab.com/amarandon/presentation-elixir
Projet d'exemple : https://gitlab.com/amarandon/chat-example