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 #.
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.
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.
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/Ppara salida,cpara limpiar,%para módulo.- Adecuado para scripting, prototipado y aprendizaje de RPN.
— Editorial Team
Aún no hay comentarios.