Forth

Forth

Difícil

Instruções

Implementa um avaliador para um subconjunto muito simples de Forth.

Forth é uma linguagem de programação baseada em pilha. Implementa um avaliador muito básico para um pequeno subconjunto de Forth.

O teu avaliador tem de suportar as seguintes palavras:

  • +, -, *, / (aritmética de inteiros)
  • DUP, DROP, SWAP, OVER (manipulação de pilha)

O teu avaliador também tem de suportar a definição de novas palavras usando a sintaxe habitual: : word-name definition ;.

Para simplificar, o único tipo de dados que precisas de suportar é o dos inteiros com sinal de, pelo menos, 16 bits.

Deves usar as seguintes regras para a sintaxe: um número é uma sequência de um ou mais algarismos (ASCII), uma palavra é uma sequência de uma ou mais letras, algarismos, símbolos ou pontuação que não seja um número. (O Forth provavelmente usa regras ligeiramente diferentes, mas isto é suficientemente próximo.)

As palavras não distinguem maiúsculas de minúsculas.

Implementação

Em Forth, as funções chamam-se words e operam sobre uma pilha de dados. Cada palavra retira o(s) seu(s) parâmetro(s) da pilha e devolve o(s) seu(s) resultado(s) para a pilha.

A documentação de Forth indica sempre o estado da pilha de dados antes de a palavra ser executada e depois de a palavra ser executada da seguinte forma: ( p1 p2 ... pN --- r1 r2 ... rN ). Os valores p1 a pN representam os parâmetros da palavra na pilha antes da chamada (a pilha pode ter dados adicionais mais acima, aqui não representados) e os valores r1 a rN representam os valores devolvidos pela palavra na pilha depois da chamada. O separador --- distingue o estado da pilha antes e depois da execução da palavra.

As palavras a implementar são definidas da seguinte forma:

  • ToS é a abreviatura de Top of Stack
  • O topo da pilha é representado pelo valor mais à direita
palavra estado da pilha descrição
+ ( 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 o valor no ToS
drop ( a --- ) descarta o valor no ToS
swap ( a b --- b a ) troca os dois valores no ToS
over ( a b c --- a b c b ) copia o 2.º valor para o ToS

Se quiseres brincar com um intérprete de Forth online ou saber mais sobre as palavras a implementar, dá uma vista de olhos ao Easy Forth (em particular às secções Adding Some Numbers, Defining Words e Stack Manipulation).

Editar via GitHub A ligação abre numa nova janela ou separador
Odin Exercism

Estás pronto para começar Forth?

Inscreve-te no Exercism para aprenderes e dominares Odin com 73 exercícios, e mentoria humana real, tudo grátis.