aprendiendo ( Erlang ).

martes, 1 de marzo de 2011

Tipos básicos

| 0 comentarios |

Vamos realizar una pequeña incursión en los tipos de datos Erlang. Los iré enumerando y explicando por encima por que la mayoría de ellos tienen entidad para dedicarles un apartado, o más de uno.

Variables

Aunque no es un tipo hay que decir, para que quede claro que las variables empiezan por mayúsculas o subrayado. No se le indica el tipo, sino que el compilador lo infiere en tiempo de ejecución. La declaración que da fijada en la asignación (p.e. A = 2.). También hay que decir que son de asignación única.
Erlang R13B03 (erts-5.7.4) [source] [64-bit] [rq:1] [async-threads:0] [hipe] [kernel-poll:false]

Eshell V5.7.4  (abort with ^G)
1> A = 2.
2
2> A.  
2
3> A = 4.
** exception error: no match of right hand side value 4
4> A.
2
5> 


Numéricos

Existen dos tipos numéricos, enteros y flotantes con la notación que todos conocemos. Y además dos tipos más específicos de Erlang.
  • $char: que se corresponde con el valor ASCII del carácter.
  • base#valor: que son enteros en una base concreta. La base puede estar comprendida entre 2 y 36.
Ejemplos de uso:
Erlang R13B03 (erts-5.7.4) [source] [64-bit] [rq:1] [async-threads:0] [hipe] [kernel-poll:false]

Eshell V5.7.4  (abort with ^G)
1> $h.
104
2> 2#101.
5
3> 

Átomos

Un átomo es un literal constante. El cual puede ir entre comillas simples (aunque este no es su uso habitual). El átomo debe empezar por minúsculas o comilla simple y puede tener cualquier carácter alfanumérico, subrayado y/o arroba.
Ejemplos de uso:
Erlang R13B03 (erts-5.7.4) [source] [64-bit] [rq:1] [async-threads:0] [hipe] [kernel-poll:false]

Eshell V5.7.4  (abort with ^G)
1> hola.
hola
2> pp@pp.   
pp@pp
3> hola_mundo.
hola_mundo
4> 

Cadenas de bits y datos binarios

Bueno, hay veces que no queda más remedio que trabajar a nivel de bit's o bytes, Erlang tiene una manera muy potente de trabajar con estos datos. Profundizaremos más adelante en este tipo, pero quede como ejemplo lo siguiente:
Erlang R13B03 (erts-5.7.4) [source] [64-bit] [rq:1] [async-threads:0] [hipe] [kernel-poll:false]

Eshell V5.7.4  (abort with ^G)
1> <<24,26>>.
<<24,26>>
2> 

Referencia

Una referencia es un término el cual Erlang nos asegura que es único en el sistema en ejecución. Se crean con el comando make_ref/0 del módulo Erlang.
Ejemplo:
Erlang R13B03 (erts-5.7.4) [source] [64-bit] [rq:1] [async-threads:0] [hipe] [kernel-poll:false]

Eshell V5.7.4  (abort with ^G)
1> erlang:make_ref().
#Ref<0.0.0.172>
2>

Fun

Se trata de funciones anónimas, o como se llaman en otros lenguajes funciones lambda. Una fun tiene asociada una referencia como veremos en el ejemplo.
Ejemplo de uso:
Erlang R13B03 (erts-5.7.4) [source] [64-bit] [rq:1] [async-threads:0] [hipe] [kernel-poll:false]

Eshell V5.7.4  (abort with ^G)
1> FunDoble = fun(X) -> 2*X end.
#Fun<erl_eval.6.13229925>
2> FunDoble (2).
4
3> 

Puertos

Es un identificador de puerto Erlang. Como este tipo da para un post completo lo introduciremos en profundidad más adelante. Se trata de lo que todos tenemos en mente.

PID

El tipo PID son lo identificadores de procesos. Cuando trabajemos con programación concurrente haremos un uso intensivo de ellos. Estos tipos se crean con las funciones spawn/1,2,3,4, spawn_link/1,2,3,4 y spawn_opt/4.
La función self() retorna el PID del proceso actual. El PID de la consola es:
Erlang R13B03 (erts-5.7.4) [source] [64-bit] [rq:1] [async-threads:0] [hipe] [kernel-poll:false]

Eshell V5.7.4  (abort with ^G)
1> self().
<0.35.0>
2> 

Tuplas

Se trata de un grupo de elementos o términos fijos y tiene la siguiente sintaxis; {Term1,...,TermN}. Esta tupla tiene tamaño N.
Ejemplo de uso:
Erlang R13B03 (erts-5.7.4) [source] [64-bit] [rq:1] [async-threads:0] [hipe] [kernel-poll:false]

Eshell V5.7.4  (abort with ^G)
1> Persona = {pedro, 32, {23,agosto,1993}}.
{pedro,32,{23,agosto,1993}}
2> element(1,Persona).
pedro
3> element(3,Persona).
{23,agosto,1993}
4> tuple_size(Persona).
3
5> 

Lista

Se trata de un conjunto variable de términos. La sintaxis es similar a la tupla pero cambiando llaves por corchetes [Term1,...,TermN]
Una lista vacía se representa con []. Todas las listas salvo la lista vacía tiene una cabeza o head (primer elemento) y una cola o tail (resto de elementos) se suele denotar con [H|T]. Donde H es igual a Term1 y T es una lista con [Term2,...,TermN]. Si la lista sólo tiene un elemento la cola será la lista vacía.
Ejemplo de uso:
Erlang R13B03 (erts-5.7.4) [source] [64-bit] [rq:1] [async-threads:0] [hipe] [kernel-poll:false]

Eshell V5.7.4  (abort with ^G)
1> Lista = [a, 2, c, {"hola", 4}].
[a,2,c,{"hola",4}]
2> [H|T] = Lista.
[a,2,c,{"hola",4}]
3> H.
a
4> T.
[2,c,{"hola",4}]
5> length(Lista).
4
6> length(T).
3
7> length([]).
0
8> 

Cadenas

Las cadenas, se usan con comillas dobles, no son un tipo propio de Erlang. Se trata de una lista de caracteres. En el ejemplo de a continuación lo podemos ver claramente.
Erlang R13B03 (erts-5.7.4) [source] [64-bit] [rq:1] [async-threads:0] [hipe] [kernel-poll:false]

Eshell V5.7.4  (abort with ^G)
1> "hello".
"hello"
2> [H|T] ="hello".
"hello"
3> H.
104
4> T.
"ello"
5> [$h,$e,$l,$l,$o].
"hello"
6> [104,101,108,108,111].
"hello"
7>

Registros

Se trata de una estructura para almacenar un número fijo de elementos. Lo elementos son llamados de forma similar a las struct's de C. Se definen con la clausula -record por ejemplo en un módulo.

-module(registro).

-export([new/3]).
-record(persona, {apellidos, nombre, edad}).

new(Apellidos, Nombre, Edad) ->
    #persona{apellidos=Apellidos, nombre=Nombre, edad=Edad}.

Un registro no se trata de un tipo real sino de azúcar sintáctica. Una vez compilado se traduce a una tupla en la que el primer elemento es un átomo con el nombre del registro.

Booleanos

Existen unos átomos que denotan true y false.

Publicar un comentario en la entrada

0 comentarios:

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