aprendiendo ( Erlang ).

miércoles, 25 de mayo de 2011

Sentencias de control. If y Case

| 0 comentarios |

Aunque según un paradigma funcional puro no es muy ortodoxo, puede ser práctico el uso de las sentencias case e if.

If

La sintaxis de una sentencia if viene dada por la siguiente expresión:
  if
  Condición1 ->
    secuencia de comando 1;
  ...
  CondiciónN ->
    secuencia de comandos N
  end
El if es evaluado de un modo poco tradicional. Primero se evalúa la primera condición y si es cierta a continuación evalúa las expresiones o comandos correspondientes a la condición 1. Si la primera condición no es cierta evalúa la siguiente condición y así sucesivamente hasta que una de como resultado true.
Pero... ¿Dónde esta el else? no existe como tal. Normalmente se pone una última condición con el átomo true indicando así, que si no es cierta ninguna condición previa la ejecute. Veamos un ejemplo:
comparar ( X, Y ) ->
    if 
        X > Y ->
            mayor;
        X =:= Y ->
            igual;
        true ->
            menor
    end.
El código requiere de poca explicación pero nos permite ver un uso estandarizado del else, en este caso la ultima condición, y además permite comprobar un uso interesante de la sentencia if. Este uso es el hecho, de que no sólo nos permite ejecutar una secuencia de comando dependiendo de las condiciones sino que nos permite devolver un valor.
1> c(ifcase).     
{ok,ifcase}
2> ifcase:comparar(10,2).
mayor
3> ifcase:comparar(1,2).  
menor
4> ifcase:comparar(2,2).
igual
5> X = ifcase:comparar(1,2).
menor
6> X.
menor
Podemos comprobar que nuestra función comparar/2 nos devuelve un átomo dependiendo de los valores pasados y es más, lo podemos guardar en una variable para futuros usos.

Case

La sintaxis de una sentencia Case viene dada por la siguiente expresión:
  case expresión of
    patrón1 [when Guarda1] -> secuencia de comandos1;
    ...
    patrónN [when GuardaN] -> secuencia de comandosN;
  end
La sentencia case evalúa la expresión y comprueba la coincidencia con el patrón1 (condicionado a una guarda) y si se produce la coincidencia ejecuta la secuencia de comandos correspondiente y en el caso de que no exista coincidencia pasa al siguiente patrón.
Del mismo modo en el que la sentencia if nos permite devolver un valor dado el case también nos da esta posibilidad.
Veamos un ejemplo de uso.
divide ( X, Y ) ->
    case comparar(X,Y) of 
        mayor when Y /= 0 ->
            X / Y;
        menor when X /= 0 ->
            Y / X;
        igual when X /= 0 ->
            1;
        _ ->
            infinito
    end.
La función divide/2 implementada divide el mayor de dos número por el menor, comprobando que en ningún caso el menor de los dos número sea 0.
Igual que el if tiene una manera de implementar un else, el case tiene una forma de implementarlo también y es mediante un me da igual, es decir, _. Esto nos permite tener un patrón en el cual sabemos que entrará siempre que no existan coincidencia con algunos de los patrones anteriores.
7> c(ifcase).            
{ok,ifcase}
8> ifcase:divide(2,4).
2.0
9> ifcase:divide(4,2).
2.0
10> ifcase:divide(2,2).
1
11> ifcase:divide(2,0).
infinito

Publicar un comentario

0 comentarios:

 
Licencia Creative Commons
Aprendiendo Erlang por Verdi se encuentra bajo una Licencia Creative Commons Atribución-NoComercial-CompartirIgual 3.0 Unported.