origins of elixir programming language

121
# my_script.exs defmodule MyModule do def my_func do IO.puts("Hello, world!") end end MyModule.my_func() gmile@macbook ~> elixir my_script Hello, world! gmile@macbook ~> iex iex(1)> c “my_script.exs” [MyModule] iex(1)> MyModule.my_func "Hello, world!” :ok

Upload: pivorak-meetup

Post on 11-Apr-2017

30 views

Category:

Software


1 download

TRANSCRIPT

Page 1: Origins of Elixir programming language

# my_script.exs

defmodule MyModule do def my_func do IO.puts("Hello, world!") endend

MyModule.my_func()

gmile@macbook ~> elixir my_scriptHello, world!

gmile@macbook ~> iexiex(1)> c “my_script.exs”[MyModule]iex(1)> MyModule.my_func"Hello, world!”:ok

Page 2: Origins of Elixir programming language

defmodule MyModule do def my_func(1), do: "Got one!" def my_func(2), do: "Got two!" def my_func(n), do: "Got #{n}!"end

IO.puts(MyModule.my_func(10))IO.puts(MyModule.my_func(5))IO.puts(MyModule.my_func(2))IO.puts(MyModule.my_func(1))

Page 3: Origins of Elixir programming language

defmodule MyModule do def my_func(1), do: "Got one!" def my_func(2), do: "Got two!" def my_func(n), do: "Got #{n}!"end

MyModule.my_func(10) |> IO.putsMyModule.my_func(5) |> IO.putsMyModule.my_func(2) |> IO.putsMyModule.my_func(1) |> IO.puts

Page 4: Origins of Elixir programming language

defmodule MyModule do def my_func(a_thing) when is_list(a_thing) do "Got a list!” end

def my_func(a_thing) when is_integer(a_thing) do "Got a number!” end

def my_func(_) "Got something else!” endend

MyModule.my_func([1,2,3]) # => “Got a list!”MyModule.my_func(369) # => “Got a number!”MyModule.my_func(“yo”) # => “Got something else!”

Page 5: Origins of Elixir programming language

defmodule MyModule do def match_a_list([head|tail]) do IO.puts(“First element is #{head}!”) endend

Page 6: Origins of Elixir programming language

defmodule MyModule do def match_a_list([one, two|tail]) do IO.puts(“First element is #{one}!”) IO.puts(“Second element is #{two}!”) match_a_list(tail) endend

Page 7: Origins of Elixir programming language

defmodule MyModule do def match_a_list([]) do IO.puts(“A list is empty!”) end

def match_a_list([one, two|tail]) do IO.puts(“First element is #{one}!”) IO.puts(“Second element is #{two}!”) match_a_list(tail) endend

Page 8: Origins of Elixir programming language

defmodule MyModule do def match_a_list([one, two|tail]) do IO.puts(“First element is #{one}!”) IO.puts(“Second element is #{two}!”) endend

Page 9: Origins of Elixir programming language

defmodule MyModule do def match_a_list([{_,b,_}|tail]) do IO.puts(“First element is a tuple”) IO.puts(“Tuple’s second element is #{b}”) endend

Page 10: Origins of Elixir programming language

defmodule MyModule do def match_a_list([t = {_,b,_}|tail]) do IO.puts(“First element is a tuple of size 3”) IO.puts(“Tuple’ss second element is #{b}”) endend

Page 11: Origins of Elixir programming language

defmodule Anagram do def match(base, candidates) do base_ = String.downcase(base) fingerprint = fingerprint(base_)

Enum.filter(candidates, fn(candidate) -> cand_ = String.downcase(candidate) cand_ != base_ && fingerprint(cand_) == fingerprint end) end

def fingerprint(string) do string |> String.codepoints |> Enum.sort endend

Page 12: Origins of Elixir programming language
Page 13: Origins of Elixir programming language

Kyiv, July 2016

Introduction toElixir & Erlang

VM

Kiev, 2016

Page 14: Origins of Elixir programming language

Erlang.Brief history and facts

Erlang VM.An overview of languages on BEAM

Elixir.Brief history and ecosystem overview

Page 15: Origins of Elixir programming language
Page 16: Origins of Elixir programming language

Who created Erlang?

Page 17: Origins of Elixir programming language
Page 18: Origins of Elixir programming language
Page 19: Origins of Elixir programming language
Page 20: Origins of Elixir programming language
Page 21: Origins of Elixir programming language

Who uses Erlang in production?

Page 22: Origins of Elixir programming language
Page 23: Origins of Elixir programming language
Page 24: Origins of Elixir programming language
Page 25: Origins of Elixir programming language

How old is erlang?

Page 26: Origins of Elixir programming language
Page 27: Origins of Elixir programming language

version 1.03 “lost in

the mists of time”

Page 28: Origins of Elixir programming language

version 1.06 dated 1986-12-18

Page 29: Origins of Elixir programming language

Who supports erlang today?

Page 30: Origins of Elixir programming language
Page 31: Origins of Elixir programming language
Page 32: Origins of Elixir programming language

How many packages are there?

Page 33: Origins of Elixir programming language

470!

Page 34: Origins of Elixir programming language

What are some of the most popular

libs/projects?

Page 35: Origins of Elixir programming language
Page 36: Origins of Elixir programming language

How many popular projects

are there, per GitHub?

Page 37: Origins of Elixir programming language
Page 38: Origins of Elixir programming language

What exactly erlang is?

Page 39: Origins of Elixir programming language

erlang a mathematician

a measurement unit

a programming language

Page 40: Origins of Elixir programming language

erlang the language itself (syntax)

the OTP framework

the virtual machine

Page 41: Origins of Elixir programming language

-module(hello).-export([hello_world/0]).

hello_world() -> io:fwrite("hello, world\n").

Page 42: Origins of Elixir programming language

Eshell V8.0.1 (abort with ^G)1> c(hello).{ok,hello}2> hello:hello_world().hello, worldok

Page 43: Origins of Elixir programming language

-module(count_to_ten).-export([count_to_ten/0]). count_to_ten() -> do_count(0). do_count(10) -> 10;do_count(Value) -> do_count(Value + 1).

Page 44: Origins of Elixir programming language

Open Telecom Platform

Page 45: Origins of Elixir programming language

OTP ~~~ It’s a framework ~~~

a set of design principles

a set of tools

Page 46: Origins of Elixir programming language
Page 47: Origins of Elixir programming language

BEAM

Page 48: Origins of Elixir programming language

What is BEAM?

Page 49: Origins of Elixir programming language

BEAM a name for virtual machine

binary file format

file extension, e.g. .beam

Page 50: Origins of Elixir programming language

Before BEAM Warren Abstract Machine, WAM

Joe’s Abstract Machine, JAM

Bogdan's Erlang Abstract Machine

Page 51: Origins of Elixir programming language

Bogdan/Björn's Erlang Abstract

Machine

Page 52: Origins of Elixir programming language

Current version is R19

Page 53: Origins of Elixir programming language

Line numbersin exceptions,

woohoo!!!

Page 54: Origins of Elixir programming language
Page 55: Origins of Elixir programming language

What kind of virtual machine

BEAM is?

Page 56: Origins of Elixir programming language

What is M in VM?

Page 57: Origins of Elixir programming language
Page 58: Origins of Elixir programming language
Page 59: Origins of Elixir programming language

{module, add}. %% version = 0{exports, [{add,2},{module_info,0},{module_info,1}]}.{attributes, []}.{labels, 9}.

{function, add, 2, 2}. {label,1}. {line,[{location,"add.erl",6}]}. {func_info,{atom,add},{atom,add},2}. {label,2}. {allocate,1,2}. {move,{x,1},{y,0}}. {line,[{location,"add.erl",7}]}. {call,1,{f,4}}. {move,{x,0},{x,1}}. {move,{y,0},{x,0}}. {move,{x,1},{y,0}}. {line,[{location,"add.erl",7}]}. {call,1,{f,4}}. {line,[{location,"add.erl",7}]}. {gc_bif,'+',{f,0},1,[{y,0},{x,0}],{x,0}}. {deallocate,1}. return.

{function, id, 1, 4}. {label,3}. {line,[{location,"add.erl",9}]}. {func_info,{atom,add},{atom,id},1}. {label,4}. return.

{function, module_info, 0, 6}. {label,5}. {line,[]}. {func_info,{atom,add},{atom,module_info},0}. {label,6}. {move,{atom,add},{x,0}}. {line,[]}. {call_ext_only,1,{extfunc,erlang,get_module_info,1}}.

{function, module_info, 1, 8}. {label,7}. {line,[]}. {func_info,{atom,add},{atom,module_info},1}. {label,8}. {move,{x,0},{x,1}}. {move,{atom,add},{x,0}}. {line,[]}. {call_ext_only,2,{extfunc,erlang,get_module_info,2}}.

-module(add).

-export([add/2]).

add(A, B) -> id(A) + id(B).

id(I) -> I.

Page 60: Origins of Elixir programming language
Page 61: Origins of Elixir programming language
Page 62: Origins of Elixir programming language

158 instructions

Page 63: Origins of Elixir programming language
Page 64: Origins of Elixir programming language

Write your own language that compiles to

BEAM!

Page 65: Origins of Elixir programming language

So: what languages run on BEAM?

Page 66: Origins of Elixir programming language
Page 67: Origins of Elixir programming language
Page 68: Origins of Elixir programming language
Page 69: Origins of Elixir programming language
Page 70: Origins of Elixir programming language
Page 71: Origins of Elixir programming language
Page 72: Origins of Elixir programming language
Page 73: Origins of Elixir programming language
Page 74: Origins of Elixir programming language
Page 75: Origins of Elixir programming language
Page 76: Origins of Elixir programming language
Page 77: Origins of Elixir programming language
Page 78: Origins of Elixir programming language

But before Elixir…

Page 79: Origins of Elixir programming language
Page 80: Origins of Elixir programming language
Page 81: Origins of Elixir programming language
Page 82: Origins of Elixir programming language
Page 83: Origins of Elixir programming language
Page 84: Origins of Elixir programming language
Page 85: Origins of Elixir programming language

Jose Valim

Page 86: Origins of Elixir programming language
Page 87: Origins of Elixir programming language
Page 88: Origins of Elixir programming language

Who created Elixir?

Page 89: Origins of Elixir programming language
Page 90: Origins of Elixir programming language
Page 91: Origins of Elixir programming language

How old is Elixir?

Page 92: Origins of Elixir programming language
Page 93: Origins of Elixir programming language
Page 94: Origins of Elixir programming language
Page 95: Origins of Elixir programming language
Page 96: Origins of Elixir programming language

Who supports Elixir today?

Page 97: Origins of Elixir programming language
Page 98: Origins of Elixir programming language

What is Elixir?

Page 99: Origins of Elixir programming language

Functional Concurrent

General-purpose programming

language

Page 100: Origins of Elixir programming language

Supports:metaprogramming

via macrospolymorphism via

protocols

Page 101: Origins of Elixir programming language

How many packages are there?

Page 102: Origins of Elixir programming language
Page 103: Origins of Elixir programming language

How many popular projects

are there, per GitHub?

Page 104: Origins of Elixir programming language
Page 105: Origins of Elixir programming language

What are some of the most popular

libs?

Page 106: Origins of Elixir programming language
Page 107: Origins of Elixir programming language
Page 108: Origins of Elixir programming language
Page 109: Origins of Elixir programming language
Page 110: Origins of Elixir programming language

Who uses Elixir in production?

Page 111: Origins of Elixir programming language
Page 112: Origins of Elixir programming language
Page 113: Origins of Elixir programming language
Page 114: Origins of Elixir programming language

What Joe Armstrong thinks of Elixir?

Page 115: Origins of Elixir programming language
Page 116: Origins of Elixir programming language

> Elixir has a non-scary syntax and combines the

good features of Ruby and Erlang.

> It's not Erlang and it's not Ruby and it has ideas of its

own.

Page 117: Origins of Elixir programming language

What Elixir offers?

Page 118: Origins of Elixir programming language

defmodule MathTest do use ExUnit.Case, async: true

test "can add two numbers" do assert 1 + 1 == 2 endend

Page 119: Origins of Elixir programming language

import Supervisor.Spec

children = [ supervisor(TCP.Pool, []), worker(TCP.Acceptor, [4040])]

Supervisor.start_link(children, strategy: :one_for_one)

Page 120: Origins of Elixir programming language

parent = self()

# Spawns an Elixir process (not an OS process!)spawn_link(fn -> send parent, {:msg, "hello world"}end)

# Block until the message is receivedreceive do {:msg, contents} -> IO.puts contentsend

Page 121: Origins of Elixir programming language