7li7w devcon5

117
What I learned from Seven Languages in Seven Weeks Kerry Buckley (@kerryb) – DevCon5 25/5/12

Upload: kerry-buckley

Post on 12-May-2015

681 views

Category:

Technology


0 download

DESCRIPTION

A slightly-modified version of my IPRUG talk, this time for the BT DevCon5 developer conference at Adastral Park on 25 May 2012.The main changes are the addition of the Ruby section and the increased number of HHGTTG references in honour of towel day.

TRANSCRIPT

Page 1: 7li7w devcon5

What I learned fromSeven Languagesin Seven Weeks

Kerry Buckley (@kerryb) – DevCon5 25/5/12

Page 2: 7li7w devcon5

Twenty-

Page 3: 7li7w devcon5

RubyIoPrologScalaErlangClojureHaskell

Page 4: 7li7w devcon5
Page 5: 7li7w devcon5
Page 6: 7li7w devcon5

What are the core features thatmake the language unique?

What are the decision constructsand core data structures?

How will you interact with it?What is the programming model?What is the typing model?

Page 7: 7li7w devcon5

Java was like having a rich lawyer as a brother. He was fun when he was younger, but now he’s a black hole that sucks away all the joy in a 100-mile radius.

Page 8: 7li7w devcon5

RubyIoPrologScalaErlangClojureHaskell

Page 9: 7li7w devcon5

Meet Ruby, one of my favorites. She’s sometimes quirky, always beautiful, a little mysterious, and absolutely magical.

Page 10: 7li7w devcon5

>> puts "Hello world"Hello world=> nil

>> name = "Kerry"=> "Kerry"

>> puts "Hello #{name}"Hello Kerry=> nil

The irb console

Page 11: 7li7w devcon5

>> 42.class=> Fixnum

>> nil.class=> NilClass

>> String.class=> Class

> 42.methods=> [:to_s, :+, :-, :*, :/, :abs, ...

Everything’s an object

Page 12: 7li7w devcon5

def double(x) x * 2end

>> double(2)=> 4

>> double(2.5)=> 5.0

>> double("foo")=> "foofoo"

>> double(false)NoMethodError: undefined method `*' for false:FalseClass from (irb):2:in `double'

Duck typing

Page 13: 7li7w devcon5

>> array = [1, 2.0, "three"]

>> array[0]=> 1

>> array.reverse=> ["three", 2.0, 1]

>> range = (1..10)

>> range.include? 5=> true

>> hash = {:foo => 123, "bar" => "", 456 => [1, 2]}

>> hash[456]=> [1, 2]

Arrays, ranges & hashes

Page 14: 7li7w devcon5

>> 3.times { puts "hello" }hellohellohello

>> File.open "some-file", "w" do |f|?> f.write "some-data">> end

>> def delayed_by seconds>> sleep seconds>> yield>> end

>> delayed_by 5 do?> puts "At last!">> endAt last!

Blocks & yield

Page 15: 7li7w devcon5

class NilClass def blank? true endend

class String def blank? empty? endend

>> [nil, "", "foo"].map &:blank?=> [true, true, false]

Open classes

Page 16: 7li7w devcon5

module Debug def info "#{self.class}[#{object_id}]: #{to_s}" endend

class Object include Debugend

>> 2.info=> "Fixnum[5]: 2"

>> "foo".info=> "String[70107061928320]: foo"

Modules & mixins

Page 17: 7li7w devcon5

class MyCollection include Enumerable def each ... endend

>> MyCollection.instance_methods.sort=> [:all?, :any?, :chunk, :collect, :collect_concat,:count, :cycle, :detect, :drop, :drop_while, :each, :each_cons, :each_entry, :each_slice, :each_with_index, :each_with_object, :entries, :find, :find_all, :find_index, :first, :flat_map, :grep, :group_by, :include?, :inject, :map, :max, :max_by, :member?, :min, :min_by, :minmax, :minmax_by, :none?, :one?, :partition, :reduce, :reject, :reverse_each, :select, :slice_before, :sort, :sort_by, :take, :take_while, :to_a, :zip]

Collections & Enumerable

Page 18: 7li7w devcon5

class MyStruct def initialize values @values = values end

def method_missing name, *args @values[name] endend

>> struct = MyStruct.new foo: 123, bar: 456=> #<MyStruct:0x007fc2c21433b8 @values={:foo=>123, :bar=>456}>

>> struct.foo=> 123

>> struct.bar=> 456

method_missing magic

Page 19: 7li7w devcon5

class MyStruct def initialize values @values = values end

def method_missing name, *args puts "Defining method #{name}" self.class.class_eval do define_method(name) { @values[name] } end send(name, *args) endend

>> struct.fooDefining method foo=> 123

>> struct.foo=> 123

Dynamic definition

Page 20: 7li7w devcon5

Power and flexibilityDeveloper productivity and funRaw execution speedLimited concurrency supportType-aware tool support

Pros

Cons

Page 21: 7li7w devcon5

RubyIoPrologScalaErlangClojureHaskell

Page 22: 7li7w devcon5

Io is a rule bender. He’s young, wicked smart, and easy to understand but hard to predict. He might give you the ride of your life, wreck your dad’s car, or both.

Page 23: 7li7w devcon5

Io> "oI olleH" reverse==> Hello Io

Io> list("iH", "oI") map(reverse)==> list(Hi, Io)

Io> list(1, 2, 3) map(** 2) sum==> 14

Message passing

Page 24: 7li7w devcon5

Io> Person := Object clone==> Person_0x7f922c06ad00: type = "Person"

Io> Person firstName := "John"==> JohnIo> Person lastName := "Doe"==> DoeIo> Person firstName==> John

Objects & Slots

Page 25: 7li7w devcon5

Io> Person name := method ( firstName .. " " .. lastName)

Io> Person name==> John Doe

Defining methods

Page 26: 7li7w devcon5

Io> Arthur := Person clone==> Arthur_0x7fd5406cd860: type = "Arthur"

Io> Arthur name==> John Doe

Io> Arthur firstName = "Arthur"Io> Arthur lastName = "Dent"Io> Arthur name==> Arthur Dent

Io> Arthur proto==> Person_0x7fd540693ed0: firstName = "John" lastName = "Doe" name = method(...) type = "Person"

Prototypal inheritance

Page 27: 7li7w devcon5

Io> for(i, 1, 3, i println)123==> 3

Io> if(true, "Yes" println, "No" println)Yes==> Yes

Control structures

Page 28: 7li7w devcon5

Io> foo := method( call sender println call message arguments println)

Io> foo("bar", 42) Object_0x7fcf78418920: Lobby = Object_0x7fcf78418920 Protos = Object_0x7fcf78417c00 ...

list("bar", 42)

Reflection

Page 29: 7li7w devcon5

Io> Ping := Object cloneIo> Pong := Object clone

Io> Ping ping := method ( 2 repeat("Ping!" println; yield))

Io> Pong pong := method ( 2 repeat(yield; "Pong!" println))

Io> Ping @@ping; Pong @@pongIo> Coroutine currentCoroutine pausePing!Pong!Ping!Pong!

Coroutines

Page 30: 7li7w devcon5

Io> Slow := Object cloneIo> Fast := Object clone

Io> Slow go := method( wait(1) "Slow" println)

Io> Fast go := method( "Fast" println)

Io> Slow @@go; Fast @@go; wait(2)FastSlow

Actors

Page 31: 7li7w devcon5

Io> page := URL with( "http://google.co.uk/") @fetch

Io> "I'm in the foreground" printlnI'm in the foreground

Io> page size println16906

Futures

Page 32: 7li7w devcon5

Tiny – ideal for embedded systemsPrototypes and duck typing are very flexible

Concurrency supportSimple, consistent syntaxRaw execution speedSmall user community

Pros

Cons

Page 33: 7li7w devcon5

RubyIoPrologScalaErlangClojureHaskell

Page 34: 7li7w devcon5

Sometimes spectacularly smart, other times just as frustrating. You’ll get astounding answers only if you know how to ask the question.

Page 35: 7li7w devcon5

likes(wallace, cheese).likes(gromit, cheese).likes(wendolene, sheep).

?- likes(wallace, sheep).false.?- likes(gromit, cheese).true.?- likes(Who, cheese).Who = wallace ;Who = grommit.

Simple facts

Page 36: 7li7w devcon5

friend(X, Y) :- \+(X = Y), likes(X, Z), likes(Y, Z).

?- friend(wallace, wallace).false.?- friend(wendolene, gromit).false.?- friend(wallace, gromit).true.

Evaluating rules

Page 37: 7li7w devcon5

father(grandpa, homer).father(homer, bart).

ancestor(X, Y) :- father(X, Y).ancestor(X, Y) :- father(X, Z), ancestor(Z, Y).

?- ancestor(Who, bart).Who = homer ;Who = grandpa ;false.

Recursive rules

Page 38: 7li7w devcon5

?- (X, Y, Z) = (1, 2, "foo").X = 1,Y = 2,Z = [102, 111, 111].

?- (X, _, Z) = (1, 2, "foo").X = 1,Z = [102, 111, 111].

Tuples

Page 39: 7li7w devcon5

sum(0, []).sum(Total, [Head|Tail]) :- sum(Sum, Tail), Total is Head + Sum.

?- sum(What, [1, 2, 3]).What = 6.

Calculation with lists

Page 40: 7li7w devcon5

?- sudoku([_, _, 2, 3, _, _, _, _, _, _, _, _, 3, 4, _, _], Solution).Solution = [4,1,2,3,2,3,4,1,1,2,3,4,3,4,1,2].

Solving (4×4) sudoku

Page 41: 7li7w devcon5

sudoku(Puzzle, Solution) :- Solution = Puzzle, Puzzle = [S11, S12, S13, S14, S21, S22, S23, S24, S31, S32, S33, S34, S41, S42, S43, S44], Solution ins 1..4, Row1 = [S11, S12, S13, S14], Row2 = [S21, S22, S23, S24], Row3 = [S31, S32, S33, S34], Row4 = [S41, S42, S43, S44], Col1 = [S11, S21, S31, S41], Col2 = [S12, S22, S32, S42], Col3 = [S13, S23, S33, S43], Col4 = [S14, S24, S34, S44], Square1 = [S11, S12, S21, S22], Square2 = [S13, S14, S23, S24], Square3 = [S31, S32, S41, S42], Square4 = [S33, S34, S43, S44], valid([Row1, Row2, Row3, Row4, Col1, Col2, Col3, Col4, Square1, Square2, Square3, Square4]).

valid([]).valid([Head|Tail]) :- all_different(Head), valid(Tail).

Solving (4×4) sudoku

Page 42: 7li7w devcon5

Solving logical and scheduling problemsNatural language processingArtificial intelligenceScaling requires deep understandingNot a general-purpose languageSimple procedural tasks are difficult

Pros

Cons

Page 43: 7li7w devcon5

RubyIoPrologScalaErlangClojureHaskell

Page 44: 7li7w devcon5

He was often awkward, was sometimes amazing, but always had a unique expression. Sometimes, his scissors let him do incredible things. Other times, he was awkward and humiliated.

Page 45: 7li7w devcon5

scala> "foo"res0: java.lang.String = foo

scala> 123res1: Int = 123

scala> 45.6res2: Double = 45.6

scala> 1 + 2.3res3: Double = 3.3

scala> "The answer is " + 42res4: java.lang.String = The answer is 42

Type inference & coercion

Page 46: 7li7w devcon5

scala> var a = 42a: Int = 42

scala> a = a + 1a: Int = 43

scala> val earth = "Harmless"earth: java.lang.String = Harmless

scala> earth = "Mostly Harmless"<console>:8: error: reassignment to val earth = "Mostly Harmless" ^

var & val

Page 47: 7li7w devcon5

scala> val range = 0 to 3range: scala.collection.immutable.Range.Inclusive = Range(0, 1, 2, 3)

scala> val range = 0 to 5 by 2range: scala.collection.immutable.Range = Range(0, 2, 4)

scala> val tuple = ("Kerry", 42)tuple: (java.lang.String, Int) = (Kerry,42)

scala> val (name, age) = tuplename: java.lang.String = Kerryage: Int = 42

Ranges & tuples

Page 48: 7li7w devcon5

scala> val list = List(1, 2, 3)list: List[Int] = List(1, 2, 3)

scala> list(1)res0: Int = 2

scala> "zero"::listres1: List[Any] = List(zero, 1, 2, 3)

scala> Set(1, 2, 3) ++ Set(2, 3, 4)res2: scala.collection.immutable.Set[Int] = Set(1, 2, 3, 4)

scala> val map = Map(1 -> "One", 2 -> "Two")map: scala.collection.immutable.Map[Int,java.lang.String] = Map(1 -> One, 2 -> Two)

scala> map(1)res3: java.lang.String = One

Lists, sets & maps

Page 49: 7li7w devcon5

class Person(firstName: String, lastName: String) { def greet(name: String) { println("Hello " + name + ", I'm " + firstName + ".") }}

scala> val kerry = new Person("Kerry", "Buckley")kerry: Person = Person@276bab54

scala> kerry.greet("DevCon")Hello DevCon, I'm Kerry.

Defining classes

Page 50: 7li7w devcon5

class Person(firstName: String, lastName: String) { ...}

object Person { def find(id: Int) { val (first, last) = DB.people.find(id) new Person(first, last }}

Companion objects

Page 51: 7li7w devcon5

class Person(val name:String)

trait Nice { def greet() = println("Howdily doodily.")}

class Character(override val name:String) extends Person(name) with Nice

scala> val flanders = new Character("Ned")scala> flanders.greetHowdily doodily.

Extending & traits

Page 52: 7li7w devcon5

scala> val jedi = List("Yoda", "Obiwan", "Luke")jedi: List[java.lang.String] = List(Yoda, Obiwan, Luke)

scala> jedi.filter(name => name.size < 5)res0: List[java.lang.String] = List(Yoda, Luke)

scala> jedi.map(name => name.size)res1: List[Int] = List(4, 6, 4)

scala> val numbers = List(1, 2, 3)numbers: List[Int] = List(1, 2, 3)

scala> numbers.foldLeft(0)((a, n) => a + n)res2: Int = 6

List processing

Page 53: 7li7w devcon5

Class hierarchyAny

NothingNull

……

AnyVal

Int

List

AnyRef

ScalaObject

Map

Float

Page 54: 7li7w devcon5

First-class XMLscala> val pets = <pets> <chicken>Babs</chicken> <chicken>Bunty</chicken> <chicken>Lily</chicken> <cat>Pebbles</cat> <chicken>Pepper</chicken> <cat>Twiglet</cat> <cat>Willow</cat> <cat>Zorro</cat></pets>

scala> pets \\ "cat"res0: scala.xml.NodeSeq = NodeSeq(<cat>Twiglet</cat>, <cat>Pebbles</cat>, <cat>Willow</cat>, <cat>Zorro</cat>)

Page 55: 7li7w devcon5

scala> (pets \ "_").foreach {pet => pet match { case <cat>{name}</cat> => println(name + " says 'meow'.") case <chicken>{name}</chicken> = println(name + " says 'cluck'.") }}

Babs says 'cluck'.Bunty says 'cluck'.Lily says 'cluck'.Pebbles says 'meow'.Pepper says 'cluck'.Twiglet says 'meow'.Willow says 'meow'.Zorro says 'meow'.

Pattern matching

Page 56: 7li7w devcon5

case object Strokecase object Feed

class Cat() extends Actor { def act() { loop { react { case Stroke => { println("Purr!") } case Feed => { println("Om nom nom") } } } }}

scala> val cat = new Cat().startscala> cat ! Stroke; cat ! Feed; println("Done.")Done.Purr!Om nom nom

Concurrency with actors

Page 57: 7li7w devcon5

A modern version of JavaMixins, pattern matching, blocks, XMLConcurrency with actors & immutability

Static typingCompromises with mutable state

Pros

Cons

Page 58: 7li7w devcon5

RubyIoPrologScalaErlangClojureHaskell

Page 59: 7li7w devcon5

Agent Smith was an artificial intelligence program in the matrix that had an amazing ability to take any form and bend the rules of reality to be in many places at once. He was unavoidable.

Page 60: 7li7w devcon5

1> 2 + 2.4

2> "Hello"."Hello"

3> atom.atom

4> {foo, 123, "bar"}.{foo,123,"bar"}

5> [1, "one", two].[1,"one", two]

6> [87, 84, 70, 63]."WTF?"

The usual types (mostly)

Page 61: 7li7w devcon5

1> Foo = 42.42

2> Foo = Foo + 1.** exception error: no match of right hand side value 43

3> Values = [1, 2, 3].[1,2,3]

4> lists:append(Values, [4]).[1,2,3,4]

5> Values.[1,2,3]

Variables don’t change

Page 62: 7li7w devcon5

1> Pet = {{name, "Zorro"}, {type, "Cat"}}. {{name,"Zorro"},{type,"Cat"}}

2> {{name, Name}, {type, Type}} = Pet.{{name,"Zorro"},{type,"Cat"}}

3> Name."Zorro"

4> Type."Cat"

5> [Head|Tail] = [foo, bar, baz].[foo,bar,baz]

6> {Head, Tail}.{foo,[bar,baz]}

Pattern matching

Page 63: 7li7w devcon5

1> [A, B, C, D] = [1, 0, 50, 200].[1,0,50,200]

2> Packed = <<A:1, B:1, C:6, D:8>>.<<"²È">>

3> <<P:1, Q:1, R:6, S:8>> = Packed.<<"²È">>

4> {P, Q, R, S}.{1,0,50,200}

Bit matching

Page 64: 7li7w devcon5

-module(demo).-export([echo/1]).echo(Value) -> Value.

1> c(demo).{ok,demo}

5> demo:echo("Hello")."Hello"

6> demo:echo(42).42

Basic functions

Page 65: 7li7w devcon5

-module(fact).-export([fact/1]).

fact(0) -> 1;fact(N) -> N * fact(N-1).

1> c(fact).{ok,fact}

3> fact:fact(6).720

4> fact:fact("foo").** exception error: bad argument in an arithmetic expression in function fact:fact/1 (fact.erl, line 5)

6> fact:fact(10000).

Patterns in functions

Page 66: 7li7w devcon5

28462596809170545189064132121198688901480514017027992307941799942744113400037644437729907867577847758158840621423175288300423399401535187390524211613827161748198241998275924182892597878981242531205946599625986706560161572036032397926328736717055741975962099479720346153698119897092611277500484198845410475544642442136573303076703628825803548967461117097369578603670191071512730587281041158640561281165385325968425825995584688146430425589836649317059251717204276597407446133400054194052462303436869154059404066227828248371512038322178644627183822923899638992827221879702459387693803094627332292570555459690027875282242544348021127559019169425429028916907219097083690539873747452483372899521802363282741217040268086769210451555840567172555372015852132829034279989818449313610640381489304499621599999359670892980190336998484404665419236258424947163178961192041233108268651071354516845540936033009607210346944377982349430780626069422302681885227592057029230843126188497606560742586279448827155956831533440534425446648416894580425709461673613187605234982286326452921529423479870603344290737158688499178932580691483168854251956006172372636323974420786924642956012306288720122652952964091508301336630982733806353972901506581822574295475894399765113865541208125788683704239208764484761569001264889271590706306409661628038784044485191643790807186112370622133415415065991843875961023926713276546986163657706626438638029848051952769536195259240930908614471907390768585755934786981720734372093104825475628567777694081564074962275254993384112809289637516990219870492405617531786346939798024619737079041868329931016554150742308393176878366923

Patterns in functions

Page 67: 7li7w devcon5

28462596809170545189064132121198688901480514017027992307941799942744113400037644437729907867577847758158840621423175288300423399401535187390524211613827161748198241998275924182892597878981242531205946599625986706560161572036032397926328736717055741975962099479720346153698119897092611277500484198845410475544642442136573303076703628825803548967461117097369578603670191071512730587281041158640561281165385325968425825995584688146430425589836649317059251717204276597407446133400054194052462303436869154059404066227828248371512038322178644627183822923899638992827221879702459387693803094627332292570555459690027875282242544348021127559019169425429028916907219097083690539873747452483372899521802363282741217040268086769210451555840567172555372015852132829034279989818449313610640381489304499621599999359670892980190336998484404665419236258424947163178961192041233108268651071354516845540936033009607210346944377982349430780626069422302681885227592057029230843126188497606560742586279448827155956831533440534425446648416894580425709461673613187605234982286326452921529423479870603344290737158688499178932580691483168854251956006172372636323974420786924642956012306288720122652952964091508301336630982733806353972901506581822574295475894399765113865541208125788683704239208764484761569001264889271590706306409661628038784044485191643790807186112370622133415415065991843875961023926713276546986163657706626438638029848051952769536195259240930908614471907390768585755934786981720734372093104825475628567777694081564074962275254993384112809289637516990219870492405617531786346939798024619737079041868329931016554150742308393176878366923694849025999607729684293977427536263119825416681531891763234839190821000147178932184227805135181734921901146246875769835373441456013122615221391178759688367364087207937002992038279198038702372078039140312368997608152840306051116709484722224870389199993442071395836983063962232079115624044250808919914319837120445598344047556759489212101498152454543594285414390843564419984224855478532163624030098442855331829253154206551237079705816393460296247697010388742206441536626733715428700789122749340684336442889847100840641600093623935261248037975293343928764398316390312776450722479267851700826669598389526150759007349215197592659192708873202594066382118801988854748266048342256457705743973122259700671936061763513579529821794290797705327283267501488024443528681645026165662837546519006171873442260438919298506071515390031106684727360135816706437861756757439184376479658136100599638689552334648781746143243573224864326798481981458432703035895508420534788493364582482592033288089025782388233265770205248970937047210214248413342465268206806732314214483854074182139621846870108359582946965235632764870475718351616879235068366271743711915723361143070121120767608697851559721846485985918643641716850899625516820910793570231118518174775010804622585521314764897490660752877082897667514951009682329689732000622392888056658036140311285465929084078033974900664953205873164948093883816198658850827382468034897864757116679890423568018303504133875731972630897909435710687797301633918087868474943633533893373586906405848417828065196275826434429258058422212947649402948622670761832988229004072390403733168207417413251656688443079339447019208905620788387585342512820957359307018197708340163817638278562539516825426644614941044711579533262372815468794080423718587423026200264221822694188626212107297776657401018376182280136857586442185863011539843712299107010094061929413223202773193959467006713695377097897778118288242442920864816134179562017471831609687661043140497958198236445807368209404022211181530051433387076607063149616107771117448059552764348333385744040212757031851527298377435921878558552795591028664457917362007221858143309977294778923720717942857756271300923982397921957581197264742642878266682353915687857271620146192244266266708400765665625807109474398740110772811669918806268726626565583345665007890309050656074633078027158530817691223772813510584527326591626219647620571434880215630815259005343721141000303039242866457207328473481712034168186328968865048287367933398443971236735084527340196309427697652684170174990756947982757825835229994315633322107439131550124459005324702680312912392297979030417587823398622373535054642646913502503951009239286585108682088070662734733200354995720397086488066040929854607006339409885836349865466136727880748764700702458790118046518296111277090609016152022111461543158317669957060974618085359390400067892878548827850938637353703904049412684618991272871562655001270833039950257879931705431882752659225814948950746639976007316927310831735883056612614782997663188070063044632429112260691931278881566221591523270457695867512821990938942686601963904489718918597472925310322480210543841044325828472830584297804162405108110326914001900568784396341502696521048920272140232160234898588827371428695339681755106287470907473718188014223487248498558198439094651708364368994306189650243288353279667190184527620551085707626204244509623323204744707831190434499351442625501701771017379551124746159471731862701565571266295855125077711738338208419705893367323724453280456537178514960308802580284067847809414641838659226652806867978843250660537943046250287105104929347267471267499892634627358167146935060495110340755404658170393481046758485625967767959768299409334026387269378365320912287718077451152622642548771835461108886360843272806227776643097283879056728618036048633464893371439415250259459652501520959536157977135595794965729775650902694428088479761276664847003619648906043761934694270444070215317943583831051404915462608728486678750541674146731648999356381312866931427616863537305634586626957894568275065810235950814888778955073939365341937365700848318504475682215444067599203138077073539978036339267334549549296668759922530893898086430606532961793164029612492673080638031873912596151131890359351266480818568366770286537742390746582390910955517179770580797789289752490230737801753142680363914244720257728891784950078117889336629750436804214668197824272980697579391742229456683185815676816288797870624531246651727622758295493421483658868919299587402095696000243560305289829866386892076992834030549710266514322306125231915131843876903823706205399206933943716880466429711476743564486375026847698148853105354063328845062012173302630676481322931561043551941761050712449024873277273112091945865137493190965162497691657553812198566432207978666300398938660238607357858114394715872800893374165033792965832618436073133327526023605115524227228447251463863269369763762510196714380125691227784428426999440829152215904694437282498658085205186576292992775508833128672638418713277780874446643875352644733562441139447628780974650683952982108174967958836452273344694873793471790710064978236466016680572034297929207446822322848665839522211446859572858403863377278030227591530497865873919513650246274195899088374387331594287372029770620207120213038572175933211162413330422773742416353553587977065309647685886077301432778290328894795818404378858567772932094476778669357537460048142376741194182671636870481056911156215614357516290527351224350080604653668917458196549482608612260750293062761478813268955280736149022525819682815051033318132129659664958159030421238775645990973296728066683849166257949747922905361845563741034791430771561168650484292490281102992529678735298767829269040788778480262479222750735948405817439086251877946890045942060168605142772244486272469911146200149880662723538837809380628544384763053235070132028029488392008132135446450056134987017834271106158177289819290656498688081045562233703067254251277277330283498433595772575956224703707793387146593033

Patterns in functions

Page 68: 7li7w devcon5

28462596809170545189064132121198688901480514017027992307941799942744113400037644437729907867577847758158840621423175288300423399401535187390524211613827161748198241998275924182892597878981242531205946599625986706560161572036032397926328736717055741975962099479720346153698119897092611277500484198845410475544642442136573303076703628825803548967461117097369578603670191071512730587281041158640561281165385325968425825995584688146430425589836649317059251717204276597407446133400054194052462303436869154059404066227828248371512038322178644627183822923899638992827221879702459387693803094627332292570555459690027875282242544348021127559019169425429028916907219097083690539873747452483372899521802363282741217040268086769210451555840567172555372015852132829034279989818449313610640381489304499621599999359670892980190336998484404665419236258424947163178961192041233108268651071354516845540936033009607210346944377982349430780626069422302681885227592057029230843126188497606560742586279448827155956831533440534425446648416894580425709461673613187605234982286326452921529423479870603344290737158688499178932580691483168854251956006172372636323974420786924642956012306288720122652952964091508301336630982733806353972901506581822574295475894399765113865541208125788683704239208764484761569001264889271590706306409661628038784044485191643790807186112370622133415415065991843875961023926713276546986163657706626438638029848051952769536195259240930908614471907390768585755934786981720734372093104825475628567777694081564074962275254993384112809289637516990219870492405617531786346939798024619737079041868329931016554150742308393176878366923694849025999607729684293977427536263119825416681531891763234839190821000147178932184227805135181734921901146246875769835373441456013122615221391178759688367364087207937002992038279198038702372078039140312368997608152840306051116709484722224870389199993442071395836983063962232079115624044250808919914319837120445598344047556759489212101498152454543594285414390843564419984224855478532163624030098442855331829253154206551237079705816393460296247697010388742206441536626733715428700789122749340684336442889847100840641600093623935261248037975293343928764398316390312776450722479267851700826669598389526150759007349215197592659192708873202594066382118801988854748266048342256457705743973122259700671936061763513579529821794290797705327283267501488024443528681645026165662837546519006171873442260438919298506071515390031106684727360135816706437861756757439184376479658136100599638689552334648781746143243573224864326798481981458432703035895508420534788493364582482592033288089025782388233265770205248970937047210214248413342465268206806732314214483854074182139621846870108359582946965235632764870475718351616879235068366271743711915723361143070121120767608697851559721846485985918643641716850899625516820910793570231118518174775010804622585521314764897490660752877082897667514951009682329689732000622392888056658036140311285465929084078033974900664953205873164948093883816198658850827382468034897864757116679890423568018303504133875731972630897909435710687797301633918087868474943633533893373586906405848417828065196275826434429258058422212947649402948622670761832988229004072390403733168207417413251656688443079339447019208905620788387585342512820957359307018197708340163817638278562539516825426644614941044711579533262372815468794080423718587423026200264221822694188626212107297776657401018376182280136857586442185863011539843712299107010094061929413223202773193959467006713695377097897778118288242442920864816134179562017471831609687661043140497958198236445807368209404022211181530051433387076607063149616107771117448059552764348333385744040212757031851527298377435921878558552795591028664457917362007221858143309977294778923720717942857756271300923982397921957581197264742642878266682353915687857271620146192244266266708400765665625807109474398740110772811669918806268726626565583345665007890309050656074633078027158530817691223772813510584527326591626219647620571434880215630815259005343721141000303039242866457207328473481712034168186328968865048287367933398443971236735084527340196309427697652684170174990756947982757825835229994315633322107439131550124459005324702680312912392297979030417587823398622373535054642646913502503951009239286585108682088070662734733200354995720397086488066040929854607006339409885836349865466136727880748764700702458790118046518296111277090609016152022111461543158317669957060974618085359390400067892878548827850938637353703904049412684618991272871562655001270833039950257879931705431882752659225814948950746639976007316927310831735883056612614782997663188070063044632429112260691931278881566221591523270457695867512821990938942686601963904489718918597472925310322480210543841044325828472830584297804162405108110326914001900568784396341502696521048920272140232160234898588827371428695339681755106287470907473718188014223487248498558198439094651708364368994306189650243288353279667190184527620551085707626204244509623323204744707831190434499351442625501701771017379551124746159471731862701565571266295855125077711738338208419705893367323724453280456537178514960308802580284067847809414641838659226652806867978843250660537943046250287105104929347267471267499892634627358167146935060495110340755404658170393481046758485625967767959768299409334026387269378365320912287718077451152622642548771835461108886360843272806227776643097283879056728618036048633464893371439415250259459652501520959536157977135595794965729775650902694428088479761276664847003619648906043761934694270444070215317943583831051404915462608728486678750541674146731648999356381312866931427616863537305634586626957894568275065810235950814888778955073939365341937365700848318504475682215444067599203138077073539978036339267334549549296668759922530893898086430606532961793164029612492673080638031873912596151131890359351266480818568366770286537742390746582390910955517179770580797789289752490230737801753142680363914244720257728891784950078117889336629750436804214668197824272980697579391742229456683185815676816288797870624531246651727622758295493421483658868919299587402095696000243560305289829866386892076992834030549710266514322306125231915131843876903823706205399206933943716880466429711476743564486375026847698148853105354063328845062012173302630676481322931561043551941761050712449024873277273112091945865137493190965162497691657553812198566432207978666300398938660238607357858114394715872800893374165033792965832618436073133327526023605115524227228447251463863269369763762510196714380125691227784428426999440829152215904694437282498658085205186576292992775508833128672638418713277780874446643875352644733562441139447628780974650683952982108174967958836452273344694873793471790710064978236466016680572034297929207446822322848665839522211446859572858403863377278030227591530497865873919513650246274195899088374387331594287372029770620207120213038572175933211162413330422773742416353553587977065309647685886077301432778290328894795818404378858567772932094476778669357537460048142376741194182671636870481056911156215614357516290527351224350080604653668917458196549482608612260750293062761478813268955280736149022525819682815051033318132129659664958159030421238775645990973296728066683849166257949747922905361845563741034791430771561168650484292490281102992529678735298767829269040788778480262479222750735948405817439086251877946890045942060168605142772244486272469911146200149880662723538837809380628544384763053235070132028029488392008132135446450056134987017834271106158177289819290656498688081045562233703067254251277277330283498433595772575956224703707793387146593033088629699440318332665797514676502717346298883777397848218700718026741265997158728035440478432478674907127921672898523588486943546692255101337606377915164597254257116968477339951158998349081888281263984400505546210066988792614558214565319696909827253934515760408613476258778165867294410775358824162315779082538054746933540582469717674324523451498483027170396543887737637358191736582454273347490424262946011299881916563713847111849156915054768140411749801454265712394204425441028075806001388198650613759288539038922644322947990286482840099598675963580999112695367601527173086852756572147583507122298296529564917835071750835741362282545055620270969417476799259229774888627411314587676147531456895328093117052696486410187407673296986649236437382565475022816471926815559883196629848307776666840622314315884384910519058281816740764463033300119710293036455866594651869074475250837841987622990415911793682799760654186088721626654886492344391030923256910633775969739051781122764668486791736049404393703339351900609387268397299246478483727274770977466693599784857120156789000241947269220974984127323147401549980920381459821416481176357147801554231599667838534854486406936410556913531335231184053581348940938191821898694825383960989942822027599339635206217705343572073396250574216769465101608495601439303244304271576099527308684609204422226103154229984444802110098161333824827375218998738205315164927134498105950159974800571591912202154487748750103473246190633941303030892399411985006225902184164409988173214324422108554248620896250260604398180189026317781146617454999771440665232863846363847001655618153861098188111181734191305505024860345856755585637511729774299329074944236579668332700918367338977347901759248885660379952771540569083017311723894140326159612292912225191095948743805673381278538616491842786938417556898047100859868372033615175158097022566275200160956192229925401759878522038545913771783976389811198485803291048751666921195104514896677761598249468727420663437593207852618922687285527671324883267794152912839165407968344190239094803676688707838011367042753971396201424784935196735301444404037823526674437556740883025225745273806209980451233188102729012042997989005423126217968135237758041162511459175993279134176507292826762236897291960528289675223521425234217247841869317397460411877634604625637135309801590617736758715336803958559054827361876112151384673432884325090045645358186681905108731791346215730339540580987172013844377099279532797675531099381365840403556795731894141976511436325526270639743146526348120032720096755667701926242585057770617893798231096986788448546659527327061670308918277206432551919393673591346037757083193180845929565158875244597601729455720505595085929175506510115665075521635142318153548176884196032085050871496270494017684183980582594038182593986461260275954247433376226256287153916069025098985070798660621732200163593938611475394561406635675718526617031471453516753007499213865207768523824884600623735896608054951652406480547295869918694358811197833680141488078321213457152360124065922208508912956907835370576734671667863780908811283450395784812212101117250718383359083886187574661201317298217131072944737656265172310694884425498369514147383892477742320940207831200807235326288053906266018186050424938788677872495503255424284226596271050692646071767467502337805671893450110737377034119346113374033865364675136733661394731550211457104671161445253324850197901083431641989998414045044901130163759520675715567509485243580269104077637210998671624254795385312852889930956570729218673523216666097874989635362610529821472569482799996220825775840988458484250391189447608729685184983976367918242266571167166580157914500811657192200233759765317495922397884982814705506190689275625210462185661305800255607974609726715033327032310025274640428755556546883765838802543227403507431684278620637697054791726484378174446361520570933228587284315690756255569305558818822603590006739339952504379887470935079276181116276309771257983975996526612120317495882059435754883862282508401408885720583992400971219212548074097752974278775912566026443482713647231849125180866278708626116699989634812405803684794587364820124653663228889011636572270887757736152003450102268890189101673572058661410011723664762657835396364297819011647056170279631922332294228739309233330748258937626198997596530084135383241125899639629445129082802023225498936627506499530838925632246794695960669046906686292645006219740121782899872979704859021775060092893328957272392019589994471945147360850770400725717439318148461909406269545285030526341000565022226152309364882887122046454267700577148994335147162504252365173710266068647253458120186683273953682547456536553597546685788700056988360286686450740256993087483441094086086303707908295240576731684941855810482475304758923392801571302824106234999945932390521409856559565661346003396150515164758852742214732517999548977992849522746029855666700811871200856155016457400484170210303038996339253337466556817824410737409336919294104632307731994759826307383499600770372410446285414648704116273895649834555162165685114551383822047005483996671706246467566101291382048909121117229386244253158913066987462045587244806052829378148302622164542280421757760762365459828223070815503469404938317755053305094698999476119419231280721807216964378433313606760676965187138394338772485493689061845700572043696666465080734495814495966306246698679832872586300064215220210171813917325275173672262621454945468506006334692713838311715849753092643252486960220059099802663765386225463265168414963306369548086551101256757717890616694758344043486218485369591602172030456183497524162039926441331651884768606830642004858557924473340290142588876403712518642229016333691585063273727199596362912783344786218887871009533753551054688980236378263714926913289564339440899470121452134572117715657591451734895195016800621353927175419843876163543479806920886666227099512371706241924914282576453125769939735341673046864585181979668232015693792684926999983992413571941496882273704022820805171808003400480615261792013978945186295290558440703738300533552421153903385185829366779190610116306233673144419202893857201855569596330833615450290424822309297087124788002017383072060482680156675397593789931793515799958929562156307338416294599900276730832827716595064217966523190439250543226753731811755315476780739470338931185107297724318378972674957455778183345495942317353558291046967315391275975687281861691161083156337232639968881490543943261197182274996791176628553401860198315809629981791107208804992292016062059067271273599461871634945774995805337947187105456452579396024210259136415528398395201773012712514892051061708228008339985665786646920737114269682301770416324829479409558694699089379165191006305185352102345189798127619143061864362703081977124992751056732909481202057747100687703379708934229207183903744167503493818836342229284946790660285674293251642569044363473087656797056595677285291081242733154406580199802711579126254172797452862574865921933293805915239524735518887119860391319654287576290190503964083560246277534314409155642181729459941596061979622633242715863425977947348682074802021538734729707999753332987785531053820162169791880380753006334350766147737135939362651905222242528141084747045295688647757913502160922040348449149950778743107189655725492651282693489515795075486172341394610365176616750329948642244039659511882264981315925080185126386635308622223491094629059317829408195640484702456538305432056506924422671863255307640761872086780391711356363501269525091291020496042823232628996502758951052844368177415730941874894428065427561430975828127698124936993313028946670560414084308942231140912722238148470364341019630413630736771060038159590829746410114421358321042574358350220737173219745089035573187350445827238770728271406162997919629357224104477155051652535867544109395079218369015261138440382680054150924346511711436477899444553993653667727589565713987505542990824585609510036934663100673714708029927656933435500927189854050109917474979991554392031908961967615444686048175400695689471463928245383807010444181045506171305160584355817521032338465829201071030061124283407458607006060194830551364867021020364708470807422704371893706965688795617928713045224516842027402021966415605280335061293558739079393524404092584248380607177444609964035221891022961909032569042381374492494906892314330884224399631396391545854065286326468807581148748371408284176455226386313520264894016262494802388568231599102952620337126449279901938211134518446387544516391239377974190576649911764237637722282802318465738050121277809680315691477264910257503508758792248110223544524410872448565700755187132146592093548504552829170749596775404450779494836371756062326925757412813110241910373338080434325310884694831555729402265394972913817581338619457057799561808755951413644907613109617155928376585840036489374076822257523935988731081689667688287403837192827690431514106997678303819085690713091931340846019511147482766350724676534922040058626677632935516631939622498979912708004465982264899125226813124300528104995058595676527123591494442612554437618645029202881358582871789577224116380815161831603129728796987480139828621645629196153096358337313619724773332353025466571196902611237380629030242904275794549030022660847446513161741691916851746464945459696005330885252792083472495235473110674109099223541055506299687642153951249355986311346661725116890785633328935569150449485189113488301876365100638502565916433021928565596263914382895068324838727165616560111531517055222955765944972454788815532316417453267167978861141165355597588331979638070962998880767303616940317736448140427867784251232449974693421348217179595190698204602997172001174857303889719205597414742453011135869766256607770970225633261701108463784795555258504578058879440756064974127974530918418405207558526462208821483646754652237609210787539190454684852349759986044943322828073120679922402477507514105890774627334319091255451352225329275913842047384603056163154236552935312278389759446515787337343463172280001031380425481404022090580405056003860937403435068863081434683848900708938565050027569059678069404698435184535134141031615133683043714786642925389717165978629010728400758939700388317742648163725113277369926827709465342583596111881955092462062153978121197244762623771534452048069819082524943963962251113831177428978535825590832490480497516047104257569753442551515779815600370847230603484753977513688390404316017486248871339311818523029425425676202485688393970836748788453789172574145155917919035398535077200900594979352939459631213445503368260690059828717723533375221941915547303742062343262892968397015058892191112049249864792053410872349115430987182160055762209075732304626106597744947658346313025598636315029959672352476943975462530206788193304372284800209305354155640664838569378144603138697563459200233462606995955513484754147891180830329816421587452922952678937925647752029052675349356673744293182673374571642465407748267901046778759085408130531447176455869894169668940436489952465247443988349583871206296485413357553813419500498743813369062703973874586604296871595820715766599826607317005624465541763024501349159567288942619746144496908671655859782729228702723774835097362901019130417812735773037781804081589136005207315806941034305003184349342360269244733060013861119781774472669608928321052543116496033420102032603863672532889648333405862204843616575362001468405476649666473566979572953394809138263703324220930839366954980688240491622063147911494642042500022450413425558561937442905257252436320054487441524307305215070491020434076572476865095751174125413729531644521765577235348601821566833352520532830000108344008762266843817023235605645158256954177359197813649975559601912567744942717986360045847405209290089397315276024304951653864431388147876977541478757432610159879709758855625806766197973098472460769484821127948427976536607055051639104415022554420329721292033009353356687294595912327965886376486894188433640548494009574965791657687213927330153555097865114767947399690623184878377515462613823651665956337209345708208301840482797005728071432925727577436229587047361641609731817241594204270366066404089740245521530725227388637241859646455223673260411164598464020010216920823315155388821071527191267876531795071908204525100447821291318544054814494151867114207103693891129125012750853466337717749376016543454696390042711129829255096830420665725364279472200020835313883708781649957189717629338794854271276882652003766325924561614868744897471519366219275665852462114457407010675380427564184440834805203838265052601698584060084788422421887856927897751810442805474427229455167420335686460609977973124950433321425205053675790499520783597650415379001132579536040655172654879022173595444151139429231648950663177813039057462082449171921311864129633704661406456900178942356738775523130952785912774533241855442484484493664210731348819180640189222317302156645813473186449997905781662091469870718039388885781280740226363602294114354869871402143572055947730892808653678920201935102605361567924483276749476117858316071865710310842200560259545115191391309119544447844361032741876102338843391687589233423790859841968266525610628751237572318491474951945985728897934981791761822652480408237128109790772638864286067917082288575852703470839714561619926247844794692794996845945632382702297364173503430783194115698247820013290851202878474805860188960045901745974055630732714487679085288867978809970695240681006625611440014983413580889737246844064948857074167687916413224205373654067330186392497910915474785959163865597507090581175924899502214799250945635582514315814464060134283490422798357939659258985200763845646681640732681928346007767285876284900068874564639274964415904034033672337814491597032941787294155061054129515400159393851663929325677429557549480046658273579653990940233543644649376827272541873627547532976808190325336141086433084237771738995221536763095302045902438694632702895293994483013577589081214884558493819874505920914067209522469096263076941753340983698859363700314973728977996360018626500174929290087931189997822963712306642297996163582572600112288983647651418045975770042120833949364659647336464289044499325396227091907373705772051322815957863227591912786054297862953188615559804728160710864132803585400160055575686855791785977899197902656592621283007225351401525973569300729015392211116868504740402172174442051738000251361000494534119324331668344243125963098812396962202358858395587831685194833126653577353244379935683215269177042249034574534858913812582681366908929476809052635560638119661306063936938411817713545929884317232912236262458868394202889981693561169865429884776513118227662526739978808816010470651542335015671353744817086234314662531190291040152262927104099285072418843329007277794754111637552176563589316326636049381218401837512818884771168975479483767664084842753623074019542183217985496260666590347925816342392670947839907062923166535037285019751324813803837070894638925470887039085723581006130628646664710006104352115778926613432214655311411882596942926284522109026688414975763341554921135581254616558078273470115814006008345762133130389987843270653719956709570847385786092649188858378739239165554263577301292243641604062551736892335636568854365851646207821875741724364525814143487632761341752707376754922276287782264765154315341585713773522730335403376364204258034257264749686217823666951353410677378421131371131987373222891805275062812277716412494412401207125954319991746574745892582613712825555535080404143944557295994554635608487251339462936358940832098964801619583130429720964794128539388996265368928263807677168759588502216464582430940165009688797366157733560316836710386895228270941509545222744002735499253670214715994056544813842186380128799900820933576320736369405991424263718294000613741900579513096298545330748197802568301089672873802234820488862973130369689882640657904781562389778485365025691064231795736025330908763271784911189748432246868086340383964176127605788646574472284824932687443062551220506955168464669477183681911432873544815836350548146411099960143390595799766290646881295025039150923633011076070632863317393378149693380247580035052789782755750928604039420506342939327064636161031822879248152679306862749237275631852225654266008556849497720285909150930495425967473648331437236349555448901598668408362176913559656039519670425368863482369587129462524759031776813184977588276576740482558136502103649585505703259219957675334264223783723586058509403583977103476670644788640831109650302565215607464019652716999732373465237173456595514559493098166644006211599349133180135150528651842178828026343325934755850761168697709125580056185683710540856081249519403148064618719402577663285267019698387567561524696759028106864896869293315954352097687527137201616160931174250199709289684940034696242325688410665113304377412256176258658941236728171145526423894512631717834790276921171452887352955019336759218908006048633737786728180610254782570436788449503518925787499836694785908612975543084122677060954347612133717433156783790162012337237023338316414706428592185977610158232721997915062871868186750981665537745013020880333904353639770263363809098526494532628146558065546504823486429495390613257400496912888340518222933644476683855037967975809619983575807027759535968788226194659612223044549275600274955168583542582295336042834426318478068825395450746691877897765406038432512843812811316856204608617289408229658626174420766920297427930088129519854678713548623236610413216581279267151545961594352593456757445992307889205519540082316409719591250025455237503106735639748835542480449681383030671851931491335789202123605308199952020584503423499932150962634977812456658304680581824563524814625849331926195406884818446445248429486063016169476663242625231476322371109695369483824482316410396224507675405614287468267835723704895606990652792688455844512046654853378534026646645042339638488257719874953611300494215593735545211926186721478265416885604094928290056616883807637656690510740892510549165222968878676968631652514917701499900066637344546120262780701925698706225540928945194718778004306130021828287425867048748480826948573444778244078734102710824870269523830804910960482013901294024631244800159336670212658317677879752965963472576894326540435889267293950687860830626266263287392087327302547910099932113388977807814336728791448768373686467748528777737403547472871644217767820712964506270880978637928144071192505141148004907055608097229299792441471062852247029870699869227676341773513258602908903875707454368077876422385333700692089616351009233587303986543906071880952557553380364725895007306772122528078179471056481171378557451057691044322925429024149433588396093679321361696954251299731031032804436954501929843820842383121265825740594509426942777307124802176915781835720087170538773256017987133005505911377823841791640280841409623820847637393013930778428554545222367559824666250608754284876104145661362227642405914304455580856318180935230407793891614902116292400515074914068443203230365609954878620999194306564455332547135557365318516011700321550690787716752062881527885897149410320986984083048966524351030502444679931779147659103428949129054120361601695671222140806369405940304552186212879933092856231022418446365289097444640151986623183881962444822590783585914043686193019041458962693878907034982169868696934448086213990534591792826654304798207219634134755646525483143771156678459077797196510772468000293581546267646310224279007313631352522067062951125935874473134186492497282784796644585448962932905262058065248588707020879389134476083344653170939242408249328008915731319541348311820927752486880548733943315867562666122179355051190609992911379445634995627391898459029021713155706096267881673302940198464237390445098028030948975981259252055850973537436556825780313681902007151675693827281818824587541710721180806556448039122504537089422695358382192535075692834095639859265599740391316709290043996275976830375217503360879028295673068862263077729733533853682668734519035709709687322323738300494090123239274318759046526327095178406267264828893646896593219169521106361729757074376148061601331104911692271318609404145014842866423634716982892418180484365230538864559809839273836490685480823014267803143937440431807822678779494006206489151248952516543005634448375046751754207043313372486870633237561645232360481932024377596890914783372179553676992603235715185513391098402739063753280702313301755754269396202629423910945323537910125948964941812563672992967084250667599803456273455598559628512281414582556024841783305645240508450065988755987518601335860624932784487772006842296591945516539562982960591610046578907214842054861830418175604559815168088031783080261445994444677918012432146400983610678683412974872596729258786806223080115822026289014364459002301645823666709265571264559925790622304745235625575111770791512002789380975775468546121017307522799241407026308137792971909461413145802081087738121624539858769697371425881836152605069380926917712087321915005831977113322793572385071940612761291872572099404930250277748156614021327434743881966413330052634229082906400927944924808556131183440161804801357032507836323938921567643159620442612809700944107776130638909071294456394056601559246025454204771186140420155233371270501377121034570009578009389265329385720478576508777149663403003562380595757191609382171312222810465858388943507176431939973012661591423837170284400120399485880996231859472474858776584355077006934099220340378772192728370301380838144394114984971730766162961342059105014814283949700695951676939041557902856356911055547312684571497449635320554677940775184056667637222969090346128706829887104278761090090999160443821794511763620835379716161833124364431267855435550800507986124664397724135502128238026726719914989727248512981287283697489276420792868666970177259794407858155909332508554131299946581118527691652464790819119384233275897699573012098103009171001695718791616942270079528915191912521053891838538959315167400505723817401030621004380243011187977704252328073236575129609372456053680037516596164236147709330391224409752871732067976128120428026739256557305675931512645750047875756531854825821411574030473147492511910835615765732002546109686701890307648531373832912682481741181359032826625082549313211431478953352317043989053928534946642886074268371824902498092479487226633686823799580875637040808655649321905489637785549531167397935270799470452399153297534358690514105864096534514182896474439367182852711843560799285895978176543950113088848419163516673213692860830956744502801800373716458009168082972708715609185038654053436660045504985624687376022557041595800250174095361839287643458003670864954057941720085136357127163768323493134230703821274484501440529541695374381945459456533165140990993722722801019654652726227831512103467686166826131471843610025517863247950150022953695466317739589344131481485834694374523981159954666071205997794363440185078360899108948073419633939259318973940943110042116729120199722626609871927014024105805515315100109804996044147291039451030312664114726736839973315035036742741546992633165270432940675237449075056739508929674779115800864399992564817208847429250821546279856079127768611946086210349405535850134472190244543824521089284409498132717010673966471114931896789977661595488186193176900175027901783824624387873831483279500879026433992577026588005849778984624295660321276945810824348129690840972550671054732471317254997191901039553305847040728081693158626093886019147689944137673621432083607375131574376316754666479186753896571555100850626810005119827486807780592667765654100834778571024250133253391587384761024129794736751001163498977803745930025457609870671092153597115178252014281216647543034075128600240297038428615984289816602143429849088917359682192284469123035904329877231843309914187264674607558318725713138832356015809009594182530207799397648462597901883341793830920965841463574411985878296475850943053008148341821747826603773762252997703468752903517310792083220038080809212164346586817989810504274375385786789186350517717501606531826406928883250135919517178537687865881752366421534010961295763074762648070312757365787762352859057153932484576503944390496668087711899192498933896524852395536795827530614167131757915756386606004839994179548705868209201195154952031294562451315422506574858629161606523796643010172693950282294667489681746821163996794950294284013099235901278250437428192557634533217576162292751110598368271567229778620053722932314082887058749444060116236521627717558503013451471452765841864277071769968435499620257547431811994883385806759692359580622165832464092095350648357935817742903018315351290014321495518177456908388719320697769695657771754499149911431368950836160692539606469893374870942933219185601299108564470256257163505508620689240297589684714283678684735455533583477652536156578189996983068654671736445996343136468195427420490472433064675001442697508322369013083895492637066778406531328664886080129513771720847581157719491012345141774941482773580041432667332379617716965698582785832300505265883502247868050648201444570593197343382923860072601696510903258980909912837652275381493529845099414966933862815568031306981064525192703818515872648691762563239441425216118427769145067718411735714396681005615483952443154944864238384298900399826113322468963346522104692545137969276009719645338955332105584245640187448611050959111766828942711640054010503770420346052521318228045892998637903572350665108782350043349942391285236308896510989246641056331584171142885304143772286629832318970869030400301325951476774237516158840915838059151673504519131178193943428482922272304061422582078027829148070426761629302539228321084917759984200595105312

Patterns in functions

Page 69: 7li7w devcon5

1> Double = fun(X) -> X * 2 end.#Fun<erl_eval.6.111823515>

2> Double(2).4

3> List = [1, 2, 3].[1,2,3]

4> lists:map(Double, List).[2,4,6]

5> lists:map(fun(X) -> X + 1 end, List).[2,3,4]

6> lists:foldl(fun(X, Sum) -> X + Sum end, 0, List).6

Higher order functions

Page 70: 7li7w devcon5

1> Numbers = [1, 2, 3, 4].[1,2,3,4]

2> Double = fun(X) -> X * 2 end.#Fun<erl_eval.6.111823515>

3> lists:map(Double, Numbers).[2,4,6,8]

4> [Double(X) || X <- Numbers].[2,4,6,8]

5> [X || X <- Numbers, X > 1, X < 4].[2,3]

6> Basket = [{pencil, 4, 0.25}, {pen, 1, 1.20}, {paper, 2, 1.00}].[{pencil,4,0.25},{pen,1,1.2},{paper,2,1.0}]

7> Totals = [{Item, Qty * Price} || {Item, Qty, Price} <- Basket].[{pencil,1.0},{pen,1.2},{paper,2.0}]

List comprehensions

Page 71: 7li7w devcon5

-module(doubler).-export([loop/0]).

loop() -> receive N -> io:format("~b~n", [N * 2]), loop()end.

18> Doubler = spawn(fun doubler:loop/0).<0.87.0>

19> Doubler ! 2.4

Message loops

Page 72: 7li7w devcon5

-module(doubler).-export([loop/0, double/2]).

loop() -> receive {Pid, N} -> Pid ! (N * 2), loop()end.

double(To, N) -> To ! {self(), N}, receive Result -> Result end.

27> Doubler = spawn(fun doubler:loop/0).<0.118.0>

28> doubler:double(Doubler, 3).6

Synchronous messages

Page 73: 7li7w devcon5

-module(monitor).-export([loop/0, start/0]).

loop() -> process_flag(trap_exit, true), receive new -> register(doubler, spawn_link(fun doubler:loop/0)), loop(); {'EXIT', From, Reason} -> io:format("~p exited: ~p.", [From, Reason]), monitor ! new, loop()end.

start() -> register(monitor, spawn(fun monitor:loop/0)), monitor ! new.

Monitor & restart

Page 74: 7li7w devcon5

Designed for concurrency & fault tolerance

Flexibility of dynamic typingLightweight processes with message passing & monitoringBuild scalable applications with the OTP librarySyntax sometimes a little clumsyIntegration with other languages

Pros

Cons

Page 75: 7li7w devcon5

RubyIoPrologScalaErlangClojureHaskell

Page 76: 7li7w devcon5

His communication style is often inverted and hard to understand. He seems too small to make a difference, but it quickly becomes apparent that there is more to Yoda than meets the eye.

Page 77: 7li7w devcon5

user=> (+ 2 2)4

user=> (- 10 4 1)5

user=> (/ 2.0 3)0.6666666666666666

user=> (/ 2 3)2/3

user=> (count "hello")5

user=> (+ (count "hello") (count "clojure"))12

Prefix notation

Page 78: 7li7w devcon5

user=> (class 1)java.lang.Integer

user=> (class "foo")java.lang.String

user=> (class (= 2 2))java.lang.Boolean

user=> (class (/ 1 2))clojure.lang.Ratio

Java hiding underneath

Page 79: 7li7w devcon5

user=> (1 2 3)java.lang.ClassCastException: java.lang.Integer cannot be cast to clojure.lang.IFn (NO_SOURCE_FILE:0)

user=> (list 1 2 3)(1 2 3)

user=> (class (list 1 2 3))clojure.lang.PersistentList

user=> '(1 2 3)(1 2 3)

user=> (class '(+ 2 2))clojure.lang.PersistentList

user=> (eval '(+ 2 2))4

Data or code?

Page 80: 7li7w devcon5

user=> (def numbers [1 2 3])(1 2 3)

user=> (conj numbers "forty-two")[1 2 3 "forty-two"]

user=> (def crew #{:zaphod :trillian :marvin})#'user/crew

user=> (clojure.set/union crew #{:ford :zaphod :arthur})#{:arthur :trillian :ford :zaphod :marvin}

user=> (def home {:arthur :earth, :ford :betelgeuse, :marvin :sirius})#'user/home

user=> (home :arthur):earth

user=> (:arthur home):earth

Vectors, sets & maps

Page 81: 7li7w devcon5

user=> (defn answer [] 42)#'user/answer

user=> (answer)42

user=> (defn treble [a] (* 3 a))#'user/treble

user=> (treble 20)60

Defining functions

Page 82: 7li7w devcon5

user=> (def board [[:x :o :x] [:o :x :o] [:o :x :o]])#'user/board

user=> (defn centre [[_ [_ c _] _]] c)#'user/centre

user=> (centre board):x

Destructuring params

Page 83: 7li7w devcon5

user=> (defn treble [a] (* 3 a))#'user/treble

user=> (def numbers [1 2 3])#'user/numbers

user=> (map treble numbers)(3 6 9)

user=> (map (fn [n] (* 3 n)) numbers)(3 6 9)

user=> (map #(* 3 %) numbers)(3 6 9)

Anonymous functions

Page 84: 7li7w devcon5

user=> (defn size [v] (if (empty? v) 0 (inc (size (rest v)))))#'user/size

user=> (size [1 2 3])3

user=> (defn size [v] (loop [l v, c 0] (if (empty? l) c (recur (rest l) (inc c)))))

Recursion: loop & recur

Page 85: 7li7w devcon5

user=> (def numbers [1 2 3 4])#'user/numbers

user=> (every? odd? numbers)false

user=> (filter odd? numbers)(1 3)

user=> (for [x numbers] (* 2 x))(2 4 6 8)

user=> (for [x numbers, y numbers] (* x y))(1 2 3 4 2 4 6 8 3 6 9 12 4 8 12 16)

user=> (for [x numbers, y numbers, :when (odd? x)] (* x y))(1 2 3 4 3 6 9 12)

Working with sequences

Page 86: 7li7w devcon5

user=> (take 5 (cycle ["I" "am" "what"]))("I" "am" "what" "I" "am")

user=> (take 5 (drop 2 (cycle [1 2 3])))(3 1 2 3 1)

user=> (->> [1 2 3] (cycle) (drop 2) (take 5))(3 1 2 3 1)

user=> (take 5 (iterate inc 1))(1 2 3 4 5)

user=> (defn factorial [n] (apply * (take n (iterate inc 1))))#'user/factorial

user=> (factorial 5)120

Lazy evaluation

Page 87: 7li7w devcon5

user=> (defprotocol Shape (area [this]))Shape

user=> (defrecord Square [width height] Shape (area [this] (* width height)))user.Square

user=> (defrecord Circle [radius] Shape (area [this] (* (. Math PI) (* radius radius))))user.Circle

user=> (area (Square. 2 3))6

user=> (area (Circle. 4))50.26548245743669

Records & protocols

Page 88: 7li7w devcon5

user=> (defn unless [test body] (if (not test) body))#'user/unless

user=> (unless true (println "It's a lie!"))It's a lie!nil

user=> (defmacro unless [test body] (list 'if (list 'not test) body))#'user/unless

user=> (macroexpand '(unless condition body))(if (not condition) body)

user=> (unless true (println "It's a lie!"))nil

user=> (unless false (println "It's true!"))It's true!nil

Macro expansion

Page 89: 7li7w devcon5

user=> (def ford (ref {:name "Ford Prefect", :from "Guildford"}))#'user/ford

user=> (deref ford){:name "Ford Prefect", :from "Guildford"}

user=> @ford{:name "Ford Prefect", :from "Guildford"}

user=> (alter ford assoc :from "Betelgeuse")java.lang.IllegalStateException: No transaction running (NO_SOURCE_FILE:0)

user=> (dosync (alter ford assoc :from "Betelgeuse")){:name "Ford Prefect", :from "Betelgeuse"}

user=> @ford{:name "Ford Prefect", :from "Betelgeuse"}

Transactional memory

Page 90: 7li7w devcon5

user=> (def numbers (atom [1 2 3]))#'user/numbers

user=> numbers#<Atom@7d98d9cf: [1 2 3]>

user=> @numbers[1 2 3]

user=> (reset! numbers [4 5 6])[4 5 6]

user=> (swap! numbers conj 7)[4 5 6 7]

Encapsulation with atoms

Page 91: 7li7w devcon5

user=> (defn slow-twice [x] (do (Thread/sleep 5000) (* 2 x)))#'user/slow-twice

user=> (def number (agent 2))#'user/number

user=> number#<Agent@4c825cf3: 2>

user=> @number2

user=> (send number slow-twice)#<Agent@4c825cf3: 2>

user=> @number2

user=> @number4

Agents in the background

Page 92: 7li7w devcon5

user=> (def ultimate-answer (future (do (Thread/sleep 2.4e17) 42)))#'user/ultimate-answer

user=>

Back to the futures

@ultimate-answer42

Page 93: 7li7w devcon5

A good lisp implementationAccess to Java ecosystemConcurrency provided by STMPrefix notation can be confusing(((((and all those parens don’t help)))))Some limitations compared to other lisps

Pros

Cons

Page 94: 7li7w devcon5

RubyIoPrologScalaErlangClojureHaskell

Page 95: 7li7w devcon5

Haskell represents purity and freedom, but the power comes at a price. Think Spock from Star Trek. His character has a single-minded purity that has endeared him to generations.

Page 96: 7li7w devcon5

Prelude> :set +tPrelude> 4242it :: Integer

Prelude> "Mostly harmless""Mostly harmless"it :: [Char]

Prelude> "black" == "white"Falseit :: Bool

Prelude> 1/20.5it :: Double

Type inference

Page 97: 7li7w devcon5

Prelude> let double x = x * 2double :: Num a => a -> a

Prelude> double 48

Prelude> double 2.55.0

Prelude> let times x y = x * ytimes :: Num a => a -> a -> a

Prelude> times 5 630

Defining functions

Page 98: 7li7w devcon5

module Main where

double :: Integer -> Integer double x = 2 * x

Prelude> :load main[1 of 1] Compiling Main ( main.hs, interpreted )Ok, modules loaded: Main.

*Main> double 24

*Main> double 2.5

<interactive>:1:8: No instance for (Fractional Integer) arising from the literal `2.5'

Specifying function types

Page 99: 7li7w devcon5

module Main where

factorial :: Integer -> Integer factorial 0 = 1 factorial x = x * factorial (x - 1)

factorial2 :: Integer -> Integer factorial2 x | x > 1 = x * factorial2 (x - 1) | otherwise = 1

Pattern matching & guards

Page 100: 7li7w devcon5

Prelude> let zaphod = ("Zaphod", "Beeblebrox", "Betelgeuse", 2)Prelude> let (_, _, _, numberOfHeads) = zaphod

Prelude> let numbers = [1, 2, 3, 4]Prelude> let (head:tail) = numbersPrelude> head1Prelude> tail[2,3,4]

Prelude> 1:[2, 3][1,2,3]

Prelude> [1, "two"]<interactive>:1:2: No instance for (Num [Char]) arising from the literal `1' Possible fix: add an instance declaration for (Num [Char]) In the expression: 1 In the expression: [1, "two"] In an equation for `it': it = [1, "two"]

Tuples & lists

Page 101: 7li7w devcon5

Prelude> [1..5][1,2,3,4,5]

Prelude> [2, 4 .. 10][2,4,6,8,10]

Prelude> [0, 0.5 .. 2][0.0,0.5,1.0,1.5,2.0]

Prelude> take 5 [1 ..][1,2,3,4,5]

Ranges & sequences

Page 102: 7li7w devcon5

Prelude> let numbers = [1,2,3]

Prelude> [x * 2 | x <- [1, 2, 3]][2,4,6]

Prelude> [[x, y] | x <- numbers, y <- numbers][[1,1],[1,2],[1,3],[2,1],[2,2],[2,3],[3,1],[3,2],[3,3]]

Prelude> [[x, y] | x <- numbers, y <- numbers, x < y][[1,2],[1,3],[2,3]]

Prelude> let more_numbers = [4,5]

Prelude> [(x, y, x * y) | x <- numbers, y <- more_numbers, x < y][(1,4,4),(1,5,5),(2,4,8),(2,5,10),(3,4,12),(3,5,15)]

List comprehensions

Page 103: 7li7w devcon5

Prelude> 4 * 520

Prelude> (*) 4 520

Prelude> :t (*)(*) :: Num a => a -> a -> a

Prelude> let double = (* 2)Prelude> :t doubledouble :: Integer -> Integer

Prelude> double 36

Function currying

Page 104: 7li7w devcon5

Prelude> (\x -> 2 * x) 510

Prelude> map (\x -> 2 * x) [1, 2, 3][2,4,6]

Prelude> map (* 2) [1, 2, 3][2,4,6]

Prelude> filter odd [1, 2, 3, 4][1,3]

Prelude> foldl (+) 0 [1, 2, 3, 4]10

Higher order functions

Page 105: 7li7w devcon5

class Eq a where (==), (/=) :: a -> a -> Bool -- Minimal complete definition: -- x/=y x==y (==) or (/=) = not(x==y) = not(x/=y)

*Main> :info Integerdata Integer = integer-gmp:GHC.Integer.Type.S# GHC.Prim.Int# | integer-gmp:GHC.Integer.Type.J# GHC.Prim.Int# GHC.Prim.ByteArray# -- Defined in integer-gmp:GHC.Integer.Typeinstance Enum Integer -- Defined in GHC.Numinstance Eq Integer -- Defined in GHC.Classesinstance Integral Integer -- Defined in GHC.Realinstance Num Integer -- Defined in GHC.Numinstance Ord Integer -- Defined in GHC.Classesinstance Read Integer -- Defined in GHC.Readinstance Real Integer -- Defined in GHC.Realinstance Show Integer -- Defined in GHC.Num

Type classes

Page 106: 7li7w devcon5

module Main where data Shape = Circle Float | Rectangle Float Float deriving show area :: Shape -> Float area (Circle r) = pi * r ^ 2 area (Rectangle x y) = x * y

*Main> let circle = Circle 10

*Main> let rect = Rectangle 6 7

*Main> area circle314.15927

*Main> area rect42.0

*Main> [circle, rect][Circle 10.0,Rectangle 6.0 7.0]

User-defined types

Page 107: 7li7w devcon5

module Main where data Shape = Circle {radius :: Float} | Rectangle {width :: Float, height :: Float} deriving Show area :: Shape -> Float area (Circle r) = pi * r ^ 2 area (Rectangle x y) = x * y

*Main> let circle = Circle 10

*Main> let rect = Rectangle 6 7

*Main> [circle, rect][Circle {radius = 10.0},Rectangle {width = 6.0, height = 7.0}]

Record syntax

Page 108: 7li7w devcon5

Monads

A monad is a construction that, given an underlying type system, embeds a corresponding type system (called the monadic type system) into it (that is, each monadic type acts as the underlying type). This monadic type system preserves all significant aspects of the underlying type system, while adding features particular to the monad.Monads must obey the following rules:• (return x) >>= f ≡ f x• m >>= return ≡ m• (m >>= f) >>= g ≡ m >>= ( \x -> (f x >>= g) )

Page 109: 7li7w devcon5

Monads

A monad is a construction that, given an underlying type system, embeds a corresponding type system (called the monadic type system) into it (that is, each monadic type acts as the underlying type). This monadic type system preserves all significant aspects of the underlying type system, while adding features particular to the monad.Monads must obey the following rules:• (return x) >>= f ≡ f x• m >>= return ≡ m• (m >>= f) >>= g ≡ m >>= ( \x -> (f x >>= g) )

Page 110: 7li7w devcon5

data Maybe a = Nothing | Just a

Prelude> case (html doc) of Nothing -> Nothing Just x -> case body x of Nothing -> Nothing Just y -> paragraph 2 y

instance Monad Maybe where return = Just Nothing >>= f = Nothing (Just x) >>= f = f x

Prelude> Just someWebPage >>= html >>= body >>= paragraph >>= return

The maybe monad

Page 111: 7li7w devcon5

Pure functional language with no side effectsStrong typing with powerful type inferenceLaziness reduces need for recursionIdeal for learning the functional paradigmInflexibility and lack of compromise

Small community outside academiaSteep learning curve (especially monads!)

Pros

Cons

Page 112: 7li7w devcon5

What I learned fromSeven Languagesin Seven Weeks

Page 113: 7li7w devcon5

def total_price(widgets) total = 0

widgets.each do |widget| if widget.red? total += widget.price end end totalend

def total_price(widgets) widgets.select{|w| w.red?}.map{|w| w.price}.reduce(&:+)end

Functional style

Page 114: 7li7w devcon5

• Access to Java libraries• Deployment environments• Escape route for Java developers• Limitations (eg tail recursion)

JVM or standalone?

Page 115: 7li7w devcon5

• Languages• Features

• First-class functions• List comprehensions• Pattern matching• Lazy evaluation

Know what’s out there

Page 116: 7li7w devcon5

• Immutability• Coroutines• Actors• Futures• Software Transactional Memory

Dealing with concurrency