• Share
  • Email
  • Embed
  • Like
  • Save
  • Private Content
Lazy Evaluation em Scala
 

Lazy Evaluation em Scala

on

  • 694 views

Presented at: TDC 2012, July/2012.

Presented at: TDC 2012, July/2012.

Statistics

Views

Total Views
694
Views on SlideShare
683
Embed Views
11

Actions

Likes
0
Downloads
5
Comments
0

2 Embeds 11

https://si0.twimg.com 8
https://twimg0-a.akamaihd.net 3

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

    Lazy Evaluation em Scala Lazy Evaluation em Scala Presentation Transcript

    • LAZY EVALUATION EM SCALA
    • LAZY EVALUATION EM SCALA Pedro Matiello pmatiello@gmail.com @pmatiello
    • SCALA
    • • Tipagem estática• Programação orientada a objetos• Programação funcional
    • PROGRAMAÇÃO FUNCIONAL
    • •A operação fundamental é a aplicação de funções
    • • Um programa é uma função • Normalmente composta de outras funções •A entrada são os argumentos •A saída é o valor devolvido
    • f(x) = x²
    • • Transparência referencial (referential transparency) •A aplicação de uma função não produz efeitos colaterais
    • • Funções de ordem superior (higher-order functions)• Avaliação atrasada (lazy evaluation)
    • LAZY EVALUATION
    • •Aavaliação da expressão é atrasada até que ovalor seja necessário (non-strict evaluation)
    • • Avaliações repetidas são evitadas (sharing)
    • SHORT-CIRCUIT EVALUATIONdef condicao1 = { println("Avaliou condicao1"); true }def condicao2 = { println("Avaliou condicao2"); false }def condicao3 = { println("Avaliou condicao3"); true }
    • SHORT-CIRCUIT EVALUATIONdef condicao1 = { println("Avaliou condicao1"); true }def condicao2 = { println("Avaliou condicao2"); false }def condicao3 = { println("Avaliou condicao3"); true }scala> condicao1 && condicao1 && condicao2 && condicao3
    • SHORT-CIRCUIT EVALUATIONdef condicao1 = { println("Avaliou condicao1"); true }def condicao2 = { println("Avaliou condicao2"); false }def condicao3 = { println("Avaliou condicao3"); true }scala> condicao1 && condicao1 && condicao2 && condicao3Avaliou condicao1Avaliou condicao1Avaliou condicao2res0: Boolean = false
    • SHORT-CIRCUIT EVALUATIONdef condicao1 = { println("Avaliou condicao1"); true }def condicao2 = { println("Avaliou condicao2"); false }def condicao3 = { println("Avaliou condicao3"); true }scala> condicao1 && condicao1 && condicao2 && condicao3Avaliou condicao1Avaliou condicao1Avaliou condicao2res0: Boolean = false(não é lazy evaluation)
    • CALL BY NAMEdef loop(condicao: => Boolean)(expressao: => Unit) { if (condicao) { expressao loop(condicao)(expressao) }}
    • CALL BY NAMEdef loop(condicao: => Boolean)(expressao: => Unit) { if (condicao) { expressao loop(condicao)(expressao) }}
    • CALL BY NAMEdef loop(condicao: => Boolean)(expressao: => Unit) { if (condicao) { expressao loop(condicao)(expressao) }}var i = 0;loop(i < 5) { println(i); i=i+1 }
    • CALL BY NAMEdef loop(condicao: => Boolean)(expressao: => Unit) { if (condicao) { expressao loop(condicao)(expressao) }}var i = 0;loop(i < 5) { println(i); i=i+1 }01234
    • CALL BY NAMEdef loop(condicao: => Boolean)(expressao: => Unit) { if (condicao) { expressao loop(condicao)(expressao) }}var i = 0;loop(i < 5) { println(i); i=i+1 }012 (apenas non-strict evaluation)34
    • LAZY VALSscala> lazy val x = { println("avaliou x"); "XXX" }x: java.lang.String = <lazy>scala> lazy val y = { println("avaliou y"); "YYY" }y: java.lang.String = <lazy>
    • LAZY VALSscala> lazy val x = { println("avaliou x"); "XXX" }x: java.lang.String = <lazy>scala> lazy val y = { println("avaliou y"); "YYY" }y: java.lang.String = <lazy>
    • LAZY VALSscala> lazy val x = { println("avaliou x"); "XXX" }x: java.lang.String = <lazy>scala> lazy val y = { println("avaliou y"); "YYY" }y: java.lang.String = <lazy>scala> if (true) x else y
    • LAZY VALSscala> lazy val x = { println("avaliou x"); "XXX" }x: java.lang.String = <lazy>scala> lazy val y = { println("avaliou y"); "YYY" }y: java.lang.String = <lazy>scala> if (true) x else yavaliou xres0: java.lang.String = XXX
    • LAZY VALSscala> lazy val x = { println("avaliou x"); "XXX" }x: java.lang.String = <lazy>scala> lazy val y = { println("avaliou y"); "YYY" }y: java.lang.String = <lazy>scala> if (true) x else yavaliou xres0: java.lang.String = XXXscala> if (true) x else y
    • LAZY VALSscala> lazy val x = { println("avaliou x"); "XXX" }x: java.lang.String = <lazy>scala> lazy val y = { println("avaliou y"); "YYY" }y: java.lang.String = <lazy>scala> if (true) x else yavaliou xres0: java.lang.String = XXXscala> if (true) x else yres1: java.lang.String = XXX
    • STREAMSscala> lazy val naturais:List[Int] = 0 :: naturais.map(_+1)naturais: List[Int] = <lazy>
    • STREAMSscala> lazy val naturais:List[Int] = 0 :: naturais.map(_+1)naturais: List[Int] = <lazy>
    • STREAMSscala> lazy val naturais:List[Int] = 0 :: naturais.map(_+1)naturais: List[Int] = <lazy>
    • STREAMSscala> lazy val naturais:List[Int] = 0 :: naturais.map(_+1)naturais: List[Int] = <lazy>
    • STREAMSscala> lazy val naturais:List[Int] = 0 :: naturais.map(_+1)naturais: List[Int] = <lazy>
    • STREAMSscala> lazy val naturais:List[Int] = 0 :: naturais.map(_+1)naturais: List[Int] = <lazy>scala> naturais.take(20)
    • STREAMSscala> lazy val naturais:List[Int] = 0 :: naturais.map(_+1)naturais: List[Int] = <lazy>scala> naturais.take(20)java.lang.StackOverflowError! at .naturais(<console>:7)! at .naturais(<console>:7)! ...
    • STREAMSscala> lazy val naturais:Stream[Int] = 0 #:: naturais.map(_+1)naturais: Stream[Int] = <lazy>
    • STREAMSscala> lazy val naturais:Stream[Int] = 0 #:: naturais.map(_+1)naturais: Stream[Int] = <lazy>scala> naturais.take(20)
    • STREAMSscala> lazy val naturais:Stream[Int] = 0 #:: naturais.map(_+1)naturais: Stream[Int] = <lazy>scala> naturais.take(20)res0: scala.collection.immutable.Stream[Int] =Stream(0, ?)
    • STREAMSscala> lazy val naturais:Stream[Int] = 0 #:: naturais.map(_+1)naturais: Stream[Int] = <lazy>scala> naturais.take(20).toListres1: List[Int] = List(0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10, 11, 12, 13, 14, 15, 16, 17, 18, 19)
    • CONTUDO, PORÉM, TODAVIA
    • •ALazy Evaluation e a Eager Evaluation podemproduzir resultados diferentes
    • EAGER1 var y = 22 val x = y3 y = 34 println("x = " + x)
    • EAGER y=21 var y = 22 val x = y3 y = 34 println("x = " + x)
    • EAGER y=2, x=21 var y = 22 val x = y3 y = 34 println("x = " + x)
    • EAGER y=3, x=21 var y = 22 val x = y3 y = 34 println("x = " + x)
    • EAGER y=3, x=21 var y = 22 val x = y3 y = 34 println("x = " + x)x = 2
    • LAZY1 var y = 22 lazy val x = y3 y = 34 println("x = " + x)
    • LAZY y=21 var y = 22 lazy val x = y3 y = 34 println("x = " + x)
    • LAZY y=2, x=y1 var y = 22 lazy val x = y3 y = 34 println("x = " + x)
    • LAZY y=3, x=y1 var y = 22 lazy val x = y3 y = 34 println("x = " + x)
    • LAZY y=3, x=31 var y = 22 lazy val x = y3 y = 34 println("x = " + x)x = 3
    • •O sharing do resultado das expressões pode elevaro consumo de memória
    • SHARINGscala> lazy val naturais:Stream[Int] = 0 #:: naturais.map(_+1)naturais: Stream[Int] = <lazy>
    • SHARINGscala> lazy val naturais:Stream[Int] = 0 #:: naturais.map(_+1)naturais: Stream[Int] = <lazy>scala> naturais.foreach{ x:Int => }
    • SHARINGscala> lazy val naturais:Stream[Int] = 0 #:: naturais.map(_+1)naturais: Stream[Int] = <lazy>scala> naturais.foreach{ x:Int => }Exception in thread "main" java.lang.OutOfMemoryError:Java heap space
    • SHARINGscala> lazy val naturais:Stream[Int] = 0 #:: naturais.map(_+1)naturais: Stream[Int] = <lazy>scala> naturais.foreach{ x:Int => }Exception in thread "main" java.lang.OutOfMemoryError:Java heap space
    • • Errospodem aparecer em locais diferentes do código
    • EAGER1 val x = { throw new RuntimeException; 5 }2 println("x + 3 =")3 println(x+3)
    • EAGER1 val x = { throw new RuntimeException; 5 }2 println("x + 3 =")3 println(x+3)Exception in thread "main" java.lang.RuntimeException! at Test$.main(Test.scala:1)! at Test.main(Test.scala)
    • EAGER1 val x = { throw new RuntimeException; 5 }2 println("x + 3 =")3 println(x+3)Exception in thread "main" java.lang.RuntimeException! at Test$.main(Test.scala:1)! at Test.main(Test.scala)
    • LAZY1 lazy val x = { throw new RuntimeException; 5 }2 println("x + 3 =")3 println(x+3)
    • LAZY1 lazy val x = { throw new RuntimeException; 5 }2 println("x + 3 =")3 println(x+3)
    • LAZY1 lazy val x = { throw new RuntimeException; 5 }2 println("x + 3 =")3 println(x+3)x + 3 =
    • LAZY1 lazy val x = { throw new RuntimeException; 5 }2 println("x + 3 =")3 println(x+3)x + 3 =Exception in thread "main" java.lang.RuntimeException! at Test$.main(Test.scala:1)! at Test$.main(Test.scala:3)! at Test.main(Test.scala)
    • LAZY1 lazy val x = { throw new RuntimeException; 5 }2 println("x + 3 =")3 println(x+3)x + 3 =Exception in thread "main" java.lang.RuntimeException! at Test$.main(Test.scala:1)! at Test$.main(Test.scala:3)! at Test.main(Test.scala)
    • LAZY EVALUATION EM SCALA Pedro Matiello pmatiello@gmail.com @pmatiello