Tracks
/
Factor
Factor
/
Ejercicios
/
La deliciosa lasaña de Leah
La deliciosa lasaña de Leah

La deliciosa lasaña de Leah

Ejercicio de aprendizaje

Introducción

En Cargo Shuffle conociste la pila de datos de Factor y las palabras de reordenamiento que la reorganizan. Este ejercicio se basa en eso: vas a definir palabras que calculan con sus argumentos en lugar de solo moverlos de un lado a otro.

Comentarios

Un ! inicia un comentario de línea: Factor ignora todo, desde ! hasta el final de la línea. Los ejemplos de abajo usan ! tanto para anotar lo que hace el código como para mostrar lo que imprimiría.

Palabras

Una palabra es el nombre que usa Factor para una función. Llamar a una palabra saca algunos valores de la parte superior de la pila y deja otros valores en su lugar. . saca el valor de arriba y lo imprime; las palabras aritméticas de enteros +, -, * sacan dos números y colocan el resultado:

2 3 + .    ! prints 5
8 3 - .    ! prints 5    (8 - 3, not 3 - 8)
2 3 * .    ! prints 6

Una palabra relacionada, .s, imprime toda la pila de datos sin consumir nada. Resulta muy útil en el listener (el prompt interactivo de Factor, donde escribes código y ves los resultados) para ver qué deja atrás un fragmento. Es la razón por la que los ejemplos posteriores a veces terminan en .s en lugar de .: dejan más de un valor en la pila, y .s los muestra todos.

Las palabras aritméticas viven en el vocabulario math, así que un archivo que las use necesita math en su línea USING:.

Efectos de pila

Cada palabra se documenta con un efecto de pila de la forma ( inputs -- outputs ). Es el contrato de la palabra: esta palabra saca los argumentos de la parte superior de la pila y deja las salidas en su lugar. Los nombres que aparecen dentro solo están para ayudarte a leerlo. Factor no los usa: solo le importa el orden en que están los valores en la pila.

! + is specified as ( x y -- sum )
! . is specified as ( x   --     )

La parte superior de la pila es el argumento de la derecha. Así, en 8 3 - el 3 está arriba, el efecto de pila es ( x y -- difference ) y el resultado es 8 - 3.

Un ? al final de las salidas es la convención para «un Boolean», pero el ejercicio de lasaña solo usa números.

Más abajo aparece una palabra de reordenamiento de Cargo Shuffle: swap ( x y -- y x ), que intercambia los dos valores de arriba cuando están en el orden equivocado para la siguiente palabra.

Definir una palabra

: inicia una definición de palabra, después viene el efecto de pila, luego el cuerpo, y ; la cierra.

: square ( x -- x^2 ) dup * ;

4 square .    ! => 16

El compilador de Factor verifica que el cuerpo coincida de verdad con el efecto de pila declarado: una palabra que declara ( x -- y ) pero deja cero o dos valores en la pila no va a compilar.

Constantes

CONSTANT: define un nombre para un valor fijo. Una constante es en sí misma una palabra: llamarla coloca el valor en la pila:

CONSTANT: pi 3

pi pi * .    ! => 9

CONSTANT: es parte de la sintaxis básica de Factor y no necesita una línea USING:. Coloca las constantes al comienzo del archivo, antes de cualquier palabra que las use.

Llamar a una palabra desde otra

El cuerpo de una palabra puede llamar a cualquier palabra que ya esté en el ámbito, incluidas las que definiste antes en el mismo archivo:

: double    ( x -- 2x ) 2 * ;
: quadruple ( x -- 4x ) double double ;

5 quadruple .    ! => 20

Así es como la última tarea del ejercicio reutiliza una anterior.

Convenciones de nombres

Tanto las palabras como las constantes usan lowercase-kebab-case: letras minúsculas unidas por guiones (por ejemplo, expected-bake-time, preparation-time).

Instrucciones

En este ejercicio vas a escribir código para ayudarte a cocinar una lasaña espectacular con tu libro de cocina favorito.

Tienes cuatro tareas, todas relacionadas con el tiempo que se dedica a cocinar la lasaña.

1. Guarda el tiempo de horneado esperado en una constante

Define la constante expected-bake-time, que debe devolver cuántos minutos necesita la lasaña en el horno.

Según el libro de cocina, la lasaña debe estar en el horno un total de 40 minutos.

expected-bake-time .
! => 40

2. Calcula el tiempo de preparación en minutos

Define la palabra preparation-time. Toma de la pila el número de capas que agregaste a la lasaña y deja el número de minutos que dedicaste a prepararla, suponiendo que cada capa tarda 2 minutos en prepararse.

4 preparation-time .
! => 8

3. Calcula el tiempo de horneado restante en minutos

Define la palabra remaining-time. Toma el número de minutos que la lasaña ya pasó en el horno y deja cuántos minutos le quedan por permanecer allí.

25 remaining-time .
! => 15

4. Calcula el tiempo total de trabajo en minutos

Define la palabra total-working-time. Toma dos argumentos de la pila, primero el número de capas de la lasaña y luego el número de minutos que la lasaña ya lleva en el horno, y deja el tiempo total dedicado a cocinar hasta ahora: el tiempo de preparación más el tiempo que ya lleva en el horno.

3 20 total-working-time .
! => 26
Editar en GitHub El enlace se abre en una ventana o una pestaña nuevas
Factor Exercism

¿Todo listo para empezar La deliciosa lasaña de Leah?

Regístrate en Exercism para aprender y dominar Factor con 47 conceptos163 ejercicios y mentoría humana real, todo gratis.