A proposta mais básica de Graphol, como o próprio nome diz, é a representação do conhecimento ou a abstração da realidade por meio de um grafo. Logo o 1o objetivo da linguagem é fornecer uma API rica para lidar com este tipo de estrutura.
Para isso, na mesma forma que numa linguagem orientada a objetos clássica e pura, tudo é um objeto, podemos considerar como ponto de partida que em graphol tudo é uma parte de um grafo, ou seja, tudo ou é nodo ou é aresta.
Neste post o objetivo é definir um nodo.
Em Graphol as seguintes entidades são mapeadas como nodos:
- Valores primitivos, ex: 2 5.3 true “Graphol”;
- Funções; e
- Listas.
E em Graphol, os nós desempenham as seguintes funções básicas:
- Guardam valores;
- Processam mensagens recebidas; e
- Executam conjunto de comandos internos.
Definição
Em primeiro lugar deve ficar claro que tipos primitivos são nodos por definição. Isto significa que eles possuem as mesmas características de um nodos. Inclusive a possibilidade de tratarem mensagens, ligação por meio de arestas e execução.
Da mesma forma que um nodo é executável e pode ser ‘chamado’ em um ponto qualquer do código, um tipo primitivo também o é, retornando seu próprio valor.
Ou seja,o nodo 2 retorna 2 e “Graphol” retorna o texto Graphol.
Mas em geral, um nodo genérico – aquele que não é um tipo primitivo – é definido por chaves: {/*BLOCO DE INSTRUÇÕES*/}
Por exemplo, em
a:{
4
}
A linha 4 é uma linha de comando do bloco. Lembra que um tipo primitivo também é executável? Esta linha retona 4 para o próprio nodo. Não é necessário return. O entendimento em {“oi”} é análogo.
Ex.:
a:{4}
b:{a}
4 + b
8
O exemplo acima é meramente ilustrativo. O mesmo efeito pode ser conseguido com:
a:4
b:a
4 + b
8
Nota, um programa em Graphol é como se ocorresse dentro de um grande Nodo. Logo o Hello World em graphol é, simplesmente:
“Hello, World”
Ou seja, “Hello, World” é um comando válido que retorna o texto Hello, World. Em Graphol, por padrão a saída padrão é o console. Logo no programa “Hello, World” teremos o texto Hello, World escrito no console.
Mas falamos que o nodo é um bloco de instruções. Acima vimos apenas blocos com uma única instrução. Veja abaixo um nodo com 3 instruções.
Ex:
meu_nodo:{
a:4
b:4
"A soma deu "+(a+b)
}
meu_nodo
A soma deu 8
Listas e Retornos de Nodos
Como foi dito, nos nodos em Graphol não é necessário o return, embora tb possa ser utilizado. O motivo disso é que um nodo pode eventualmente retornar não um, mas vários valores ao mesmo tempo. Neste caso este nodo será entendido como uma lista.
Ex.:
minha_lista:{
4
5.6
"Graphol"
}
minha_lista2:{4; 7; 8}
minha_lista3: "teste", true, 5
Acima temos 3 formas diferentes de definição de lista. Perceba que a 3a forma é apenas uma sintaxe açucarada, mas que a lista não deixa de ser um nodo também.
Como um nodo também pode conter controle de fluxos como for, whiles, ifs e afins, e já que cada caminho deste fluxo pode conter retornos alternativos, temos que um nodo pode criar/ser uma lista de conteúdo variável dependendo do contexto.
O comando return, para a execução do nodo e retorna ao local da chamada. {return(3)} é o equivalente à {3; exit}
Ou seja:
minha_lista:{equivale à
4
5.6
return("Graphol")
5
}
minha_lista: 4,5.6,"Graphol"
Perceba que o 5 final foi ignorado.
Considerações
Logicamente ainda há muito para ser falado, inclusive de nodos. Porém alguns outros tópicos de nodos serão mais fáceis de serem explorados após a publicação de outros conceitos.
Como exemplo, ainda falaremos aqui de:
- Arestas
- Mensagens
- Trabalhos com Listas
- Reencaminho de Mensagens
- Passagem de Parâmetros
- Controle de fluxo
- Nós Remotos
- Paralelismo
- Nós Internos/Métodos
Mas, para os mais curiosos, antes de vir para o blog, estas idéias são expostas no fórum. Logo, todos estão convidados a dar uma espionada por lá.
Por último, é importante lembrar que, mesmo o que está publicado neste blog, ainda é um rascunho. Por isso estamos no subdomínio ‘draft’. Assim se sintam livres para, além de elogiar, criticar, sugerir novos caminhos, apontar falhar conceituais, etc. Este tipo de participação ajudará muito o trabalho.
Abraços,
Renato Louro