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 ...
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...
SHORT-CIRCUIT EVALUATIONdef condicao1 = { println("Avaliou condicao1"); true }def condicao2 = { println("Avaliou condicao2...
SHORT-CIRCUIT EVALUATIONdef condicao1 = { println("Avaliou condicao1"); true }def condicao2 = { println("Avaliou condicao2...
SHORT-CIRCUIT EVALUATIONdef condicao1 = { println("Avaliou condicao1"); true }def condicao2 = { println("Avaliou condicao2...
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...
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...
LAZY VALSscala> lazy val x = { println("avaliou x"); "XXX" }x: java.lang.String = <lazy>scala> lazy val y = { println("ava...
LAZY VALSscala> lazy val x = { println("avaliou x"); "XXX" }x: java.lang.String = <lazy>scala> lazy val y = { println("ava...
LAZY VALSscala> lazy val x = { println("avaliou x"); "XXX" }x: java.lang.String = <lazy>scala> lazy val y = { println("ava...
LAZY VALSscala> lazy val x = { println("avaliou x"); "XXX" }x: java.lang.String = <lazy>scala> lazy val y = { println("ava...
LAZY VALSscala> lazy val x = { println("avaliou x"); "XXX" }x: java.lang.String = <lazy>scala> lazy val y = { println("ava...
LAZY VALSscala> lazy val x = { println("avaliou x"); "XXX" }x: java.lang.String = <lazy>scala> lazy val y = { println("ava...
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)jav...
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(2...
STREAMSscala> lazy val naturais:Stream[Int] =  0 #:: naturais.map(_+1)naturais: Stream[Int] = <lazy>scala> naturais.take(2...
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.foreac...
SHARINGscala> lazy val naturais:Stream[Int] =  0 #:: naturais.map(_+1)naturais: Stream[Int] = <lazy>scala> naturais.foreac...
SHARINGscala> lazy val naturais:Stream[Int] =  0 #:: naturais.map(_+1)naturais: Stream[Int] = <lazy>scala> naturais.foreac...
• 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.la...
EAGER1   val x = { throw new RuntimeException; 5 }2   println("x + 3 =")3   println(x+3)Exception in thread "main" java.la...
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 "ma...
LAZY1   lazy val x = { throw new RuntimeException; 5 }2   println("x + 3 =")3   println(x+3)x + 3 =Exception in thread "ma...
LAZY EVALUATION       EM SCALA           Pedro Matiello     pmatiello@gmail.com              @pmatiello
Upcoming SlideShare
Loading in …5
×

Lazy Evaluation em Scala

631
-1

Published on

Presented at: TDC 2012, July/2012.

0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
631
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
7
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Lazy Evaluation em Scala

  1. 1. LAZY EVALUATION EM SCALA
  2. 2. LAZY EVALUATION EM SCALA Pedro Matiello pmatiello@gmail.com @pmatiello
  3. 3. SCALA
  4. 4. • Tipagem estática• Programação orientada a objetos• Programação funcional
  5. 5. PROGRAMAÇÃO FUNCIONAL
  6. 6. •A operação fundamental é a aplicação de funções
  7. 7. • Um programa é uma função • Normalmente composta de outras funções •A entrada são os argumentos •A saída é o valor devolvido
  8. 8. f(x) = x²
  9. 9. • Transparência referencial (referential transparency) •A aplicação de uma função não produz efeitos colaterais
  10. 10. • Funções de ordem superior (higher-order functions)• Avaliação atrasada (lazy evaluation)
  11. 11. LAZY EVALUATION
  12. 12. •Aavaliação da expressão é atrasada até que ovalor seja necessário (non-strict evaluation)
  13. 13. • Avaliações repetidas são evitadas (sharing)
  14. 14. SHORT-CIRCUIT EVALUATIONdef condicao1 = { println("Avaliou condicao1"); true }def condicao2 = { println("Avaliou condicao2"); false }def condicao3 = { println("Avaliou condicao3"); true }
  15. 15. 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
  16. 16. 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
  17. 17. 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)
  18. 18. CALL BY NAMEdef loop(condicao: => Boolean)(expressao: => Unit) { if (condicao) { expressao loop(condicao)(expressao) }}
  19. 19. CALL BY NAMEdef loop(condicao: => Boolean)(expressao: => Unit) { if (condicao) { expressao loop(condicao)(expressao) }}
  20. 20. 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 }
  21. 21. 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
  22. 22. 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
  23. 23. 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>
  24. 24. 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>
  25. 25. 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
  26. 26. 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
  27. 27. 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
  28. 28. 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
  29. 29. STREAMSscala> lazy val naturais:List[Int] = 0 :: naturais.map(_+1)naturais: List[Int] = <lazy>
  30. 30. STREAMSscala> lazy val naturais:List[Int] = 0 :: naturais.map(_+1)naturais: List[Int] = <lazy>
  31. 31. STREAMSscala> lazy val naturais:List[Int] = 0 :: naturais.map(_+1)naturais: List[Int] = <lazy>
  32. 32. STREAMSscala> lazy val naturais:List[Int] = 0 :: naturais.map(_+1)naturais: List[Int] = <lazy>
  33. 33. STREAMSscala> lazy val naturais:List[Int] = 0 :: naturais.map(_+1)naturais: List[Int] = <lazy>
  34. 34. STREAMSscala> lazy val naturais:List[Int] = 0 :: naturais.map(_+1)naturais: List[Int] = <lazy>scala> naturais.take(20)
  35. 35. 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)! ...
  36. 36. STREAMSscala> lazy val naturais:Stream[Int] = 0 #:: naturais.map(_+1)naturais: Stream[Int] = <lazy>
  37. 37. STREAMSscala> lazy val naturais:Stream[Int] = 0 #:: naturais.map(_+1)naturais: Stream[Int] = <lazy>scala> naturais.take(20)
  38. 38. 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, ?)
  39. 39. 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)
  40. 40. CONTUDO, PORÉM, TODAVIA
  41. 41. •ALazy Evaluation e a Eager Evaluation podemproduzir resultados diferentes
  42. 42. EAGER1 var y = 22 val x = y3 y = 34 println("x = " + x)
  43. 43. EAGER y=21 var y = 22 val x = y3 y = 34 println("x = " + x)
  44. 44. EAGER y=2, x=21 var y = 22 val x = y3 y = 34 println("x = " + x)
  45. 45. EAGER y=3, x=21 var y = 22 val x = y3 y = 34 println("x = " + x)
  46. 46. EAGER y=3, x=21 var y = 22 val x = y3 y = 34 println("x = " + x)x = 2
  47. 47. LAZY1 var y = 22 lazy val x = y3 y = 34 println("x = " + x)
  48. 48. LAZY y=21 var y = 22 lazy val x = y3 y = 34 println("x = " + x)
  49. 49. LAZY y=2, x=y1 var y = 22 lazy val x = y3 y = 34 println("x = " + x)
  50. 50. LAZY y=3, x=y1 var y = 22 lazy val x = y3 y = 34 println("x = " + x)
  51. 51. LAZY y=3, x=31 var y = 22 lazy val x = y3 y = 34 println("x = " + x)x = 3
  52. 52. •O sharing do resultado das expressões pode elevaro consumo de memória
  53. 53. SHARINGscala> lazy val naturais:Stream[Int] = 0 #:: naturais.map(_+1)naturais: Stream[Int] = <lazy>
  54. 54. SHARINGscala> lazy val naturais:Stream[Int] = 0 #:: naturais.map(_+1)naturais: Stream[Int] = <lazy>scala> naturais.foreach{ x:Int => }
  55. 55. 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
  56. 56. 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
  57. 57. • Errospodem aparecer em locais diferentes do código
  58. 58. EAGER1 val x = { throw new RuntimeException; 5 }2 println("x + 3 =")3 println(x+3)
  59. 59. 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)
  60. 60. 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)
  61. 61. LAZY1 lazy val x = { throw new RuntimeException; 5 }2 println("x + 3 =")3 println(x+3)
  62. 62. LAZY1 lazy val x = { throw new RuntimeException; 5 }2 println("x + 3 =")3 println(x+3)
  63. 63. LAZY1 lazy val x = { throw new RuntimeException; 5 }2 println("x + 3 =")3 println(x+3)x + 3 =
  64. 64. 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)
  65. 65. 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)
  66. 66. LAZY EVALUATION EM SCALA Pedro Matiello pmatiello@gmail.com @pmatiello
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×