enrique-j
6/21/2018 - 5:39 PM

Reemplazando If por When

/*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))))
}