laziness in swift

73
Laziness in Swi+ Maciej Konieczny narf.pl 2 macoscope.com

Upload: swiftwro

Post on 25-Jun-2015

481 views

Category:

Documents


0 download

DESCRIPTION

© Maciej Konieczny http://narf.pl/ github.com/narfdotpl/swiftwro-1-laziness-in-swift Talk that Macoscope's own Maciej Konieczny gave at the first SwiftWro meetup on 2014-08-20 in Wrocław, Poland. http://vimeo.com/104053958

TRANSCRIPT

Page 1: Laziness in Swift

Laziness(in(Swi+Maciej'Konieczny

narf.pl'2'macoscope.com

Page 2: Laziness in Swift

narf.pl

Page 3: Laziness in Swift
Page 4: Laziness in Swift

Swi$Warsaw.com

Page 5: Laziness in Swift

Python'!

Page 6: Laziness in Swift

Django'!

Page 7: Laziness in Swift

JavaScript*!

Page 8: Laziness in Swift

CoffeeScript+!

Page 9: Laziness in Swift

Objec&ve(C*!

Page 10: Laziness in Swift

Swi$%!

Page 11: Laziness in Swift
Page 12: Laziness in Swift

Python'!

Page 13: Laziness in Swift

Laziness(in(Swi+

Page 14: Laziness in Swift
Page 15: Laziness in Swift
Page 16: Laziness in Swift

delaying)computa0onun0l)necessary

Page 17: Laziness in Swift

never%necessarynever%computed

Page 18: Laziness in Swift

poten&al)forremoving

needless)computa&on

Page 19: Laziness in Swift

poten&al)forreducing

memory)footprint

Page 20: Laziness in Swift

poten&al)forinfinite

data)structures

Page 21: Laziness in Swift

Laziness(allows(the(expression(of(programs(that(would(otherwise(not(terminate

Page 22: Laziness in Swift

not$one$pa(ern

Page 23: Laziness in Swift

Swi$

Page 24: Laziness in Swift

lazy var

Page 25: Laziness in Swift

SequenceType

Page 26: Laziness in Swift

@autoclosure

Page 27: Laziness in Swift

lazy var

Page 28: Laziness in Swift

class BlogPost { var filename: String

init(filename: String) { self.filename = filename }}

Page 29: Laziness in Swift

class BlogPost { var filename: String var foo = Foo()

init(filename: String) { self.filename = filename }}

Page 30: Laziness in Swift

class BlogPost { var filename: String lazy var foo = Foo()

init(filename: String) { self.filename = filename }}

Page 31: Laziness in Swift

class BlogPost { var filename: String

init(filename: String) { self.filename = filename }}

Page 32: Laziness in Swift

class BlogPost { var filename: String lazy var markdown: String = { markdownForFile(self.filename) }()

init(filename: String) { self.filename = filename }}

Page 33: Laziness in Swift

Swift.nil != ObjC.nil

Page 34: Laziness in Swift

- (NSString *)markdown { if (!_markdown) { _markdown = markdownForFile(self.filename); }

return _markdown;}

Page 35: Laziness in Swift

SequenceType

Page 36: Laziness in Swift

for x in xs { // ...}

Page 37: Laziness in Swift

for x in xs { // ...}

var _g = xs.generate()while let x = _g.next() { // ...}

Page 38: Laziness in Swift

class Integers: SequenceType { func generate() -> GeneratorOf<Int> { var n = -1 return GeneratorOf { ++n } }}

Page 39: Laziness in Swift

class Integers: SequenceType { func generate() -> GeneratorOf<Int> { var n = -1 return GeneratorOf { ++n } }}

for i in Integers() { println(i) // 0, 1, 2, 3, ...}

Page 40: Laziness in Swift

var integers = lazy(Integers())

Page 41: Laziness in Swift

var integers = lazy(Integers())

integers.filterintegers.map

Page 42: Laziness in Swift

extension LazySequence { var first: LazySequence.Generator.Element? { for x in self { return x }

return nil }}

integers.first! // 0

Page 43: Laziness in Swift

var x = integers

Page 44: Laziness in Swift

var x = integers \ .filter { $0 % 2 == 1 } \

Page 45: Laziness in Swift

var x = integers \ .filter { $0 % 2 == 1 } \ .map { $0 * $0 }

Page 46: Laziness in Swift

var x = integers \ .filter { $0 % 2 == 1 } \ .map { $0 * $0 } \ .filter { $0 > 100 } \

Page 47: Laziness in Swift

var x = integers \ .filter { $0 % 2 == 1 } \ .map { $0 * $0 } \ .filter { $0 > 100 } \ .first!

Page 48: Laziness in Swift

var x = integers \ .filter { $0 % 2 == 1 } \ .map { $0 * $0 } \ .filter { $0 > 100 } \ .first!

println(x) // 121

Page 49: Laziness in Swift

var x = integers.filter { return $0 % 2 == 1}.map { return $0 * $0}.filter { return $0 > 10}.first!

println(x) // 25

Page 50: Laziness in Swift

var x = integers.filter { println("\n\($0)") println("even?") return $0 % 2 == 1}.map { println("square") return $0 * $0}.filter { println("threshold") return $0 > 10}.first!

println(x) // 25

Page 51: Laziness in Swift

integers.filter { $0 % 2 == 1 } \ .map { $0 * $0 } .filter { $0 > 10 } \ .first!

0 even?1 even? square threshold2 even?3 even? square threshold4 even?5 even? square threshold

Page 52: Laziness in Swift

@autoclosure

Page 53: Laziness in Swift

// without @autoclosure:f({ x })

// with @autoclosure:f(x)

Page 54: Laziness in Swift

func foo(bar: () -> ()) { bar()}

foo({ println("baz") })

Page 55: Laziness in Swift

func foo(bar: @autoclosure () -> ()) { bar()}

foo(println("baz"))

Page 56: Laziness in Swift

while&not&x&/&un-l&x&/&dopóki&x

Page 57: Laziness in Swift

func dopóki(condition: @autoclosure () -> Bool, body: () -> ()) { if !condition() { body() dopóki(condition(), body) }}

var i = 3

dopóki (i == 0) { println(i) i -= 1}

Page 58: Laziness in Swift

BTW:%compiler%performstail%call%op2misa2on

Page 59: Laziness in Swift

Page 60: Laziness in Swift

not$one$pa(ern

Page 61: Laziness in Swift

removingneedless,computa2on

Page 62: Laziness in Swift

reducingmemory,footprint

Page 63: Laziness in Swift

expressiveness

Page 64: Laziness in Swift

lazy var foo = Foo()

Page 65: Laziness in Swift

lazy var markdown: String = { markdownForFile(self.filename)}()

Page 66: Laziness in Swift

for x in xs { // ...}

var _g = xs.generate()while let x = _g.next() { // ...}

Page 67: Laziness in Swift

// without @autoclosure:f({ x })

// with @autoclosure:f(x)

Page 68: Laziness in Swift

That's'all'folks!

Page 69: Laziness in Swift

narf.pl

Page 70: Laziness in Swift
Page 71: Laziness in Swift

References((1(of(2)• Understand)and)implement)laziness,#Ma&#Mighth&p://ma&.might.net/ar3cles/implemen3ng7laziness/

• WWDC)2014,)Session)404:)Advanced)Swi>h&ps://developer.apple.com/videos/wwdc/2014/

Page 72: Laziness in Swift

References((2(of(2)• Lazy%by%name,%lazy%by%nature,#airspeedvelocityh2p://airspeedvelocity.net/2014/07/26/lazy>by>name>lazy>by>nature/

• /r/awwh2p://www.panopCkos.com/r/aww/top

Page 73: Laziness in Swift

Ques%ons?