¡Te damos la bienvenida a Factor! Factor es un lenguaje concatenativo: en lugar de llamar a funciones como square(add(2, 3)), escribes una fila de palabras de izquierda a derecha, 2 3 + square, que se pasan valores entre sí a través de una pila de datos compartida. Imagina una pila de cajas de carga en un muelle, la más reciente arriba.
Un ! inicia un comentario de línea: Factor ignora todo desde ! hasta el final de la línea. Los ejemplos de abajo usan ! para anotar lo que hace el código.
Escribir un literal lo empuja a lo alto de la pila. El código se lee de izquierda a derecha.
1 2 3 ! stack (bottom → top): 1 2 3
Todas las palabras leen sus entradas de lo alto de la pila y escriben sus salidas ahí mismo. . saca el valor superior y lo imprime; .s imprime la pila entera sin consumir nada, lo cual resulta práctico para ver qué ha dejado atrás un fragmento de código.
Cada palabra se documenta con un efecto de pila de la forma ( inputs -- outputs ). Es el contrato de la palabra: la palabra saca las entradas de lo alto de la pila y deja las salidas en su lugar. Los nombres del interior son documentación para las personas: la pila en sí es posicional, no tiene nombres. Lo alto de la pila es el nombre de la derecha.
: inicia la definición de una palabra, después viene el efecto de pila, luego el cuerpo y, por último, ; la cierra. El compilador de Factor comprueba que el cuerpo deja realmente lo que declara el efecto de pila.
: restow ( a b -- b a ) swap ;
Estas palabras de kernel reordenan lo alto de la pila sin hacer ninguna operación aritmética: solo mueven las cajas de un lado a otro:
dup ( x -- x x ) ! copy the top crate
drop ( x -- ) ! remove the top crate
swap ( x y -- y x ) ! flip the top two
over ( x y -- x y x ) ! copy the second crate onto the top
nip ( x y -- y ) ! remove the second crate
rot ( x y z -- y z x ) ! roll the third crate up to the top
Recurre a dup cuando una caja deba alimentar a dos palabras, a drop para deshacerte de una caja, a swap cuando las dos de arriba estén en el orden equivocado, a over o nip para trabajar con la caja que está debajo, y a rot para traer a lo alto una caja enterrada.
La familia más amplia (-rot, dupd, swapd, 2dup, …) sigue la misma idea; ya te encontrarás con esas palabras más adelante.
Las palabras escritas en fila se ejecutan de izquierda a derecha: cada palabra actúa sobre la pila que dejó la palabra anterior. Esto es lo que swap nip le hace a la pila 1 2 (de abajo arriba), palabra a palabra:
1 2 ! 1 2 the starting crates
swap ! 2 1 swap flipped the top two
nip ! 1 nip dropped the 2nd-from-top crate (the 2)
Y esto es dup rot con las mismas cajas iniciales, de nuevo palabra a palabra:
1 2 ! 1 2 the starting crates
dup ! 1 2 2 dup copied the top crate
rot ! 2 2 1 rot rolled the 3rd-from-top crate up to the top
Las palabras usan lowercase-kebab-case: letras minúsculas unidas por guiones.
Eres un grumete que vuelve a estibar cajas de carga en el muelle. Cada tarea es una única palabra cuyo cuerpo usa solo palabras de reordenación, sin aritmética.
Define la palabra swap-crates. Quita dos cajas de la pila y las deja en el orden contrario.
1 2 swap-crates .s
! 2
! 1
Define la palabra clear-spill. Quita tres cajas de la pila y deja las dos de abajo, descartando la de arriba.
1 2 3 clear-spill .s
! 1
! 2
Define la palabra peek-under. Quita dos cajas de la pila y las deja con una copia de la caja de abajo colocada encima.
1 2 peek-under .s
! 1
! 2
! 1
Define la palabra tidy-deck. Quita tres cajas de la pila (en el orden x y z) y deja z z y: descarta la caja de abajo y, a continuación, deja dos copias de la caja de arriba bajo la del medio.
1 2 3 tidy-deck .s
! 3
! 3
! 2
Regístrate en Exercism para aprender y dominar Factor con 47 conceptos163 ejercicios y mentoría humana real, todo gratis.