Un lenguaje que inventé hace un tiempo y que, por fin, le he encontrado una aplicación (si aceptan un presupuesto que he hecho, claro
):
Código:
0
@
1 +
DUP 3 %
0 = IF
"fizz" CALL:WRITE
FI
DUP 5 %
0 = IF
"buzz" CALL:WRITE
FI
DUP DUP 3 % SWAP 5 %
0 = SWAP 0 = & IF
DUP CALL:WRITE
FI
"" CALL:WRITELN
DUP 100 < IF
RET
FI
"Ahora vas y lo cascas"
Explicación:
Este lenguaje es, en realidad, el "Ensamblador" de una máquina virtual basada en pilas, al estilo FORTH. DUP duplica el elemento en la cima de la pila, mientras que SWAP intercambia los dos valores de la cima. Los operadores extraen uno o dos elementos de la pila, lo operan y lo devuelven a la pila; y son los normales (+, -, >, <...) siendo "%" el cálculo del resto en una división entera. "CALL" llama a una rutina (WRITE y WRITELN en este caso). @ apila en la pila de código (separada de la pila de datos, como en FORTH) la dirección de dicha arroba, mientras que RET desapila la cima de la pila de código en el registro de ejecución.
Vamos, muy sencillo.
El código puede optimizarse duplicando e intercambiando los resultados de las operaciones (que en principio es más rápido que calcular el módulo y hacer comparaciones), pero entonces ya te lías...