Introductory talk about Elixir, showcasing the core features and aims of the language.
Originally presented by Dimitris Zorbas at the 26th Athens Ruby Meetup, hosted by Skroutz.
2. is a functional, concurrent language designed for
building scalable and maintainable applications.
Dimitris Zorbas - Athens Ruby Meetup#26
The power of Erlang meets the joy of Ruby!
3. Why Bother?
➔ Created by a rubyist
aimed to rubyists
➔ Learn a new language
every year
➔ Even Matz likes it!
Dimitris Zorbas - Athens Ruby Meetup#26
4. Really Why Bother?
Seems to solve the core issues of Ruby
(performance / scalability / maintainability),
adopting a functional programming model, with a
sweet Ruby-like syntax and cherries on top.
Dimitris Zorbas - Athens Ruby Meetup#26
8. Features
Pattern-Matching
Dimitris Zorbas - Athens Ruby Meetup#26
Pattern matching is one of the cornerstones of an equational style of
definition; more often than not it leads to a cleaner and more readily
understandable definition than a style based on conditional
equations. It also simplifies the process of reasoning formally about
functions.
9. Features
Pattern-Matching
Dimitris Zorbas - Athens Ruby Meetup#26
defmodule Speaker do
def talk(:bob), do: "Hi, uncle Bob!"
def talk(42), do: "Oh! the answer to life the universe and everything"
def talk(n) when is_number(n), do: "You're an ordinary number"
def talk(_), do: "I don't really know what to tell you"
end
10. Concurrency: Actor Model
Features
Dimitris Zorbas - Athens Ruby Meetup#26
Processes (actors) are the center of computation and have mailboxes.
They communicate by sending asynchronous messages to each other.
11. Concurrency: Actor Model
Features
Dimitris Zorbas - Athens Ruby Meetup#26
OOP to me means only messaging, local retention and protection and
hiding of state-process and extreme late-binding of all things.
12. Dimitris Zorbas - Athens Ruby Meetup#26
defmodule Speaker do
import IO, only: [puts: 1]
def new, do: spawn &start/0
def start do
receive do
{:answer, name} -> puts talk(name)
_ -> puts "I don't know how to handle that"
after
2000 -> puts "[#{inspect(self)}] Tell me something to do"
end
start
end
def talk(:bob), do: "Hi, uncle Bob!"
def talk(42), do: "Oh! the answer to life the universe and everything"
def talk(n) when is_number(n), do: "You're an ordinary number"
def talk(_), do: "I don't really know what to tell you"
end
13. Features
Async Tests
defmodule SpeakerTest do
use ExUnit.Case, async: true # Examples run concurrently
test "talking to bob" do
assert Speaker.talk(:bob) == "Hi, uncle Bob!"
End
test "talking to a stranger" do
assert Speaker.talk(:voldemort) == "I don't really know what to tell you"
end
end
Dimitris Zorbas - Athens Ruby Meetup#26
15. Live Fast, Die Young
Philosophy
Dimitris Zorbas - Athens Ruby Meetup#26
16. Live Fast, Die Young
Philosophy
Dimitris Zorbas - Athens Ruby Meetup#26
● Failures are embraced and managed. Let it crash!
● Failure is isolated in process level. No exceptions.
● Failing fast is revealing. The system stays up.
● Write Offensive Code
17. Live Fast, Die Young
Philosophy
Dimitris Zorbas - Athens Ruby Meetup#26
The world is concurrent. Things in the world don't share data.
Things communicate with messages. Things fail.