Implementa un evaluador para un subconjunto muy simple de Forth.
Forth es un lenguaje de programación basado en pila. Implementa un evaluador muy básico para un subconjunto pequeño de Forth.
Tu evaluador debe admitir las siguientes palabras:
+, -, *, / (aritmética de enteros)DUP, DROP, SWAP, OVER (manipulación de la pila)Tu evaluador también debe admitir la definición de nuevas palabras usando la sintaxis habitual: : word-name definition ;.
Para simplificar, el único tipo de dato que necesitas admitir son enteros con signo de al menos 16 bits.
Debes usar las siguientes reglas para la sintaxis: un número es una secuencia de uno o más dígitos (ASCII), y una palabra es una secuencia de una o más letras, dígitos, símbolos o signos de puntuación que no sea un número. (Es probable que Forth use reglas un poco diferentes, pero esto se acerca lo suficiente).
Las palabras no distinguen entre mayúsculas y minúsculas.
En Forth, las funciones se llaman words: operan sobre una pila de datos.
Cada palabra toma sus parámetros de la pila y devuelve su resultado en la pila.
La documentación de Forth siempre incluye el estado de la pila de datos antes y después de que se ejecute la palabra, de la siguiente manera: ( p1 p2 ... pN --- r1 r2 ... rN ).
Los valores p1 a pN representan los parámetros de la palabra que están en la pila antes de la llamada (la pila puede tener datos adicionales más arriba, que no se representan aquí) y los valores r1 a rN representan los valores de retorno de la palabra que quedan en la pila después de la llamada.
El separador --- distingue el estado de la pila antes y después de la ejecución de la palabra.
Las palabras que hay que implementar se definen así:
| palabra | estado de la pila | descripción |
|---|---|---|
+ |
( a b --- sum ) |
sum = a + b |
- |
( a b --- diff ) |
diff = a - b |
* |
( a b --- prod ) |
prod = a * b |
/ |
( a b --- quot ) |
quot = a / b |
dup |
( a --- a a ) |
duplica el valor que está en la cima de la pila |
drop |
( a --- ) |
elimina el valor que está en la cima de la pila |
swap |
( a b --- b a ) |
intercambia los dos valores que están en la cima de la pila |
over |
( a b c --- a b c b ) |
copia el segundo valor a la cima de la pila |
Si quieres jugar con un intérprete de Forth en línea o aprender más sobre las palabras que hay que implementar, prueba Easy Forth (en concreto, las secciones Adding Some Numbers, Defining Words y Stack Manipulation).
Regístrate en Exercism para aprender y dominar Odin con 73 ejercicios y mentoría humana real, todo gratis.