SlideShare uma empresa Scribd logo
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 o
valor seja necessário (non-strict evaluation)
• Avaliações   repetidas são evitadas (sharing)
SHORT-CIRCUIT EVALUATION
def condicao1 = { println("Avaliou condicao1"); true }
def condicao2 = { println("Avaliou condicao2"); false }
def condicao3 = { println("Avaliou condicao3"); true }
SHORT-CIRCUIT EVALUATION
def condicao1 = { println("Avaliou condicao1"); true }
def condicao2 = { println("Avaliou condicao2"); false }
def condicao3 = { println("Avaliou condicao3"); true }

scala> condicao1 && condicao1 && condicao2 && condicao3
SHORT-CIRCUIT EVALUATION
def condicao1 = { println("Avaliou condicao1"); true }
def condicao2 = { println("Avaliou condicao2"); false }
def condicao3 = { println("Avaliou condicao3"); true }

scala> condicao1 && condicao1 && condicao2 && condicao3
Avaliou condicao1
Avaliou condicao1
Avaliou condicao2
res0: Boolean = false
SHORT-CIRCUIT EVALUATION
def condicao1 = { println("Avaliou condicao1"); true }
def condicao2 = { println("Avaliou condicao2"); false }
def condicao3 = { println("Avaliou condicao3"); true }

scala> condicao1 && condicao1 && condicao2 && condicao3
Avaliou condicao1
Avaliou condicao1
Avaliou condicao2
res0: Boolean = false

(não é lazy evaluation)
CALL BY NAME
def loop(condicao: => Boolean)(expressao: => Unit) {
  if (condicao) {
    expressao
    loop(condicao)(expressao)
  }
}
CALL BY NAME
def loop(condicao: => Boolean)(expressao: => Unit) {
  if (condicao) {
    expressao
    loop(condicao)(expressao)
  }
}
CALL BY NAME
def loop(condicao: => Boolean)(expressao: => Unit) {
  if (condicao) {
    expressao
    loop(condicao)(expressao)
  }
}

var i = 0;
loop(i < 5) { println(i); i=i+1 }
CALL BY NAME
def loop(condicao: => Boolean)(expressao: => Unit) {
  if (condicao) {
    expressao
    loop(condicao)(expressao)
  }
}

var i = 0;
loop(i < 5) { println(i); i=i+1 }
0
1
2
3
4
CALL BY NAME
def loop(condicao: => Boolean)(expressao: => Unit) {
  if (condicao) {
    expressao
    loop(condicao)(expressao)
  }
}

var i = 0;
loop(i < 5) { println(i); i=i+1 }
0
1
2 (apenas non-strict evaluation)
3
4
LAZY VALS
scala> 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 VALS
scala> 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 VALS
scala> 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 VALS
scala> 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
avaliou x
res0: java.lang.String = XXX
LAZY VALS
scala> 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
avaliou x
res0: java.lang.String = XXX

scala> if (true) x else y
LAZY VALS
scala> 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
avaliou x
res0: java.lang.String = XXX

scala> if (true) x else y
res1: java.lang.String = XXX
STREAMS
scala> lazy val naturais:List[Int] =
  0 :: naturais.map(_+1)
naturais: List[Int] = <lazy>
STREAMS
scala> lazy val naturais:List[Int] =
  0 :: naturais.map(_+1)
naturais: List[Int] = <lazy>
STREAMS
scala> lazy val naturais:List[Int] =
  0 :: naturais.map(_+1)
naturais: List[Int] = <lazy>
STREAMS
scala> lazy val naturais:List[Int] =
  0 :: naturais.map(_+1)
naturais: List[Int] = <lazy>
STREAMS
scala> lazy val naturais:List[Int] =
  0 :: naturais.map(_+1)
naturais: List[Int] = <lazy>
STREAMS
scala> lazy val naturais:List[Int] =
  0 :: naturais.map(_+1)
naturais: List[Int] = <lazy>

scala> naturais.take(20)
STREAMS
scala> 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)
! ...
STREAMS
scala> lazy val naturais:Stream[Int] =
  0 #:: naturais.map(_+1)
naturais: Stream[Int] = <lazy>
STREAMS
scala> lazy val naturais:Stream[Int] =
  0 #:: naturais.map(_+1)
naturais: Stream[Int] = <lazy>

scala> naturais.take(20)
STREAMS
scala> 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, ?)
STREAMS
scala> lazy val naturais:Stream[Int] =
  0 #:: naturais.map(_+1)
naturais: Stream[Int] = <lazy>

scala> naturais.take(20).toList
res1: 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 podem
produzir resultados diferentes
EAGER

1   var y = 2
2   val x = y
3   y = 3
4   println("x = " + x)
EAGER
                             y=2
1   var y = 2
2   val x = y
3   y = 3
4   println("x = " + x)
EAGER
                             y=2, x=2
1   var y = 2
2   val x = y
3   y = 3
4   println("x = " + x)
EAGER
                             y=3, x=2
1   var y = 2
2   val x = y
3   y = 3
4   println("x = " + x)
EAGER
                             y=3, x=2
1   var y = 2
2   val x = y
3   y = 3
4   println("x = " + x)

x = 2
LAZY

1   var y = 2
2   lazy val x = y
3   y = 3
4   println("x = " + x)
LAZY
                             y=2
1   var y = 2
2   lazy val x = y
3   y = 3
4   println("x = " + x)
LAZY
                             y=2, x=y
1   var y = 2
2   lazy val x = y
3   y = 3
4   println("x = " + x)
LAZY
                             y=3, x=y
1   var y = 2
2   lazy val x = y
3   y = 3
4   println("x = " + x)
LAZY
                             y=3, x=3
1   var y = 2
2   lazy val x = y
3   y = 3
4   println("x = " + x)

x = 3
•O sharing do resultado das expressões pode elevar
o consumo de memória
SHARING
scala> lazy val naturais:Stream[Int] =
  0 #:: naturais.map(_+1)
naturais: Stream[Int] = <lazy>
SHARING
scala> lazy val naturais:Stream[Int] =
  0 #:: naturais.map(_+1)
naturais: Stream[Int] = <lazy>

scala> naturais.foreach{ x:Int => }
SHARING
scala> 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
SHARING
scala> 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
EAGER
1   val x = { throw new RuntimeException; 5 }
2   println("x + 3 =")
3   println(x+3)
EAGER
1   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)
EAGER
1   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)
LAZY
1   lazy val x = { throw new RuntimeException; 5 }
2   println("x + 3 =")
3   println(x+3)
LAZY
1   lazy val x = { throw new RuntimeException; 5 }
2   println("x + 3 =")
3   println(x+3)
LAZY
1    lazy val x = { throw new RuntimeException; 5 }
2    println("x + 3 =")
3    println(x+3)

x + 3 =
LAZY
1   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
1   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

Mais conteúdo relacionado

PDF
Aula: busca e ordenação
PDF
Programação funcional tipada: uma introdução
PDF
Programação funcional em JavaScript: como e por quê?
PDF
Persistência de Dados no SQLite com Room
PPTX
PPTX
JavaFX e Scala - Como Leite com Bolacha
PDF
(A12) LabMM3 - JavaScript - Arrays
PDF
Exame matematica
Aula: busca e ordenação
Programação funcional tipada: uma introdução
Programação funcional em JavaScript: como e por quê?
Persistência de Dados no SQLite com Room
JavaFX e Scala - Como Leite com Bolacha
(A12) LabMM3 - JavaScript - Arrays
Exame matematica

Mais procurados (16)

KEY
SPL Datastructures
PDF
Java script aula 04 - objeto array
PPTX
Capítulo 6
PDF
PHP ao Extremo
PDF
Minicurso de jQuery
PDF
Mat em geometria sol vol6 cap1
PDF
LabMM3 - Aula teórica 10
PDF
Turbinando o desenvolvimento Android com Kotlin
PPT
www.AulasDeMatematicaApoio.com.br - Matemática - Equação Exponêncial
PDF
Cálculo de Derivadas
ODP
Meta-programacao em python
PDF
Java 8 - Afinal onde usamos no dia a dia? TDC 2015 - Porto Alegre
PDF
TDC2016SP - Trilha Programação Funcional
PDF
Java Básico - Resolução
PPT
Variável aleatória1
SPL Datastructures
Java script aula 04 - objeto array
Capítulo 6
PHP ao Extremo
Minicurso de jQuery
Mat em geometria sol vol6 cap1
LabMM3 - Aula teórica 10
Turbinando o desenvolvimento Android com Kotlin
www.AulasDeMatematicaApoio.com.br - Matemática - Equação Exponêncial
Cálculo de Derivadas
Meta-programacao em python
Java 8 - Afinal onde usamos no dia a dia? TDC 2015 - Porto Alegre
TDC2016SP - Trilha Programação Funcional
Java Básico - Resolução
Variável aleatória1
Anúncio

Destaque (9)

PDF
Pistache: A π-Calculus Internal Domain Specific Language for Scala
PDF
A Compositional Encoding for the Asynchronous Pi-Calculus into the Join-Calculus
PDF
Por que dizemos que Scala é uma linguagem funcional?
PDF
Context Aware Reactive Applications
PDF
Pict: A programming language based on the pi-calculus
PDF
Succession “Losers”: What Happens to Executives Passed Over for the CEO Job?
PDF
Lightning Talk #9: How UX and Data Storytelling Can Shape Policy by Mika Aldaba
PDF
Hype vs. Reality: The AI Explainer
PDF
Study: The Future of VR, AR and Self-Driving Cars
Pistache: A π-Calculus Internal Domain Specific Language for Scala
A Compositional Encoding for the Asynchronous Pi-Calculus into the Join-Calculus
Por que dizemos que Scala é uma linguagem funcional?
Context Aware Reactive Applications
Pict: A programming language based on the pi-calculus
Succession “Losers”: What Happens to Executives Passed Over for the CEO Job?
Lightning Talk #9: How UX and Data Storytelling Can Shape Policy by Mika Aldaba
Hype vs. Reality: The AI Explainer
Study: The Future of VR, AR and Self-Driving Cars
Anúncio

Semelhante a Lazy Evaluation em Scala (12)

PDF
Scala - Uma Breve (breve mesmo) Introdução
PDF
Introdução ao paradigma funcional com scala
PPTX
Técnicas de Programação Funcional
PDF
Scala: unindo programação funcional e orientação a objetos
PDF
Programação funcional
PDF
Scala: Linguagem Promissora e Funcional
PDF
Migrando pra Scala
ODP
App scala
PDF
Aprendendo Kotlin na Prática
PPTX
Scala: Programação OO, Funcional e Concorrente na JVM
PPTX
Scala java7
PDF
Três anos de Scala no NewsMonitor
Scala - Uma Breve (breve mesmo) Introdução
Introdução ao paradigma funcional com scala
Técnicas de Programação Funcional
Scala: unindo programação funcional e orientação a objetos
Programação funcional
Scala: Linguagem Promissora e Funcional
Migrando pra Scala
App scala
Aprendendo Kotlin na Prática
Scala: Programação OO, Funcional e Concorrente na JVM
Scala java7
Três anos de Scala no NewsMonitor

Lazy Evaluation em Scala

  • 1. LAZY EVALUATION EM SCALA
  • 2. LAZY EVALUATION EM SCALA Pedro Matiello pmatiello@gmail.com @pmatiello
  • 4. • Tipagem estática • Programação orientada a objetos • Programação funcional
  • 6. •A operação fundamental é a aplicação de funções
  • 7. • Um programa é uma função • Normalmente composta de outras funções •A entrada são os argumentos •A saída é o valor devolvido
  • 9. • Transparência referencial (referential transparency) •A aplicação de uma função não produz efeitos colaterais
  • 10. • Funções de ordem superior (higher-order functions) • Avaliação atrasada (lazy evaluation)
  • 12. •Aavaliação da expressão é atrasada até que o valor seja necessário (non-strict evaluation)
  • 13. • Avaliações repetidas são evitadas (sharing)
  • 14. SHORT-CIRCUIT EVALUATION def condicao1 = { println("Avaliou condicao1"); true } def condicao2 = { println("Avaliou condicao2"); false } def condicao3 = { println("Avaliou condicao3"); true }
  • 15. SHORT-CIRCUIT EVALUATION def condicao1 = { println("Avaliou condicao1"); true } def condicao2 = { println("Avaliou condicao2"); false } def condicao3 = { println("Avaliou condicao3"); true } scala> condicao1 && condicao1 && condicao2 && condicao3
  • 16. SHORT-CIRCUIT EVALUATION def condicao1 = { println("Avaliou condicao1"); true } def condicao2 = { println("Avaliou condicao2"); false } def condicao3 = { println("Avaliou condicao3"); true } scala> condicao1 && condicao1 && condicao2 && condicao3 Avaliou condicao1 Avaliou condicao1 Avaliou condicao2 res0: Boolean = false
  • 17. SHORT-CIRCUIT EVALUATION def condicao1 = { println("Avaliou condicao1"); true } def condicao2 = { println("Avaliou condicao2"); false } def condicao3 = { println("Avaliou condicao3"); true } scala> condicao1 && condicao1 && condicao2 && condicao3 Avaliou condicao1 Avaliou condicao1 Avaliou condicao2 res0: Boolean = false (não é lazy evaluation)
  • 18. CALL BY NAME def loop(condicao: => Boolean)(expressao: => Unit) { if (condicao) { expressao loop(condicao)(expressao) } }
  • 19. CALL BY NAME def loop(condicao: => Boolean)(expressao: => Unit) { if (condicao) { expressao loop(condicao)(expressao) } }
  • 20. CALL BY NAME def loop(condicao: => Boolean)(expressao: => Unit) { if (condicao) { expressao loop(condicao)(expressao) } } var i = 0; loop(i < 5) { println(i); i=i+1 }
  • 21. CALL BY NAME def loop(condicao: => Boolean)(expressao: => Unit) { if (condicao) { expressao loop(condicao)(expressao) } } var i = 0; loop(i < 5) { println(i); i=i+1 } 0 1 2 3 4
  • 22. CALL BY NAME def loop(condicao: => Boolean)(expressao: => Unit) { if (condicao) { expressao loop(condicao)(expressao) } } var i = 0; loop(i < 5) { println(i); i=i+1 } 0 1 2 (apenas non-strict evaluation) 3 4
  • 23. LAZY VALS scala> 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. LAZY VALS scala> 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. LAZY VALS scala> 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. LAZY VALS scala> 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 avaliou x res0: java.lang.String = XXX
  • 27. LAZY VALS scala> 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 avaliou x res0: java.lang.String = XXX scala> if (true) x else y
  • 28. LAZY VALS scala> 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 avaliou x res0: java.lang.String = XXX scala> if (true) x else y res1: java.lang.String = XXX
  • 29. STREAMS scala> lazy val naturais:List[Int] = 0 :: naturais.map(_+1) naturais: List[Int] = <lazy>
  • 30. STREAMS scala> lazy val naturais:List[Int] = 0 :: naturais.map(_+1) naturais: List[Int] = <lazy>
  • 31. STREAMS scala> lazy val naturais:List[Int] = 0 :: naturais.map(_+1) naturais: List[Int] = <lazy>
  • 32. STREAMS scala> lazy val naturais:List[Int] = 0 :: naturais.map(_+1) naturais: List[Int] = <lazy>
  • 33. STREAMS scala> lazy val naturais:List[Int] = 0 :: naturais.map(_+1) naturais: List[Int] = <lazy>
  • 34. STREAMS scala> lazy val naturais:List[Int] = 0 :: naturais.map(_+1) naturais: List[Int] = <lazy> scala> naturais.take(20)
  • 35. STREAMS scala> 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. STREAMS scala> lazy val naturais:Stream[Int] = 0 #:: naturais.map(_+1) naturais: Stream[Int] = <lazy>
  • 37. STREAMS scala> lazy val naturais:Stream[Int] = 0 #:: naturais.map(_+1) naturais: Stream[Int] = <lazy> scala> naturais.take(20)
  • 38. STREAMS scala> 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. STREAMS scala> lazy val naturais:Stream[Int] = 0 #:: naturais.map(_+1) naturais: Stream[Int] = <lazy> scala> naturais.take(20).toList res1: List[Int] = List(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19)
  • 41. •ALazy Evaluation e a Eager Evaluation podem produzir resultados diferentes
  • 42. EAGER 1 var y = 2 2 val x = y 3 y = 3 4 println("x = " + x)
  • 43. EAGER y=2 1 var y = 2 2 val x = y 3 y = 3 4 println("x = " + x)
  • 44. EAGER y=2, x=2 1 var y = 2 2 val x = y 3 y = 3 4 println("x = " + x)
  • 45. EAGER y=3, x=2 1 var y = 2 2 val x = y 3 y = 3 4 println("x = " + x)
  • 46. EAGER y=3, x=2 1 var y = 2 2 val x = y 3 y = 3 4 println("x = " + x) x = 2
  • 47. LAZY 1 var y = 2 2 lazy val x = y 3 y = 3 4 println("x = " + x)
  • 48. LAZY y=2 1 var y = 2 2 lazy val x = y 3 y = 3 4 println("x = " + x)
  • 49. LAZY y=2, x=y 1 var y = 2 2 lazy val x = y 3 y = 3 4 println("x = " + x)
  • 50. LAZY y=3, x=y 1 var y = 2 2 lazy val x = y 3 y = 3 4 println("x = " + x)
  • 51. LAZY y=3, x=3 1 var y = 2 2 lazy val x = y 3 y = 3 4 println("x = " + x) x = 3
  • 52. •O sharing do resultado das expressões pode elevar o consumo de memória
  • 53. SHARING scala> lazy val naturais:Stream[Int] = 0 #:: naturais.map(_+1) naturais: Stream[Int] = <lazy>
  • 54. SHARING scala> lazy val naturais:Stream[Int] = 0 #:: naturais.map(_+1) naturais: Stream[Int] = <lazy> scala> naturais.foreach{ x:Int => }
  • 55. SHARING scala> 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. SHARING scala> 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. • Errospodem aparecer em locais diferentes do código
  • 58. EAGER 1 val x = { throw new RuntimeException; 5 } 2 println("x + 3 =") 3 println(x+3)
  • 59. EAGER 1 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. EAGER 1 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. LAZY 1 lazy val x = { throw new RuntimeException; 5 } 2 println("x + 3 =") 3 println(x+3)
  • 62. LAZY 1 lazy val x = { throw new RuntimeException; 5 } 2 println("x + 3 =") 3 println(x+3)
  • 63. LAZY 1 lazy val x = { throw new RuntimeException; 5 } 2 println("x + 3 =") 3 println(x+3) x + 3 =
  • 64. LAZY 1 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. LAZY 1 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. LAZY EVALUATION EM SCALA Pedro Matiello pmatiello@gmail.com @pmatiello