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
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