Function parameters can be passed by value or be passed by name.
The same distinction applies to definitions.
The def form is “by-name”, its right hand side is evaluated on each use.
There is also a val form, which is “by-value”.
Example:
val x = 2
val y = square(x)
The right-hand side of a val definition is evaluated at the point of
the definition itself.
Afterwards, the name refers to the value.
For instance, y above refers to 4, not square(2).
The difference between val and def becomes apparent when the
right hand side does not terminate.
Given
def loop: Boolean = loop
A definition
def x = loop
is OK, but a definition
val x = loop
will lead to an infinite loop.
Boolean expressions b can be composed of
true false // Constants
!b // Negation
b && b // Conjunction
b || b // Disjunction
and of the usual comparison operations:
e <= e, e >= e, e < e, e > e, e == e, e != e
Here are reduction rules for Boolean expressions (e is an arbitrary
expression):
!true --> false
!false --> true
true && e --> e
false && e --> false
true || e --> true
false || e --> e
Note that && and || do not always need their right operand to be
evaluated.
We say, these expressions use “short-circuit evaluation”.
To express choosing between two alternatives, Scala has a
conditional expression if-else.
It looks like a if-else in Java, but is used for expressions, not
statements.
Example:
def abs(x: Int) = if (x >= 0) x else -x
x >= 0 is a predicate, of type Boolean.
Here are reduction rules for conditional expressions (e1 and e2 are arbitrary expressions, b is boolean expression) if (b) e1 else e2:
if (true) e1 else e2 --> e1
if (false) e1 else e2 --> e2
Login in to like
Login in to comment