/*Primer ejemplo */
package `when`
// 3 * 4 * 2 + 2 +4
interface Expresion
class Numero(val valor: Int):Expresion //implementacion de la interface
class Sumar(val valorA: Expresion, val valorB: Expresion): Expresion
class Mul(val valorA: Expresion, val valorB: Expresion): Expresion
/* con el "=" convierte la funcion en una expresion body*/
fun evalExpresion(expresion: Expresion):Int = if(expresion is Numero){
expresion.valor
}else if(expresion is Sumar){
evalExpresion(expresion.valorA) + evalExpresion(expresion.valorB)
}else if(expresion is Mul){
evalExpresion(expresion.valorA) * evalExpresion(expresion.valorB)
}else{
throw IllegalArgumentException("No se puede reconocer la operacion")
}
fun main(args: Array<String>){
println(evalExpresion(Sumar(Sumar(Mul(Mul(Numero(3),Numero(4)), Numero(2)), Numero(2)),Numero(4))))
}
/**Segundo ejemplo**/
package `when`
// 3 * 4 * 2 + 2 +4
interface Expresion
class Numero(val valor: Int):Expresion //implementacion de la interface
class Sumar(val valorA: Expresion, val valorB: Expresion): Expresion
class Mul(val valorA: Expresion, val valorB: Expresion): Expresion
/* con el "=" convierte la funcion en una expresion body*/
fun evalExpresion(expresion: Expresion):Int = when(expresion){
is Numero -> expresion.valor
is Sumar -> evalExpresion(expresion.valorA) + evalExpresion(expresion.valorB)
is Mul -> evalExpresion(expresion.valorA) * evalExpresion(expresion.valorB)
else ->
throw IllegalArgumentException("No se puede reconocer la operacion")
}
fun main(args: Array<String>){
println(evalExpresion(Sumar(Sumar(Mul(Mul(Numero(3),Numero(4)), Numero(2)), Numero(2)),Numero(4))))
}