Forth

Forth

Difícil

Instrucciones

Implementa un evaluador para un subconjunto muy sencillo de Forth.

Forth es un lenguaje de programación basado en una pila. Implementa un evaluador muy básico para un pequeño subconjunto de Forth.

Tu evaluador tiene que admitir las siguientes palabras:

  • +, -, *, / (aritmética de enteros)
  • DUP, DROP, SWAP, OVER (manipulación de la pila)

Tu evaluador también tiene que admitir la definición de nuevas palabras con la sintaxis habitual: : word-name definition ;.

Para simplificar, el único tipo de datos que necesitas admitir son los enteros con signo de al menos 16 bits.

Para la sintaxis, debes usar las siguientes reglas: 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 es un número. (Es probable que Forth use reglas ligeramente distintas, pero esto se acerca bastante.)

Las palabras no distinguen entre mayúsculas y minúsculas.

Implementación

En Forth, las funciones se llaman words y operan sobre una pila de datos. Cada palabra toma sus parámetros de la pila y devuelve sus resultados en la pila.

La documentación de Forth siempre incluye el estado de la pila de datos antes y después de ejecutar la palabra, del siguiente modo: ( p1 p2 ... pN --- r1 r2 ... rN ). Los valores p1 a pN representan los parámetros de la palabra en la pila antes de la llamada (la pila puede contener datos adicionales más arriba que aquí no se representan) y los valores r1 a rN representan los valores devueltos por la palabra 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í:

  • «ToS» es la abreviatura de «Top of Stack».
  • La parte superior de la pila se representa como el valor más a la derecha.
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 ToS
drop ( a --- ) descarta el valor que está en la ToS
swap ( a b --- b a ) intercambia los dos valores que están en la ToS
over ( a b c --- a b c b ) copia el segundo valor a la ToS

Si quieres probar un intérprete de Forth en línea o aprender más sobre las palabras que hay que implementar, echa un vistazo a Easy Forth (en concreto, las secciones Adding Some Numbers, Defining Words y Stack Manipulation).

Editar en GitHub El enlace se abre en una ventana o pestaña nueva
Odin Exercism

¿Listo para empezar Forth?

Regístrate en Exercism para aprender y dominar Odin con 73 ejercicios y mentoría humana real, todo gratis.