Nodos

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} O nodo a é um bloco com uma instrução que, retorna, ao ser executado, o nodo 4
b:{a} O nodo b é um bloco de instrução que, retorna, ao ser executado, o nodo a
4 + b 4 é um nodo e b também. Mas são nodos diferentes. Embora o nodo b, ao ser executado, retorne o próprio nó 4.
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:{
4
5.6
return("Graphol")
5
}
equivale à

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

Manifesto Graphol

  1. Objetos são o centro da orientação a objetos. Objetos são mais importantes que classes. Objetos precisam existir, classes não. E uma maneira óbvia de simplificar uma linguagem é abolindo este conceito. Entre classe e interface preferimos o último.
  2. Uma linguagem deveria privilegiar as ideias de cooperação entre objetos e delegação de responsabilidade ao invés da implementação estrutural de relações de herança. Dado as vantagens da composição sobre a herança, a implementação do primeiro deveria no mínimo ser tão fácil de quanto o segundo. Na verdade, o segundo não precisa necessariamente existir.
  3. O relacionamento entre os objetos deveria ser tão importante quanto os próprios objetos. A orientação a objetos tradicionalmente condena a relação entre objetos à um mero atributo/referência em um dos objetos da relação. Mas assim como Nodos e Arestas se ajudam a compor um grafo, uma linguagem deveria dar destaque aos relacionamentos entre objetos, fazendo deles entidades com vida própria, com seus próprios nomes, semânticas e propriedades.
  4. A programação reflexiva deve ser trivial em qualquer linguagem moderna. Um programa escrito nesta linguagem deveria ser capazes de modificar a sua própria estrutura integralmente, utilizando os mesmos comandos básicos da linguagem.
  5. Programação concorrente e distribuída são o futuro. Na verdade, já é o presente. E várias regras que definem uma cooperação concorrente entre os objetos, remotos ou não, podem e devem ser expressas em seus relacionamentos.

Acreditamos que vários tipos de problemas computáveis não só podem ser abstraídos e modelados como grafos assim como tirariam proveito desta modelagem. Nesta abordagem, relacionamentos e cooperação entre objetos ganham uma força equiparável ao próprio objeto. Mais do que queremos, nós precisamos de uma linguagem que torne trivial este tipo de modelagem. Nós precisamos que Graphol exista! Apoie esta ideia!

Graphol: Por uma nova linguagem.

Signatários

Renato Louro(@rslouro)
Chavão (@Chavao)
Lucas Souza Conceição (@LucasZeta)