Introduction to Erlang

50 %
50 %
Information about Introduction to Erlang
Technology

Published on February 28, 2009

Author: gabriele.lana

Source: slideshare.net

Description

Introduction to erlang programming language

Introduction to Erlang Gabriele Lana gabriele.lana@gmail.com

Why Erlang? Damien Katz @ Ruby Fringe 2008

Erlang Shell Erlang (BEAM) emulator version 5.5.6 [source] [smp:1] [async-threads:0] [hipe] [kernel-poll:true] Eshell V5.5.6 (abort with ^G) 1>

Syntax: Number 1> 3. 3 2> 1 + 2008. 2009 3> 849274893217458392017483921 * 78932489321748392107483291. 6703538144011604048584954184722646309721233336866 4011

Syntax: Atom 1> atom. atom 2> anythingStartingWithLowercaseLetter. anythingStartingWithLowercaseLetter 3> 'anything enclosed in single quotes'. 'anything enclosed in single quotes'

Syntax: Boolean 1> true. true 2> false. false 3> is_atom(true). true 4> is_boolean(true). true

Syntax: String 1> quot;fooquot;. quot;fooquot; 2> quot;anything enclosed in double quotesquot;. quot;anything enclosed in double quotesquot;

Syntax: List 1> []. [] 2> [ 1 ]. [1] 3> [ first ]. [first] 4> [ quot;firstquot; ]. [quot;firstquot;] 5> [ 1, first, quot;firstquot; ]. [1,first,quot;firstquot;]

Syntax: Strings are Lists 1> [ 72, 101, 108, 108, 111 ]. quot;Helloquot; 2> $H. 72 3> [ $H, $e, $l, $l, $o ]. quot;Helloquot;

Syntax: Tuple 1> { 1, 2, 3 }. {1,2,3} 2> { name, quot;Gabrielequot; }. {name,quot;Gabrielequot;} 3> { coder, { name, quot;Gabrielequot; }, { language, quot;Erlangquot; } }. {coder,{name,quot;Gabrielequot;},{language,quot;Erlangquot;}}

Pattern Matching 1> 1 = 1. 1 2> 1 = 2. ** exception error: no match of right hand side value 2 3> catch 1 = 2. {'EXIT',{{badmatch,2},[{erl_eval,expr,3}]}}

Pattern Matching: Binding Variables 1> X. * 1: variable 'X' is unbound 2> X = 5. 5 3> X. 5 4> X = 6. ** exception error: no match of right hand side value 6

Pattern Matching: Destructuring 1> Coder = { coder, { name, quot;Gabrielequot; } }. {coder,{name,quot;Gabrielequot;}} 2> { person, { name, PersonName } } = Coder. ** exception error: no match of right hand side value {coder, {name,quot;Gabrielequot;}} 3> { coder, { name, quot;Gabrielequot; } } = Coder. {coder,{name,quot;Gabrielequot;}} 4> { coder, { name, CoderName } } = Coder. {coder,{name,quot;Gabrielequot;}}

Pattern Matching: Destructuring 7> AnotherCoderName = quot;Matteoquot;. quot;Matteoquot; 8> { coder, { name, AnotherCoderName } } = Coder. ** exception error: no match of right hand side value {coder, {name,quot;Gabrielequot;}}

Pattern Matching: List 1> [ First, Last ] = [ first, last ]. [first,last] 2> First. first 3> Last. last

Pattern Matching: List 4> [ Head | Tail ] = [ 1, 2, 3, 4, 5 ]. [1,2,3,4,5] 5> Head. 1 6> Tail. [2,3,4,5]

Pattern Matching: List 1> [ First, Second | Others ] = [ 1, 2, 3, 4, 5 ]. [1,2,3,4,5] 2> First. 1 3> Second. 2 4> Others. [3,4,5]

Pattern Matching: In Deep 1> { X, Y, X } = { { abc, 12 }, 42, { abc, 12 } }. {{abc,12},42,{abc,12}} 2> X. {abc,12} 3> Y. 42

Pattern Matching: In Deep 1> { X, Y, X } = { { abc, 12 }, 42, true }. ** exception error: no match of right hand side value {{abc, 12},42,true} 2> { X, Y, _ } = { { abc, 12 }, 42, true }. {{abc,12},42,true}

Function -module(examples). -export([ hello/0 ]). hello() -> quot;Hello World!quot;. 1> c(examples). {ok,examples} 2> examples:hello(). quot;Hello World!quot;

Syntax: Punctuation • Periods (.) end everything except when • Semicolons (;) end clauses • and Commas (,) separate expressions

Function: Pattern Mathing & Clause -export([ double/1 ]). double(0) -> 0; double(Number) -> Number * 2. 1> examples:double(0). 0 2> examples:double(4). 8

Function: Guard double(0) -> 0; double(Number) when is_integer(Number) -> Number * 2. 1> examples:double(4). 8 2> examples:double(foo). ** exception error: no function clause matching examples:double(foo)

Function: Guard double(0) -> 0; double(Number) when is_integer(Number) -> Number * 2; double(AnythingElse) -> io:format(quot;I don't know how to double ~p~nquot;, [ AnythingElse ]), error. 1> examples:double(foo). I don't know how to double foo error

Function: Anonymous & Closure multiplyBy(Multiplier) -> fun(Number) -> Number * Multiplier end. 1> Double = examples:multiplyBy(2). #Fun<examples.0.46516809> 2> Double(4). 8 3> MultiplyBy4 = examples:multiplyBy(4). #Fun<examples.0.46516809> 4> MultiplyBy4(4). 16

Function: Tail Recursion printList([]) -> ok; printList([ Item | List ]) -> io:format(quot;~p~nquot;, [ Item ]), printList(List). 1> examples:printList([ 1, 2, 3, 4 ]). 1 2 3 4 ok

Function: High Order Function foreach(_Function, []) -> ok; foreach(Function, [ Item | List ]) -> Function(Item), foreach(Function, List). 1> examples:foreach( fun(Item) -> io:format(quot;~p~nquot;, [ Item ]) end, [ 1, 2, 3, 4 ]). 1 2 3 4

Function: High Order Function foreach(Function, List) -> lists:foreach(Function, List). 1> examples:foreach( fun(Item) -> io:format(quot;~p~nquot;, [ Item ]) end, [ 1, 2, 3, 4 ]). 1 2 3 4 ok

Function: High Order Function 3> lists:foreach( fun(Item) -> io:format(quot;~p~nquot;, [ Item ]) end, [ 1, 2, 3, 4 ]). 1 2 3 4 ok

List Functions: Map names(Coders) -> lists:map(fun({ coder, { name, CoderName } }) -> CoderName end, Coders). 1> examples:names([ 1> { coder, { name, quot;Gabrielequot; } }, 1> { coder, { name, quot;Matteoquot; } } 1> ]). [quot;Gabrielequot;,quot;Matteoquot;]

Syntax: List Comprehension triplets(UpTo) when is_number(UpTo), UpTo >= 2 -> [ { A, B, C } || A <- lists:seq(2, UpTo), B <- lists:seq(2, UpTo), C <- lists:seq(2, UpTo), A * A + B * B =:= C * C ]. 1> examples:triplets(10). [{3,4,5},{4,3,5},{6,8,10},{8,6,10}]

List Functions: Fold/Reduce sum(Numbers) -> lists:foldl(fun(Number, Sum) -> Sum + Number end, 0, Numbers). 1> examples:sum([ 1, 2, 3, 4, 5 ]). 15

List Functions: Fold/Reduce sum(Numbers) -> lists:foldl(fun (Number, Sum) when is_integer(Number) -> Sum + Number; (_Number, Sum) -> Sum end, 0, Numbers). 1> examples:sum([ 1, 2, 3, foo, 4, bar, 5 ]). 15

Example: FizzBuzz fizzbuzz(UpTo) -> lists:map(fun(Counter) -> if (Counter rem 15) =:= 0 -> fizzbuzz; (Counter rem 3) =:= 0 -> fizz; (Counter rem 5) =:= 0 -> buzz; true -> Counter end end, lists:seq(1, UpTo)). 1> examples:fizzbuzz(16). [1,2,fizz,4,buzz,fizz,7,8,fizz,buzz,11,fizz,13,14,fizzbuzz,16]

Process: Concurrency • Any function (named or anonymous) can become a process • A process is simply a function executing in parallel • A process shares nothing with other processes • A process is extremely lightweight: a modern systems can accommodate literally millions of Erlang processes

Process: Concurrency 1> processes:profileSpawnFor(1000). Spawned 1000 processes in 10 (4) milliseconds ok 2> processes:profileSpawnFor(10000). Spawned 10000 processes in 40 (96) milliseconds ok 3> processes:profileSpawnFor(100000). Spawned 100000 processes in 510 (884) milliseconds ok

Process: Concurrency

Process: Concurrency • The “!” operator sends messages • Asynchronous • Order guaranted • The “receive” statement matches messages • One call to receive, one message removed from the process message queue • Uses pattern matching to select messages

Process: Concurrency 1> Pid = spawn(fun() -> 1> receive 1> die -> io:format(quot;Bye~nquot;) 1> end 1> end). <0.33.0>

Process: Concurrency 2> is_process_alive(Pid). true 3> Pid ! die. Bye die 4> is_process_alive(Pid). false

Process: Concurrency profileSpawnFor(Number) -> Processes = for(1, Number, fun() -> spawn(fun() -> wait() end) end), lists:foreach(fun(Pid) -> Pid ! die end, Processes). wait() -> receive die -> void end.

Process: Fault Tollerance • The “link” function can link processes • When a process die the linked processes receive a message { ‘EXIT’, Died, Reason } • A monitor process could respawn the died ones or cleanup the system

Process: Distributed • The spawn(Node, Function) can spawn a process in any other known nodes • No other changes are required!!!

Hard Gained Insights • Don’t miss tail-call recursion • Asynchronous is good • Small functions are good • When in doubt create a new process • Think early what to do when a process die

Disco (Map/Reduce with Erlang + Python) Yaws (Yet Another Web Server) eJabbered (jabber/XMPP)

Add a comment

Related presentations

Related pages

Erlang -- Introduction

1 Introduction. This section is a quick start tutorial to get you started with Erlang. Everything in this section is true, but only part of the truth.
Read more

Introduction | Learn You Some Erlang for Great Good!

Introduction About this tutorial. This is the beginning of Learn You Some Erlang for Great Good! Reading this tutorial should be one of your first steps in ...
Read more

Erlang -- What is Erlang

1 What is Erlang 1.1 In a nutshell, what is Erlang? Erlang is a general-purpose programming language and runtime environment. Erlang has built-in ...
Read more

6 Telemanagement #187 An Introduction to Erlang B...

6 Telemanagement #187 Reproduction in any form prohibited. For additional copies phone 905-686-5050. “Hey, it’s simple arithmetic! We get 3,200 calls
Read more

Introduction to programming in Erlang, Part 1: The basics

Erlang was developed by Ericsson to aid in the development of software for managing a number of different telecom projects, with the first version being ...
Read more

An Introduction to Erlang - O'Reilly Media - ONLamp.com

An Introduction to Erlang by Gregory Brown 09/13/2007 These days, the functional languages are all the rage. You see more and more hackers from the ...
Read more

An Introduction to Erlang - Erlang Factory

An Introduction to Erlang Erlang Solutions Ltd Francesco Cesarini Founder, Technical Director @FrancescoC francesco@erlang-solutions.com From behind the ...
Read more

An Introduction to Erlang - Erlang Factory

An Introduction to Erlang Author: Richard Carlsson Created Date: 3/30/2012 8:48:19 PM ...
Read more

An Introduction to Erlang B & Erlang C - scribd.com

6. Telemanagement #187 An Introduction to Erlang B and Erlang C IAN ANGUS If you make decisions about networks, PBXs, or call centres, you must understand ...
Read more

Introducing Erlang: Getting Started in Functional ...

Introducing Erlang: Getting Started in Functional Programming eBook: Simon St. Laurent: Amazon.de: Kindle-Shop
Read more