Pattern Matching et Smart Casts
trait Expr
class Number(val value: Int): Expr
class Sum(val left: Expr, val right: Expr): Expr
class Mult(val left: Expr, val right: Expr): Expr
fun eval(e: Expr): Int = when(e) {
is Number -> e.value
is Sum -> eval(e.left) + eval(e.right)
is Mult -> eval(e.left) * eval(e.right)
else -> throw IllegalArgumentException("Can't eval $e")
}