En Cargo Shuffle conociste la pila de datos de Factor y las palabras de reordenación que la reorganizan. Este ejercicio se basa en eso: vas a definir palabras que calculan con sus entradas en lugar de limitarse a moverlas de un sitio a otro.
Un ! inicia un comentario de línea: Factor ignora todo lo que hay desde ! hasta el final de la línea. Los ejemplos siguientes usan ! tanto para anotar lo que hace el código como para mostrar lo que imprimiría.
Una palabra es el nombre que da Factor a una función. Llamar a una palabra extrae algunos valores de la parte superior de la pila y apila otros de vuelta.
. extrae el valor superior y lo imprime; las palabras de aritmética entera +, -, * extraen dos números y apilan el resultado:
2 3 + . ! prints 5
8 3 - . ! prints 5 (8 - 3, not 3 - 8)
2 3 * . ! prints 6
Una palabra relacionada, .s, imprime la pila de datos entera sin consumir nada, lo cual resulta muy práctico en el listener (el prompt interactivo de Factor, donde escribes código y ves los resultados) para ver lo que deja un fragmento. Por eso algunos ejemplos posteriores terminan en .s en vez de en .: 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 fichero 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: extrae las entradas 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 registra el orden en el que se sitúan los valores en la pila.
! + is specified as ( x y -- sum )
! . is specified as ( x -- )
La parte superior de la pila es la entrada 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 indicar «un valor booleano», pero el ejercicio de la lasaña solo usa números.
Más abajo aparece una palabra de reordenación de Cargo Shuffle: swap ( x y -- y x ), que intercambia los dos valores superiores cuando están en el orden equivocado para la siguiente palabra.
: inicia la definición de una 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 comprueba que el cuerpo coincida de verdad con el efecto de pila declarado: una palabra que afirma ( x -- y ) pero deja cero o dos valores en la pila no se compilará.
CONSTANT: define un nombre para un valor fijo. Una constante es en sí misma una palabra: llamarla apila el valor en la pila:
CONSTANT: pi 3
pi pi * . ! => 9
CONSTANT: es sintaxis del núcleo y no necesita una línea USING:. Coloca las constantes al principio del fichero, antes de cualquier palabra que las use.
El cuerpo de una palabra puede llamar a cualquier palabra que ya esté en el scope, incluidas las que definiste antes en el mismo fichero:
: 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 algo de código para ayudarte a cocinar una lasaña espectacular siguiendo tu libro de cocina favorito.
Tienes cuatro tareas, todas relacionadas con el tiempo que se tarda en cocinar la lasaña.
Define la constante expected-bake-time, que debe devolver cuántos minutos necesita la lasaña para hornearse 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 has añadido a la lasaña y deja cuántos minutos has tardado en 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 ha estado en el horno y deja cuántos minutos le quedan por permanecer ahí.
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 después el número de minutos que la lasaña ya ha estado en el horno) y deja el tiempo total dedicado a cocinar hasta ahora: el tiempo de preparación más el tiempo que ya ha estado 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.