Translate

sábado, 9 de marzo de 2024

Asignaciones en Gleam


import gleam/io


pub fn main() {

  let x = "Original"

  io.debug(x)


  // Assign `y` to the value of `x`

  let y = x

  io.debug(y)


  // Assign `x` to a new value

  let x = "New"

  io.debug(x)


  // The `y` still refers to the original value

  io.debug(y)

}


Se puede asignar un valor a una variable usando let.

Los nombres de las variables se pueden reutilizar mediante enlaces let posteriores, pero los valores a los que hacen referencia son inmutables, por lo que los valores en sí no se modifican ni mutan de ninguna manera.

viernes, 8 de marzo de 2024

Un ejemplo utilizando STL de C++


Voy hacer unos post con ejemplos de utilización de la Stl de C++. Vamos con el primero: 

Leamos una cantidad arbitraria de valores enteros (n>=1) del archivo “numbers.txt” y mostramos:

  • Mínimo, máximo
  • Media
  • Promedio
  • Media geométrica ((y1 * y2 * … yn)^(1/n))

Con Stl sería así: 

vector<int> v;

copy(istream_iterator<int>(ifstream("numbers.txt")), istream_iterator<int>(), back_inserter(v));

sort(v.begin(), v.end());

cout << "min/max: " << v.front() << " " << v.back() << endl;

cout << "median : " << *(v.begin() + (v.size()/2)) << endl;

cout << "average: " << accumulate(v.begin(), v.end(), 0.0) / v.size() << endl;

cout << "geomean: " << pow(accumulate(v.begin(),v.end(),1.0,multiplies<double>()), 1.0/v.size()) 

<< endl;

Y listo!

miércoles, 6 de marzo de 2024

Strings en Gleam



import gleam/io

import gleam/string


pub fn main() {

  // String literals

  io.debug("👩‍💻 こんにちは Gleam 🏳️‍🌈")

  io.debug(

    "multi

    line

    string",

  )

  io.debug("\u{1F600}")


  // Double quote can be escaped

  io.println("\"X\" marks the spot")


  // String concatenation

  io.debug("One " <> "Two")


  // String functions

  io.debug(string.reverse("1 2 3 4 5"))

  io.debug(string.append("abc", "def"))

}


En Gleam, las cadenas se escriben como texto entre comillas dobles, pueden abarcar varias líneas y contener caracteres Unicode.

El operador <> se puede utilizar para concatenar cadenas.

Se admiten varias secuencias de escape:

\" - comillas dobles
\\ - barra invertida
\f - avance de formulario
\n - nueva línea
\r - retorno de carro
\t - pestaña
\u{xxxxxx} - punto de código Unicode

El módulo de biblioteca estándar gleam/string contiene funciones para trabajar con cadenas.

Primera API con Go-zero


Después de completar la instalación de goctl, podemos crear un servicio HTTP mínimo para obtener una descripción general del servicio API go-zero de goctl.


# Create workspaces and enter the directory

$ mkdir -p ~/workspace/api && cd ~/workspace/api

# Execute instructions generated demo service

$ goctl api new demo

Done.


Después de ejecutar la instrucción, se generará un directorio de demostración en el directorio actual que contiene un servicio HTTP minimizado, verificaremos la estructura del directorio del servicio.


$ cd ~/workspace/api/demo

$ ls

demo.api demo.go  etc      go.mod   internal

$ tree

.

├── demo.api

├── demo.go

├── etc

│   └── demo-api.yaml

├── go.mod

└── internal

    ├── config

    │   └── config.go

    ├── handler

    │   ├── demohandler.go

    │   └── routes.go

    ├── logic

    │   └── demologic.go

    ├── svc

    │   └── servicecontext.go

    └── types

        └── types.go


Después de completar la generación del código anterior, podemos encontrar los archivos ~/workspace/api/demo/internal/logic/demologic.go, y podemos completar el códigos entre las líneas 27 y 28:

resp = new(types.Response)

resp.Message = req.Name


Después de escribir el código anterior, podemos iniciar el servicio con las siguientes instrucciones:


# Enter service directory

$ cd ~/workspace/api/demo

# to organize dependencies

$ go mod tidy

# Run go program

$ go run demo.go


Cuando vea el siguiente resultado "Starting server at 0.0.0.0.0:888.." indica que el servicio se ha iniciado correctamente, entonces visitamos el servicio HTTP.


$ curl --request GET 'http://127.0.0.0.1:8888/from/me'


Cuando vea el resultado en la terminal {"message":"me"} en nombre de su servicio se inició con éxito.


Y listo!!

Dejo link: https://go-zero.dev/en/docs/tasks/cli/api-demo


Bools en Gleam



import gleam/io

import gleam/bool


pub fn main() {

  // Bool operators

  io.debug(True && False)

  io.debug(True && True)

  io.debug(False || False)

  io.debug(False || True)


  // Bool functions

  io.debug(bool.to_string(True))

  io.debug(bool.to_int(False))

}


Un Bool es Verdadero o Falso.

El ||, &&, y ! Los operadores se pueden utilizar para manipular bools.

El || y los operadores && están en cortocircuito, lo que significa que si el lado izquierdo del operador es Verdadero para || o False para && entonces no se evaluará el lado derecho del operador.

El módulo de biblioteca estándar gleam/bool contiene funciones para trabajar con bools.

Ponte al día con la IA generativa

 Me llego este mail de la gente de google y quería compartirlo: 


martes, 5 de marzo de 2024

Igualdad en Gleam

 



import gleam/io


pub fn main() {

  io.debug(100 == 100)

  io.debug(1.5 != 0.1)

}


Gleam tiene los operadores == y != para verificar la igualdad.

Los operadores se pueden utilizar con valores de cualquier tipo, pero ambos lados del operador deben ser del mismo tipo.

La igualdad se verifica estructuralmente, lo que significa que dos valores son iguales si tienen la misma estructura y no si están en la misma ubicación de memoria.

lunes, 4 de marzo de 2024

Formatos de números en Gleam


import gleam/io


pub fn main() {

  // Underscores

  io.debug(1_000_000)

  io.debug(10_000.01)


  // Binary, octal, and hex Int literals

  io.debug(0b00001111)

  io.debug(0o17)

  io.debug(0xF)


  // Scientific notation Float literals

  io.debug(7.0e7)

  io.debug(3.0e-4)

}

Se pueden agregar guiones bajos a los números para mayor claridad. Por ejemplo, 1000000 puede ser complicado de leer rápidamente, mientras que 1_000_000 puede ser más fácil.

Los enteros se pueden escribir en formatos binario, octal o hexadecimal utilizando los prefijos 0b, 0o y 0x respectivamente.

Los flotantes se pueden escribir en notación científica.

El tipo Float de Gleam

 


import gleam/io

import gleam/float


pub fn main() {

  // Float arithmetic

  io.debug(1.0 +. 1.5)

  io.debug(5.0 -. 1.5)

  io.debug(5.0 /. 2.5)

  io.debug(3.0 *. 3.5)


  // Float comparisons

  io.debug(2.2 >. 1.3)

  io.debug(2.2 <. 1.3)

  io.debug(2.2 >=. 1.3)

  io.debug(2.2 <=. 1.3)


  // Equality works for any type

  io.debug(1.1 == 1.1)

  io.debug(2.1 == 1.2)


  // Division by zero is not an error

  io.debug(3.14 /. 0.0)


  // Standard library float functions

  io.debug(float.max(2.0, 9.5))

  io.debug(float.ceiling(5.4))

}


El tipo Float de Gleam representa números que no son enteros.

Los operadores numéricos de Gleam no están sobrecargados, por lo que existen operadores dedicados para trabajar con flotantes.

Los flotantes se representan como números de punto flotante de 64 bits tanto en Erlang como de JavaScript. El comportamiento del punto flotante es nativo de sus respectivos runtimes, por lo que su comportamiento exacto será ligeramente diferente en los dos runtimes.

En JavaScript, exceder el valor máximo (o mínimo) representable para un valor de punto flotante dará como resultado Infinity (o -Infinity). Si intentas dividir dos infinitos, obtendrás NaN como resultado.

Cuando se ejecuta en BEAM, cualquier desbordamiento generará un error. Por lo tanto, no hay ningún valor flotante NaN o Infinity en el tiempo de ejecución de Erlang.

La división por cero no se desbordará, sino que se define como cero.

El módulo de biblioteca estándar gleam/float contiene funciones para trabajar con flotantes.


Manipular datos binarios con Erlang


La mayoría de los lenguajes admiten la manipulación de datos como números, átomos, tuplas, listas, registros y/o estructuras, etc. La mayoría de ellos también solo tienen funciones muy básicas para manipular datos binarios. Erlang hace todo lo posible para proporcionar abstracciones útiles cuando se trata de valores binarios con coincidencia de patrones llevada al siguiente nivel. Hace que tratar con datos binarios sin procesar sea divertido y fácil, lo cual era necesario para las aplicaciones de telecomunicaciones para las que fue creado. La manipulación de bits tiene una sintaxis y modismos únicos que pueden parecer un poco extraños al principio, pero si sabes cómo funcionan generalmente los bits y los bytes, esto debería tener sentido. 

La sintaxis de bits encierra datos binarios entre << y >>, los divide en segmentos legibles y cada segmento está separado por una coma. Un segmento es una secuencia de bits de un binario (no necesariamente en un límite de bytes, aunque este es el comportamiento predeterminado). Digamos que queremos almacenar un píxel naranja (24 bits). Si alguna vez comprobó los colores en Photoshop o en una hoja de estilos CSS para la web, sabrá que la notación hexadecimal tiene el formato #RRGGBB. Un tinte naranja es #F09A29 en esa notación, que podría ampliarse en Erlang a:


1> Color = 16#F09A29.

15768105

2> Pixel = <<Color:24>>.

<<240,154,41>>


Básicamente dice "Coloque los valores binarios de #F09A29 en 24 bits (rojo en 8 bits, verde en 8 bits y azul también en 8 bits) en la variable Píxel". Posteriormente se puede tomar el valor para escribirlo en un archivo. Esto no parece mucho, pero una vez escrito en un archivo, lo que obtendría al abrirlo en un editor de texto sería un montón de caracteres ilegibles. Cuando vuelva a leer el archivo, Erlang interpretará el binario en el bonito formato <<240,151,41>> nuevamente.

Lo que es más interesante es la capacidad de hacer coincidir patrones con archivos binarios para descomprimir contenido:


3> Pixels = <<213,45,132,64,76,32,76,0,0,234,32,15>>.

<<213,45,132,64,76,32,76,0,0,234,32,15>>

4> <<Pix1,Pix2,Pix3,Pix4>> = Pixels.

** exception error: no match of right hand side value <<213,45,132,64,76,32,76,

0,0,234,32,15>>

5> <<Pix1:24, Pix2:24, Pix3:24, Pix4:24>> = Pixels.

<<213,45,132,64,76,32,76,0,0,234,32,15>>


Lo que hicimos en el comando 3 fue declarar lo que serían exactamente 4 píxeles de colores RGB en binario.

En la expresión 4, intentamos descomprimir 4 valores del contenido binario. Lanza una excepción, porque tenemos más de 4 segmentos, ¡de hecho tenemos 12! Entonces, lo que hacemos es decirle a Erlang que cada variable del lado izquierdo contendrá 24 bits de datos. Eso es lo que significa Var:24. Luego podemos tomar el primer píxel y descomprimirlo en valores de un solo color:


6> <<R:8, G:8, B:8>> = <<Pix1:24>>.

<<213,45,132>>

7> R.

213


"Sí, eso es genial. ¿Y si solo quisiera el primer color desde el principio? ¿Tendré que descomprimir todos estos valores todo el tiempo?" ¡Ja! ¡No lo dudes! Erlang introduce más azúcar sintáctico y coincidencia de patrones para ayudarte con:


8> <<R:8, Rest/binary>> = Pixels.

<<213,45,132,64,76,32,76,0,0,234,32,15>>

9> R.

213


Bonito, ¿eh? Esto se debe a que Erlang acepta más de una forma de describir un segmento binario. Todos estos son válidos:


Value

Value:Size

Value/TypeSpecifierList

Value:Size/TypeSpecifierList


donde Tamaño representará bits o bytes (según el Tipo y Unidad a continuación) y TypeSpecifierList representa uno o más de los siguientes:

integer | float | binary | bytes | bitstring | bits | utf8 | utf16 | utf32

Esto representa el tipo de datos binarios utilizados. Tenga en cuenta que "bytes" es la abreviatura de "binario" y "bits" es la abreviatura de "cadena de bits". Cuando no se especifica ningún tipo, Erlang asume un tipo "entero".

Firma

Valores posibles: signed | unsigned

Solo importa para la coincidencia cuando el tipo es un número entero. El valor predeterminado es "sin firmar".

Endianidad

Valores posibles: big | little | native

La endianidad solo importa cuando el tipo es entero, utf16, utf32 o flotante. Esto tiene que ver con cómo el sistema lee los datos binarios. Como ejemplo, el formato de encabezado de imagen BMP mantiene el tamaño de su archivo como un número entero almacenado en 4 bytes. Para un archivo que tiene un tamaño de 72 bytes, un sistema little-endian lo representaría como <<72,0,0,0>> y uno big-endian como <<0,0,0,72>>. Uno se leerá como '72' mientras que el otro se leerá como '1207959552', así que asegúrese de utilizar el endianismo correcto. También existe la opción de usar 'nativo', que elegirá en tiempo de ejecución si la CPU usa little endianness o big endianness de forma nativa. De forma predeterminada, la endianidad está establecida en "grande".

Unidad

unidad unit:Integer

Este es el tamaño de cada segmento, en bits. El rango permitido es 1..256 y está establecido de forma predeterminada en 1 para números enteros, flotantes y cadenas de bits y en 8 para binarios. Los tipos utf8, utf16 y utf32 no requieren que se defina ninguna unidad. La multiplicación de Tamaño por Unidad es igual a la cantidad de bits que tomará el segmento y debe ser divisible por 8. El tamaño de la unidad generalmente se usa para garantizar la alineación de bytes.

TypeSpecifierList se construye separando los atributos por un '-'.


Algunos ejemplos pueden ayudar a digerir las definiciones:


10> <<X1/unsigned>> =  <<-44>>.

<<"Ô">>

11> X1.

212

12> <<X2/signed>> =  <<-44>>. 

<<"Ô">>

13> X2.

-44

14> <<X2/integer-signed-little>> =  <<-44>>.

<<"Ô">>

15> X2.

-44

16> <<N:8/unit:1>> = <<72>>.

<<"H">>

17> N.

72

18> <<N/integer>> = <<72>>.

<<"H">>

19> <<Y:4/little-unit:8>> = <<72,0,0,0>>.     

<<72,0,0,0>>

20> Y.

72


Puede ver que hay más de una forma de leer, almacenar e interpretar datos binarios. Esto es un poco confuso, pero aún así es mucho más sencillo que utilizar las herramientas habituales que ofrecen la mayoría de los lenguajes.

Las operaciones binarias estándar (desplazamiento de bits a izquierda y derecha, 'y' binario, 'o', 'xor' o 'no') también existen en Erlang. Simplemente use las funciones bsl (Bit Shift Left), bsr (Bit Shift Right), band, bor, bxor y bnot.


2#00100 = 2#00010 bsl 1.

2#00001 = 2#00010 bsr 1.

2#10101 = 2#10001 bor 2#00101.


Con ese tipo de notación y la sintaxis de bits en general, el análisis y la coincidencia de patrones de datos binarios es pan comido. Se podrían analizar segmentos TCP con un código como este:

<<SourcePort:16, DestinationPort:16,
AckNumber:32,
DataOffset:4, _Reserved:4, Flags:8, WindowSize:16,
CheckSum: 16, UrgentPointer:16,
Payload/binary>> = SomeBinary.

La misma lógica se puede aplicar a cualquier cosa binaria: codificación de vídeo, imágenes, otras implementaciones de protocolos, etc.

Erlang es lento en comparación con lenguajes como C o C++. A menos que seas una persona paciente, sería una mala idea hacer cosas como convertir vídeos o imágenes con él, aunque la sintaxis binaria lo hace extremadamente interesante, como insinué anteriormente. Erlang simplemente no es tan bueno para hacer cálculos numéricos intensos.

Tenga en cuenta, sin embargo, que Erlang sigue siendo muy rápido para aplicaciones que no requieren cálculos numéricos: reaccionar a eventos, pasar mensajes (con la ayuda de átomos que son extremadamente livianos), etc. Puede manejar eventos en cuestión de milisegundos y como Este es un gran candidato para aplicaciones suaves en tiempo real.

Hay un aspecto completamente diferente en la notación binaria: las cadenas de bits. Las cadenas binarias están atornilladas encima del lenguaje de la misma manera que con las listas, pero son mucho más eficientes en términos de espacio. Esto se debe a que las listas normales son listas enlazadas (1 'nodo' por letra), mientras que las cadenas de bits se parecen más a matrices C. Las cadenas de bits utilizan la sintaxis <<"¡esta es una cadena de bits!">>. La desventaja de las cadenas binarias en comparación con las listas es la pérdida de simplicidad cuando se trata de coincidencia y manipulación de patrones. En consecuencia, la gente tiende a utilizar cadenas binarias cuando almacenan texto que no será manipulado demasiado o cuando la eficiencia del espacio es un problema real.

Nota: Aunque las cadenas de bits son bastante ligeras, debes evitar usarlas para etiquetar valores. Podría resultar tentador utilizar cadenas literales para decir {<<"temperatura">>,50}, pero siempre utilice átomos al hacerlo. Anteriormente, se decía que los átomos ocupaban sólo 4 u 8 bytes en el espacio, sin importar su longitud. Al usarlos, básicamente no tendrá gastos generales al copiar datos de una función a otra o enviarlos a otro nodo Erlang en otro servidor.
Por el contrario, no utilice átomos para reemplazar cadenas porque son más ligeras. Las cadenas se pueden manipular (división, expresiones regulares, etc.), mientras que los átomos sólo se pueden comparar y nada más.

sábado, 2 de marzo de 2024

El tipo Int de Gleam


import gleam/io

import gleam/int


pub fn main() {

  // Int arithmetic

  io.debug(1 + 1)

  io.debug(5 - 1)

  io.debug(5 / 2)

  io.debug(3 * 3)

  io.debug(5 % 2)


  // Int comparisons

  io.debug(2 > 1)

  io.debug(2 < 1)

  io.debug(2 >= 1)

  io.debug(2 <= 1)


  // Equality works for any type

  io.debug(1 == 1)

  io.debug(2 == 1)


  // Standard library int functions

  io.debug(int.max(42, 77))

  io.debug(int.clamp(5, 10, 20))

}

El tipo Int de Gleam representa números enteros.

Existen operadores aritméticos y de comparación para enteros, así como el operador de igualdad que funciona en todos los tipos.

Cuando se ejecuta en la máquina virtual Erlang, los ints no tienen un tamaño máximo ni mínimo. Cuando se ejecuta en JavaScript, los ints se representan utilizando números de punto flotante de 64 bits de JavaScript,

El módulo de biblioteca estándar gleam/int contiene funciones para trabajar con ints.

viernes, 1 de marzo de 2024

Sistema de tipo en Gleam


 import gleam/io


pub fn main() {

  io.println("My lucky number is:")

  // io.println(4)

}



Gleam tiene un robusto sistema de tipos estáticos que ayuda a escribir y editar código, detectando errores y mostrándole dónde realizar cambios.

Si descomentamos la línea io.println(4), Gleam lanza el siguiente error:


error: Type mismatch

  ┌─ /src/main.gleam:5:14

  │

5 │   io.println(4)

  │              ^


Expected type:


    String


Found type:


    Int


Para corregir el código, podemos cambiar  io.println por io.debug, ya que esta función imprime un valor de cualquier tipo.

import gleam/io


pub fn main() {

  io.println("My lucky number is:")

  io.debug(4)

}


Gleam no tiene nulos, ni conversiones implícitas, ni excepciones, y siempre realiza una verificación de tipo completa. Si el código se compila, puede estar razonablemente seguro de que no tendrá inconsistencias que puedan causar errores o fallas.

jueves, 29 de febrero de 2024

Listas por comprensión en Erlang


Las listas por comprensión son formas de crear o modificar listas. También hacen que los programas sean breves y fáciles de entender en comparación con otras formas de manipular listas. Se basa en la idea de notación de conjuntos; Si alguna vez has tomado clases de matemáticas con teoría de conjuntos o si alguna vez has estudiado notación matemática, probablemente sepas cómo funciona. La notación de conjuntos básicamente le dice cómo construir un conjunto especificando las propiedades que deben satisfacer sus miembros. La comprensión de las listas puede ser difícil de entender al principio, pero vale la pena el esfuerzo. 

Un ejemplo de notación de conjuntos sería {x ∈ ℜ x = x^2}. Esa notación de conjuntos le indica que los resultados que desea serán todos números reales iguales a su propio cuadrado. El resultado de ese conjunto sería {0,1}. Otro ejemplo de notación de conjuntos, más simple y abreviado sería {x : x > 0}. Aquí, lo que queremos son todos los números donde x > 0.

Las listas por comprensión en Erlang tratan de construir conjuntos a partir de otros conjuntos. Dado el conjunto {2n : n en L} donde L es la lista [1,2,3,4], la implementación de Erlang sería:

1> [2*N || N <- [1,2,3,4]].

[2,4,6,8]

Si comparamos la notación matemática con la de Erlang y no hay mucho que cambie: las llaves ({}) se convierten en corchetes ([]), los dos puntos (:) se convierten en dos barras verticales (||) y la palabra 'in' se convierte en la flecha. (<-). Sólo cambiamos símbolos y mantenemos la misma lógica. En el ejemplo anterior, cada valor de [1,2,3,4] coincide secuencialmente con el patrón N. La flecha actúa exactamente como el operador =, con la excepción de que no genera excepciones.

También puede agregar restricciones a la comprensión de una lista mediante operaciones que devuelvan valores booleanos. Si quisiéramos todos los números pares del uno al diez, podríamos escribir algo como:

2> [X || X <- [1,2,3,4,5,6,7,8,9,10], X rem 2 =:= 0].

[2,4,6,8,10]

Donde X rem 2 =:= 0 comprueba si un número es par. Las aplicaciones prácticas surgen cuando decidimos que queremos aplicar una función a cada elemento de una lista, obligándolo a respetar restricciones, etc. Como ejemplo, digamos que somos dueños de un restaurante. Un cliente entra, ve nuestro menú y pregunta si podría tener los precios de todos los artículos que cuestan entre $3 y $10 con los impuestos (digamos 7%) contados después.

3> RestaurantMenu = [{steak, 5.99}, {beer, 3.99}, {poutine, 3.50}, {kitten, 20.99}, {water, 0.00}].

[{steak,5.99},

{beer,3.99},

{poutine,3.5},

{kitten,20.99},

{water,0.0}]

4> [{Item, Price*1.07} || {Item, Price} <- RestaurantMenu, Price >= 3, Price =< 10].

[{steak,6.409300000000001},{beer,4.2693},{poutine,3.745}]


Por supuesto, los decimales no están redondeados de manera legible, pero entiendes el punto. Por lo tanto, la receta para la comprensión de listas en Erlang es NewList = [Expression || Patrón <- Lista, Condición1, Condición2, ... CondiciónN]. La parte Patrón <- Lista se denomina expresión Generadora. 


5> [X+Y || X <- [1,2], Y <- [2,3]].

[3,4,4,5]


Esto ejecuta las operaciones 1+2, 1+3, 2+2, 2+3. Entonces, si desea que la receta de comprensión de la lista sea más genérica, obtendrá: NewList = [Expression || GeneradorExp1, GeneradorExp2, ..., GeneradorExpN, Condición1, Condición2, ... CondiciónM]. Tenga en cuenta que las expresiones del generador junto con la coincidencia de patrones también actúan como filtro:

6> Weather = [{toronto, rain}, {montreal, storms}, {london, fog},  
6>            {paris, sun}, {boston, fog}, {vancouver, snow}].
[{toronto,rain},
{montreal,storms},
{london,fog},
{paris,sun},
{boston,fog},
{vancouver,snow}]
7> FoggyPlaces = [X || {X, fog} <- Weather].
[london,boston]

Si un elemento de la lista 'Clima' no coincide con el patrón {X, niebla}, simplemente se ignora en la comprensión de la lista, mientras que el operador = habría generado una excepción.

lunes, 26 de febrero de 2024

Imports en gleam


// Import the module and one of its functions

import gleam/io.{println}


pub fn main() {

  // Use the function in a qualified fashion

  io.println("This is qualified")


  // Or an unqualified fashion

  println("This is unqualified")

}


Normalmente, las funciones de otros módulos se utilizan de forma calificada, con el calificador del módulo antes del nombre de la función. Por ejemplo, io.println("¡Hola!").

También es posible especificar una lista de funciones para importar desde un módulo de forma no calificada, como la función println en el editor de código. Debido a que se importó de esta manera, se le puede llamar simplemente println.

Generalmente es mejor utilizar importaciones calificadas, ya que esto deja claro dónde está definida la función, lo que hace que el código sea más fácil de leer.

Hello world en Gleam

 


// Import a Gleam module from the standard library

import gleam/io


pub fn main() {

  // Print to the console

  io.println("Hello world!")

}


Aquí hay un programa que imprime el texto "Hello world!".

Para ello, utiliza la función println que se ha importado del módulo gleam/io, que forma parte de la biblioteca estándar de Gleam.

Para ejecutar este programa se usa el comando gleam run.