Volver al inicio

dc: programación en una calculadora de pila

dc — calculadora de pila Unix como lenguaje de programación con registros, macros y recursión. El artículo desglosa el modelo de pila, construcciones condicionales, ejemplos de FizzBuzz y Peg Solitaire con código completo.

Programando FizzBuzz en dc: de pila a juego
Advertisement 728x90

dc: La calculadora como lenguaje de programación para desarrolladores

dc es una calculadora clásica de Unix, más antigua que el lenguaje C, incluida en las distribuciones estándar de la mayoría de sistemas, incluido macOS. Tras su apariencia sencilla se esconde un lenguaje de programación completo basado en pila, con registros, macros, construcciones condicionales y recursión. El modelo central es la pila: los números y cadenas se apilan mediante comandos, los operadores extraen los elementos superiores, realizan una acción y devuelven el resultado.

Primer cálculo: para sumar 2 + 2, introduce 2 2 + p. Aquí, 2 2 apila los números línea por línea, + suma los dos elementos superiores, y p imprime el resultado.

2 2 +
p
4

La pila es el elemento clave: cada literal (número o [cadena]) apila un valor en la parte superior. Los comentarios comienzan con #.

Google AdInline article slot

Trabajo con registros y variables

dc proporciona 256 registros (a-z, 0-9 y otros caracteres) que almacenan números o cadenas. Los comandos sR guardan la parte superior de la pila en el registro R, y lR la cargan de nuevo. Los registros mantienen su estado independientemente de la pila principal.

Ejemplo de guardar y restaurar una cadena:

[¡Hola mundo!] sx
lx
p
¡Hola mundo!

Los registros son adecuados para variables globales. Los números en registros se manipulan de manera similar a la pila: li carga i en la pila.

Google AdInline article slot

Macros como funciones

Las funciones en dc son macros: cadenas almacenadas en registros, ejecutadas con el comando lRx, donde x es el registro. Las macros se definen como [código] sR.

Ejemplo de una función para sumar los registros a y b:

[la lb +] sS
1 sa
2 sb
lSx
p
3

Las macros admiten recursión y pueden llamarse entre sí, formando subrutinas.

Google AdInline article slot

Construcciones condicionales

Las bifurcaciones se basan en comparar los dos elementos superiores de la pila. Los operadores incluyen =, >, <, != y otros. Si la condición es verdadera, se ejecuta la macro del registro especificado.

[[Igual] p] sE
[[No igual] p] sN
1 0
=E
1 0
!=N
No igual

Las comparaciones consumen dos elementos de la pila, dejando el resultado (0 o 1).

Bucles recursivos

No hay bucles, pero la recursión se implementa mediante auto-llamadas de macros. Ejemplo de impresión de números del 1 al 10:

[
	li p
	1 + si
	li 11 >C
] sC

1 si
lCx

La macro C imprime i, lo incrementa y se llama a sí misma recursivamente mientras i < 11. El i actual ya está en la pila al entrar.

  • Ventajas de la recursión en dc: simplicidad, sin bucles explícitos.
  • Limitaciones: riesgo de desbordamiento de pila con recursión profunda.
  • Alternativas: la recursión de cola minimiza el uso de la pila.

FizzBuzz en dc

La implementación de FizzBuzz hasta 100 demuestra una combinación de macros, condiciones y recursión. Comandos clave: P (imprimir sin nueva línea), c (limpiar pila).

Código completo:

[[Fizz] P 0 sd] sF
[[Buzz] P 0 sd] sB
[li 3 % 0 =F li 5 % 0 =B] sW
[10 P] sP
[li p c] sD
[
  1 sd
  lWx
  ld 0 =P
  ld 1 =D
  li 1 + si
  li 101 >M
] sM

1 si
lMx

Lógica: la bandera d determina si imprimir el número. La macro W verifica la divisibilidad por 3/5, estableciendo Fizz/Buzz. P con 10 (LF) para una nueva línea.

Aplicaciones avanzadas: Solitario de clavijas

dc permite resolver tareas complejas, como el Solitario de clavijas, un rompecabezas con saltos de clavijas en un tablero. El estado del tablero se codifica como un número binario, con manipulaciones mediante operaciones aritméticas y bit a bit (disponibles desplazamientos y máscaras).

Las fórmulas de validación de movimientos en RPN parecen complejas debido a las comprobaciones bit a bit, pero permiten un juego completo: desde la configuración inicial hasta la clavija final.

Este enfoque muestra a dc como una herramienta para prototipado de algoritmos sin compilación.

Conclusiones clave

  • La pila es la base de todas las operaciones: los literales apilan, los operadores extraen/apilan resultados.
  • Registros (256 en total) para estado, macros para subrutinas con lRx.
  • Las condiciones consumen la pila, la recursión reemplaza los bucles.
  • p/P para salida, c para limpiar, % para módulo.
  • Adecuado para scripting, prototipado y aprendizaje de RPN.

— Editorial Team

Advertisement 728x90

Leer después