¡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 nueva arriba.
Un ! inicia un comentario de línea: Factor ignora todo desde ! hasta el final de la línea. Los ejemplos a continuación usan ! para anotar lo que hace el código.
Escribir un literal lo empuja a la parte superior de la pila. El código se lee de izquierda a derecha.
1 2 3 ! stack (bottom → top): 1 2 3
Cada palabra lee sus argumentos de la parte superior de la pila y escribe sus salidas allí. . saca el valor superior y lo imprime; .s imprime la pila completa sin consumir nada, lo que resulta útil para ver qué dejó 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 los argumentos de la parte superior de la pila y deja las salidas en su lugar. Los nombres dentro son documentación para humanos; la pila en sí es posicional, no tiene nombres. La parte superior de la pila es el nombre que está a la derecha.
: inicia una definición de palabra, luego viene el efecto de pila, después el cuerpo y ; la termina. El compilador de Factor verifica que el cuerpo realmente deja lo que declara el efecto de pila.
: restow ( a b -- b a ) swap ;
Estas palabras de kernel reordenan la parte superior de la pila sin hacer ninguna 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 debe alimentar a dos palabras, a drop para desechar una caja, a swap cuando las dos de arriba están en el orden incorrecto, a over o nip para trabajar con la caja que está debajo, y a rot para traer una caja enterrada a la parte superior.
La familia más amplia (-rot, dupd, swapd, 2dup, …) sigue la misma idea; conocerás esas palabras más adelante.
Las palabras escritas en una 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 (abajo → arriba), una palabra a la vez:
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 aquí está dup rot sobre las mismas cajas iniciales, de nuevo una palabra a la vez:
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 marinero que vuelve a estibar cajas de carga en el muelle. Cada tarea es una sola palabra cuyo cuerpo usa únicamente palabras de reordenamiento, sin aritmética.
Define la palabra swap-crates. Toma dos cajas de la pila y las vuelve a dejar en el orden opuesto.
1 2 swap-crates .s
! 2
! 1
Define la palabra clear-spill. Toma 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. Toma dos cajas de la pila y las deja con una copia de la caja inferior colocada encima.
1 2 peek-under .s
! 1
! 2
! 1
Define la palabra tidy-deck. Toma tres cajas de la pila, en el orden x y z, y deja z z y: descarta la caja de abajo y luego deja dos copias de la caja de arriba debajo de 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.