Rutas
/
Gleam
Gleam
/
Ejercicios
/
La tienda de bicicletas de Betty
La tienda de bicicletas de Betty

La tienda de bicicletas de Betty

Ejercicio de aprendizaje

Introducción

Enteros

En Gleam hay dos tipos diferentes de números: enteros y decimales.

Los enteros son números sin parte decimal.

let integer = 3
// -> 3

Gleam tiene varios operadores que funcionan con enteros.

1 + 1 // -> 2
5 - 1 // -> 4
5 / 2 // -> 2
3 * 3 // -> 9
5 % 2 // -> 1

2 > 1  // -> True
2 < 1  // -> False
2 >= 1 // -> True
2 <= 1 // -> False

Decimales

Los decimales son números con uno o más dígitos detrás del separador decimal.

let float = 3.45
// -> 3.45

Los decimales también tienen su propio conjunto de operadores.

1.0 +. 1.4 // -> 2.4
5.0 -. 1.5 // -> 3.5
5.0 /. 2.0 // -> 2.5
3.0 *. 3.1 // -> 9.3

2.0 >. 1.0  // -> True
2.0 <. 1.0  // -> False
2.0 >=. 1.0 // -> True
2.0 <=. 1.0 // -> False

Módulos

Módulos

El código de Gleam se organiza en módulos, y cada archivo es un módulo de Gleam.

Hasta ahora hemos escrito funciones con la sintaxis pub fn, que define una función disponible públicamente para otros módulos. Las funciones definidas con fn son privadas del módulo en el que se definen y no pueden usarlas otros módulos.

// This function is public
pub fn add(x, y) {
  x + y
}

// This function is private
fn subtract(x, y) {
  x - y
}

Los módulos de Gleam tienen nombre, y este se basa en la ruta del archivo dentro del directorio src o test.

Por ejemplo, un módulo definido en src\geometry\rectangle.gleam (en Windows) o src/geometry/rectangle.gleam (en sistemas operativos tipo UNIX) se llamaría geometry/rectangle.

Importar funciones de otros módulos

Se accede a las funciones definidas en otros módulos mediante importaciones. Todas las funciones de ese módulo que este expone se vuelven accesibles al importar dicho módulo. Pero la forma de acceder a ellas varía según cómo se importe el módulo.

Las importaciones cualificadas son las predeterminadas, y para acceder a una función de ese módulo (por ejemplo, la función map del módulo gleam/list) se antepone el nombre del módulo (list.map).

// Import the int module
import gleam/int

pub fn run(x: Int) -> String {
  // Use the to_string function from the int module
  int.to_string(x)
}

De forma predeterminada, el nombre que se usa para referirse al módulo es la última parte del nombre del módulo, en este caso int, pero se puede cambiar con la palabra clave as.

// Import the int module and refer to it as i
import gleam/int as i

pub fn run(x: Int) -> String {
  i.to_string(x)
}

Las importaciones no cualificadas permiten acceder directamente a las funciones expuestas de ese módulo, sin anteponer nada.

// Import the to_string function from the int module
import gleam/int.{to_string}

pub fn run(x: Int) -> String {
  to_string(x)
}

Se prefieren las importaciones cualificadas porque dejan más claro al lector de dónde viene cada función y evitan conflictos de nombres.

Biblioteca estándar

Gleam tiene una biblioteca estándar completa y bien documentada. La documentación está disponible en línea en hexdocs.pm/gleam_stdlib. Guarda este enlace en algún sitio: lo usarás mucho.

La mayoría de los tipos de datos integrados tienen un módulo correspondiente que ofrece funciones para trabajar con ese tipo de datos; por ejemplo, existe el módulo gleam/int para los enteros, el módulo gleam/string para los strings, el módulo gleam/list para los arrays, etc.

Instrucciones

En este ejercicio vas a escribir algo de código para ayudar a Betty's Bike Shop, una tienda online de bicicletas y piezas. Tienes tres tareas, cuyo objetivo es mostrar correctamente en la web los precios de las bicicletas y las piezas.

1. Exporta la función pence_to_pounds

Ya está escrito el esqueleto del módulo, con las funciones incompletas pence_to_pounds y pounds_to_string. Sin embargo, se ha olvidado exportar la función pence_to_pounds, así que actualmente no es visible desde otros módulos ni desde los tests.

Exporta la función pence_to_pounds.

2. Convierte peniques a libras

Actualmente, el precio se almacena como un número entero de peniques (la tienda de bicicletas tiene su sede en el Reino Unido). En la web queremos mostrar el precio en libras, donde 1,00 libra equivale a 100 peniques. Tu primera tarea es implementar la función pence_to_pounds, que toma una cantidad de peniques de tipo Int y la convierte en su equivalente en libras como un Float. También deberías añadir anotaciones de tipo a esa función.

pence_to_pounds(106)
// -> 1.06

3. Da formato al precio para mostrarlo en la web

Como las bicicletas de Betty se venden en libras, los precios deben mostrarse con el símbolo «£». Tu segunda tarea es, por tanto, implementar la función pounds_to_string, que toma una cantidad de libras como Float y devuelve su precio mostrado como un String con el símbolo de la libra antepuesto.

Deberías importar los módulos gleam/float y gleam/string antes de usarlos.

También deberías definir la anotación de tipo de pounds_to_string.

pounds_to_string(1.06)
// -> "£1.06"
Editar en GitHub El enlace se abre en una ventana o pestaña nueva
Gleam Exercism

¿Listo para empezar La tienda de bicicletas de Betty?

Regístrate en Exercism para aprender y dominar Gleam con 33 conceptos122 ejercicios y mentoría humana real, todo gratis.