caminhante 311738cc16 Markdown de alguns blocos estava incorreto | 4 anos atrás | |
---|---|---|
ERPL.leo | 4 anos atrás | |
LICENSE | 7 anos atrás | |
Makefile | 5 anos atrás | |
README.md | 4 anos atrás | |
erpl.c | 6 anos atrás | |
erpl.h | 6 anos atrás | |
erplb.c | 6 anos atrás | |
erple.c | 6 anos atrás | |
erpli.c | 6 anos atrás | |
erplm.c | 6 anos atrás | |
erplp.c | 6 anos atrás | |
erplt.c | 6 anos atrás | |
test.c | 6 anos atrás |
Eu declaro que este projeto está liberado ao domínio público. Caso isto não seja legalmente possível, eu dou desde já autorização para qualquer pessoa de ler, usar, modificar e renomear qualquer arquivo deste repositório livremente. Se necessário for, eu posso liberar meu código-fonte sob uma licença de software livre qualquer ou emitir uma licença comercial sem qualquer custo exceto os custos de envio.
Este projeto será versionado sob o regime monotônico. Para referência consulte o Manifesto Monotônico.
Basta possuir um compilador compatível com C99 e extensões GNU (GCC é altamente indicado) e GnuMake ou similar, daí rodar make
.
O executável do interpretador se chama erpl
.
O código-fonte atualmente não possui dependências além da biblioteca C padrão.
(Em andamento)
(Em andamento)
(Em andamento)
ERPL é um pequeno dialeto Lisp experimental, para estudo de design de linguagens.
ERPL é uma linguagem concatenativa e recebe seus tokens por padrão em notação polonesa reversa.
Isso quer dizer que todo tipo de dado em ERPL funciona como uma função alterando o estado de uma pilha operacional implícita. Existe uma pilha na qual os dados à serem manipulados são dispostos pelo interpretador, e funções podem ser aplicadas aos dados na pilha, retornando valores na própria pilha. A ordem de acesso da pilha é: o último que entra é o primeiro que sai (em inglês, Last In, First Out ou LIFO).
Além disso, os objetos ou funções podem ser concatenadas para construir novas funções, por isso é uma linguagem concatenativa e possui propriedades únicas. Existem outros detalhes importantes de ERPL que serão descritos nos capítulos seguintes.
Visualmente, os tokens são normalmente interpretados da esquerda para direita. O seguinte bloco demonstra código ERPL válido:
"Hello " "world" append STDOUT puts
Neste código, primeiramente dois objetos do tipo String são dispostos na pilha. Uma representação imaginária da pilha se segue, com os itens presentes nela numerados à partir de 1, representando o topo da pilha:
2: "Hello "
1: "world"
Logo após, a função nativa append
é convocada, atuando sobre os dois objetos de tipo String e deixando seu retorno na pilha, o texto dos dois concatenado em um objeto só:
1: "Hello world"
Em seguida, a constante especial STDOUT
é convocada, deixando um valor na pilha que será aproveitado em seguida pela função nativa puts
:
2: "Hello world"
1: 1
A função puts
recebe dois operandos, um objeto String e um inteiro representando um descritor de arquivo, daí envia o texto do objeto String para o descritor. No exemplo, o descritor de arquivo aponta para a saída de texto padrão do programa. Você deverá ver Hello world
aparecer no seu terminal ou console de texto.
É útil notar que o caractere ;
demarca o início de uma linha de comentário em ERPL. Todo texto que aparecer entre o ;
e o final da linha é ignorado pelo interpretador.
Os tipos de dados disponíveis em ERPL podem ser escalares ou vetoriais. Os escalares contém um único valor numérico e são representados pelo tipo Atom
.
Os vetoriais representam uma sequência de zero ou mais dados que podem ser de qualquer tipo, e são representados pelo tipo Sequence
.
Os tipos implementados na linguagem são 8 ao todo, formando uma pequena hierarquia:
Os tipos Atom
e Sequence
são os mais genéricos e os demais tem propriedades especiais convenientes.
É o tipo escalar mais genérico, os demais tipos escalares são refinamentos deste. Todos os outros tipos podem ser convertidos para Atom, mas nem todos os valores de Atom podem ser convertidos para tipos refinados, devido às restrições de cada tipo.
Não existe token para criar um objeto Atom diretamente, apenas seus tipos derivados.
É um tipo que apenas aceita valores numéricos inteiros.