aprendiendo ( Erlang ).

martes, 5 de abril de 2011

Macros II. Flujos de control.

| 0 comentarios |

Nos permite realizar definiciones de macros selectivas. Las directivas de flujo de control en las macros son:
  • -undef(nombreMacro) borra una macro definida previamente. Después de esta sentencia ya no se puede volver a utilizar la macro.
  • -ifdef(nombreMacro) si esta definida la macro evalúa las siguientes definiciones de macros.
  • -ifndef(nombreMacro) si no esta definida una macro evalúa las siguientes definiciones de macros.
  • -else en el caso contrario de las directivas ifdef y ifndef se evalúan otro bloque de definiciones de macros.
  • -endif concluye en flujo de control de definición de macros.
Su uso es como el de una sentencia if...[else]...endif normal. Siguiendo con nuestro ejemplo sobre macros veamos un ejemplo de control del flujo en macros:
-module(macros).
-export([version/0,doble/1,doble_lista/1]).
-define(VERSION, "1.2.4").
-define(MULTIPLICADOR(X,Y), X*Y).
-ifdef(debug).
-define(LOG(X), io:format("LOG ~p (~p) linea ~p: ~p~n" ,[?MODULE, ?VERSION, ?LINE, X])).
-else.
-define(LOG(X), void).
-endif.


version() ->
    io:format(?VERSION).

doble(X) ->
    ?MULTIPLICADOR(X,X).

doble_lista([]) ->
    ?LOG("Caso base"),
    [];
doble_lista([H|T]) ->
    ?LOG(H),
    [doble(H) | doble_lista(T)].
En el ejemplo vamos a definir un LOG rudimentario que nos permitirá depurar nuestro código. Si esta definido el modo de debug entonces imprimirá por pantalla un mensaje y en caso contrario no hará nada void. El átomo void nos permite crear cuerpos de funciones vacías.
1> c(macros).
{ok,macros}
2> macros:doble_lista([1,2,3,4,8]).
[1,4,9,16,64]
3> c(macros, {d, debug}).
{ok,macros}
4> macros:doble_lista([1,2,3,4,8]).
LOG macros ("1.2.4") linea 29: 1
LOG macros ("1.2.4") linea 29: 2
LOG macros ("1.2.4") linea 29: 3
LOG macros ("1.2.4") linea 29: 4
LOG macros ("1.2.4") linea 29: 8
LOG macros ("1.2.4") linea 26: "Caso base"
[1,4,9,16,64]
En la primera compilación (línea 1) no se ha establecido el modo de depuración por lo que no vemos nuestro log funcionando. Ha entrado en else del flujo de control. En la línea 2, establecemos el flag en modo depuración y podemos ver como se muestran los mensajes que esperábamos.

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.