Scala é considerada uma linguagem funcional porque suporta:
1) Programação funcional através de funções de ordem superior e avaliação atrasada;
2) Transparência referencial evitando efeitos colaterais;
3) Streams permitem gerar sequências infinitas de maneira preguiçosa.
18. • Estratégia
de avaliação que satisfaz ambas as
propriedades abaixo:
•A avaliação da expressão é atrasada até que o
valor seja necessário (non-strict evaluation)
• Avaliações repetidas são evitadas (sharing)
19. CALL BY NAME
def loop(condition: => Boolean)(expression: => Unit) {
if (condition) {
expression
loop(condition)(expression)
}
}
20. CALL BY NAME
def loop(condition: => Boolean)(expression: => Unit) {
if (condition) {
expression
loop(condition)(expression)
}
}
21. CALL BY NAME
def loop(condition: => Boolean)(expression: => Unit) {
if (condition) {
expression
loop(condition)(expression)
}
}
var i = 0;
loop(i < 5) { println(i); i=i+1 }
22. CALL BY NAME
def loop(condition: => Boolean)(expression: => Unit) {
if (condition) {
expression
loop(condition)(expression)
}
}
var i = 0;
loop(i < 5) { println(i); i=i+1 }
0
1
2
3
4
23. CALL BY NAME
def loop(condition: => Boolean)(expression: => Unit) {
if (condition) {
expression
loop(condition)(expression)
}
}
var i = 0;
loop(i < 5) { println(i); i=i+1 }
0
1
2 (apenas non-strict evaluation)
3
4
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>
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
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
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
29. 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