domingo, 25 de diciembre de 2022

Comparación de la concurrencia de Erlang y Go (en Inglés)

Go tiene un sistema de concurrencia inspirado en el artículo Comunicando Procesos Secuenciales de CAR Hoare. El sistema de concurrencia de Erlang tiene más en común con el modelo Actor de Carl Hewitt. Vamos a explorar brevemente los artículos académicos que forman la base de estos dos lenguajes, y luego compararemos y contrastaremos las primitivas de concurrencia entre Erlang y Go usando demostraciones en vivo y código de muestra.

sábado, 24 de diciembre de 2022

Erlang en ejemplos (4)

 En esta serie de post sobre Erlang se ha visto los tipos de datos, listas, tuplas, funciones y demás ejemplos del lenguaje.

Seguimos con esta serie.

Para obtener información del compilador/emulador de Erlang tecleamos:

man erl

Abrimos una terminal y comenzamos a realizar algunas pruebas:

erl
Erlang/OTP 25 [erts-13.0.4] [source] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:1] [jit:ns]

Eshell V13.0.4  (abort with ^G)
1> A="abc".
"abc"
2> string:to_upper(A).
"ABC"
3> B="ABC".
"ABC"
4> string:to_lower(B).
"abc"
5> erlang:is_number(B).
false
6> erlang:is_number(A).
false
7> erlang:is_number(66).
true
8> erlang:is_binary(A). 
false
9> erlang:is_binary(54).
false
10> erlang:is_port(54).  
false
11> erlang:is_port(8080).
false
12> erlang:is_list(B).   
true
13> erlang:is_tuple(B).
false
14> Suma = fun(X,Y)-> X+Y end.
#Fun<erl_eval.41.3316493>
15> Suma(43,32).
75
16> MiSuma= Suma(8,5).
13
17> elang:is_function(Suma).
** exception error: undefined function elang:is_function/1
18> erlang:is_function(Suma).
true
19> 45 + "32".
** exception error: an error occurred when evaluating an arithmetic expression
     in operator  +/2
        called as 45 + "32"
20> 23*43/(21+32+43+44)-45.
-37.93571428571428
21> 89+(32*4/32).
93.0
22> 33=33.
33
23> 12=9.
** exception error: no match of right hand side value 9
24> N=43.
43
25> N+43.
86
26> (N+43)/2.
43.0
27> erlang:is_list(N).
false
28> erlang:is_number(N).
true
29> erlang:is_integer(N).
true
30> erlang:is_float(N).  
false
31> Lista=[1,2,3,4,5].
[1,2,3,4,5]
32> erlang:is_list(Lista). 
true
33> erlang:is_tuple(Lista).
false
34> Division= fun(X,Y)-> X div Y end.
#Fun<erl_eval.41.3316493>
35> Division(23,32).
0
36> erlang:is_integer(Division(8,3)).
true
37> Residuo=fun(X,Y)-> X rem Y end. 
#Fun<erl_eval.41.3316493>
38> Resisuo(220,200).
* 1:1: variable 'Resisuo' is unbound
39> Residuo(220,200).
20
40> erlang:is_number(Residuo(220,200)).
true
41> Perfil={1,"Fernando"}.
{1,"Fernando"}
42> erlang:is_tuple(Perfil).
true
43> Message = {"MX",true,345,Perfil}.
{"MX",true,345,{1,"Fernando"}}
44> {Id,Name}=Perfil.
{1,"Fernando"}
45> Id.
1
46> Name.
"Fernando"
47> {Code,Available,Numer,User}=Message.
{"MX",true,345,{1,"Fernando"}}
48> Code.
"MX"
49> Available.
true
50> Numer.
345
51> User.
{1,"Fernando"}
52> {_,MyName}=Perfil.
{1,"Fernando"}
53> MyName.
"Fernando"
54>q(). 

Como se puede observar Erlang tiene ciertas particularidades y funciones propias para realizar cosas como tratamiento de cadenas, verificar si una variable es de determinado tipo (integer, float, etc.), si alguna declaración es una lista, una tupla, una función. Así como declarar funciones, crear tuplas, etc.

Algunas funciones de Erlang

 Función  Uso
 is_atom/2 Verificar si es atom
 is_binary/2  Verificar si es binary
 is_bitstring/1  Verificar si es bitstring
 is_boolean/1  Verificar si es boolean
 is_float/1  Verificar si es float
 is_function/1  Verificar si es function
 is_port/1  Verificar si es port
 is_integer/1  Verificar si es integer
 is_number/1  Verificar si es number
 is_record/1  Verificar si es record
 is_tuple/1  Verificar si es tuple

Cosas importantes para no olvidar

Obtener informacíon del módulo.

$ erl
> c(programa).
> programa:module_info().

Con esto se mostrará la información del módulo

Documentación, exportación e importación de módulos/funciones. Definición de constantes y macros.

%% @doc Fundamentos en Erlang
%% @copyright Codemonkey Junior 2022
-module(fundamentos).
-author("Codemonkey Junior").
-version("1.0.0").
-export([start/0]).
-import(io, [fwrite/1]).
-compile(export_all). % Para exportar todas las funciones
-compile(nowarn_export_all). % Para exportar todas las funciones sin warnings
-define(MAX, 1000). %% constante
-define(CUADRADO (X), X*X). %% macro, similar a C

Continuaremos en próximos post.

https://codemonkeyjunior.blogspot.com/2021/12/erlang-constuir-aplicaciones-erlang-con.html