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.
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.
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:.
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.
: 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.
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.
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.
Tanto las palabras como las constantes usan lowercase-kebab-case: letras
minúsculas unidas por guiones (por ejemplo, expected-bake-time,
preparation-time).
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.
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
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
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
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
Regístrate en Exercism para aprender y dominar Factor con 47 conceptos163 ejercicios y mentoría humana real, todo gratis.