# Linotte

Linotte é uma linguagem de programação open source (licença GPL V3) criada em 2005 por Ronan Mounès. É uma linguagem interpretada pertencente ao paradigma imperativo e tem como peculiaridade a sua sintaxe, que possui comandos no idioma francês.
A principal ideia de Ronan Mounès ao criar a linguagem Linotte foi desenvolver uma linguagem que fosse simples e fácil de aprender por pessoas que estão começando a programar que têm pouco ou nenhum conhecimento em programação e estudantes em geral mas que desejam ter um primeiro contato com programação. A ideia é que um programa Linotte fosse tão fácil de ler quanto um livro, por isso os programas em Linotte não são chamados de programas e sim de "livro" e cada função do programa é chamada de "parágrafo". Como o próprio mote sugere: "Se você é capaz de ler um livro, então é capaz de escrever um programa de computador".
Em Linotte não existem sinais como parênteses, chaves, colchetes e outros tipos de sinais, salvo os que representam as quatro operações aritméticas básicas (adição, subtração, multiplicação e divisão). As variáveis são persistentes (exceto na versão applet), quando se declara uma variável em um livro Linotte, esta é alocada na memória e pode ser usada novamente em outro trecho do mesmo livro, na próxima execução do livro ou até em um livro diferente.
Não é possível acontecer erro durante a execução, uma vez que um livro escrito em Linotte não pode ser executado caso exista algum erro de sintaxe.
Linotte é uma linguagem que leva o programador a esenvolver a base de programação: os algoritmos. Não é uma linguagem desenvolvida para aplicações comerciais reais mas sim para começar a aprender os conceitos básicos de programação.

## Estrutura Básica

Estrutura básica de um programa Linotte:
[xxx]: obrigatório; {xxx}: facultativo

## Linotte e outras linguagens de programação

O intuito da linguagem de programação Linotte não é competir com o Basic ou outra linguagem, mas apenas fornecer uma introdução para estudantes à programação, para que depois possam evoluir para linguagens mais poderosas.
Mesmo que as atualizações e versões não sejam muito constante, devido a limitações de tempo, o projeto está na versão 0.7.0 (data de atualização janeiro 27, 2009), e já possui um grande número de funções: de cálculo à exibição de string de caracteres até a possibilidade de tocar música!

## O interpretador (L'Atelier Linotte)

Como mencionado acima, Linotte é uma linguagem interpretada. Até agora, existe apenas um interpretador disponível, mas ele permanece livre.
Ele é chamado de "Atelier" pois é nele onde é desenvolvido todo o trabalho pelo programador. É desenvolvido em Java e é distribuído sob a GNU-GPL.
O ateliêr linote vem no pacote do Linotte que está disponível no site oficial, assim como bibliotecas, um manual e alguns exemplos também estão no pacote que está em formato.zip.

## Exemplo de um Hello World (Bonjour Tout Le Monde)

Os únicos requisitos são os conhecimentos dos comandos que são fáceis de se aprender pois estão muito próximos de um roteiro de um filme. Além disso, Linotte se difere da maioria das linguagens no que diz respeito à declaração das variáveis, aqui no lugar de variáveis são declarados "papéis" porém o princípio é o mesmo.

## Integrar Linotte com uma página web

É possível integrar uma applet em forma de botão para ler um livro (programa) linotte de uma página HTML.
Para isso é necessário acrescentar o seguinte código à sua página:
* No lugar de "https://web.archive.org/web/20160303174719/http://mon.site.a.moi.fr/mon_livre.liv" vai a URL com o endereço do seu livro Linotte.

## JINOTTE

Jinotte é a interface que permite utilizar o Linotte através da linha de comando de um sistema operacional.
Para executar um comando utilizando o Jinotte é necessário seguir a estrutura:
jinotte [opção]* [livro_linotte.liv]
As opções disponíveis são:
-v: Exibe a versão do interpretador Linotte -b: Executa um livro Linotte -h: Exibe as optções disponíveis -t: Exibe o tempo de execução de cada livro -x: Autorisa a utilisação de tela em modo console -s: Exibe un ícone do systray no lugar da barra de tarefas
Exemplos:
jinotte -bt livre\bienvenue.liv jinotte -bt livre\bienvenue.liv livre\helloword.liv
Execução:
Windows
Abrir uma sessão DOS, ir até o diretório de instalação do Linotte e em seguida digitar o seguinte comando:
jinotte -bt livre\bienvenue.liv
Linux e MacOS
Abrir um shell, ir até o diretório de instalação do Linotte e em seguida digitar o seguinte comando:
java -cp jinotte.jar -b livre\bienvenue.liv

## Le livre (O Livro)

Linotte funciona com um interpretador. Um interpretador é um programa que irá receber uma a uma as ordens a serem executadas e irá parar nas seguintes situações: se chegar ao fim da lista de ordens, se o você ordenar atráves de um comando ou se encontrar um erro. No caso de encontrar um erro ele irá mostrar a causa a fim de poder corrigir o erro.
Podemos comparar o interpretador Linotte com um roteirista cinematográfico.
A fim de que possa criar um roteiro para um filme, ele cria um cenário, uma lista de atores, os papéis dos atores e as ações que deveram cumprir os atores. Se o filme é muito longo ele pode dividi-lo em várias cenas.
O interpretador Linotte necessita das mesmas informações, no entanto elas são reagrupadas em um "Livre" que podemos associar a um cenário. As ações são detalhadas não mais em cenas mas em "Paragraphes".

## Les Paragraphes (Os parágrafos)

Voltemos ao roteirista. Ele decidiu criar um roteiro para um filme em três cenas diferentes: uma na cozinha, uma no corredor e uma na rua. Dois atores. Em Linotte um "Paragraphe" tem a mesma função de uma cena. Pode-se ir de um parágrafo a outro, bem como voltar a um já percorrido.
Segue um exemplo da utilização de "Paragraphes" em Linotte:
Este "Livre" exibe um mensagem perguntando ao usuário qual é a capital da França no "Paragraphe" Question. Em seguida verifica a resposta: caso for falsa o interpretador vai até o "Paragraphe" Réponse Fausse e caso a resposta seja verdadeira ele vai até o "Paragraphe" Réponse Bonne(este "Paragraphe" termina a execução do "Livre"). O "Paragraphe" Réponse Fausse exibe uma mensagem e depois volta para o parágrafo Question que já foi percorrido. É criado um laço que pode se tornar infinito se o usuário nào digitar a capital da França corretamente.
* Todo "Paragraphe" deve terminar ou pelo verbo "aller" ou pelo "terminer" (devidamente conjugados).

## Les Acteurs et les Rôles (Os atores e os papéis)

O computador possui uma memória onde pode-se gravar os dados que podem lidos, modificados ou suprimidos.
Os atores são a interface que vão permitir manipular essa memória pois eles são os mensageiros que contém as informações necessárias.
No início do "Paragraphe" define-se os atores que serão utilizados.
O interpretador Linotte vai reservar um espaço na memória para registrar os atores. Para um ator ele vai armazenar as informações que estão associadas a ele bem como o nome desse ator pois esse será o identificador que permitirá recuperar as informações sobre esse ator.
A declaração dos atores é realizada na seção "Rôles".
Existem três formas de criar um ator:
- Atribuindo um valor inicial: Le message est un texte de valeur "Bonjour" - Atribuindo um tipo: Le message est um texte - Atribuindo um valor inicial nulo(vazio): Le message est um texte vide
* É obrigatório declarar os atores no início do "Paragraphe".

## Les Rôles: texte e nombre (Os papéis: texte e nombre)

Linotte é uma linguagem tipada. Cada ator tem um "Rôle" (papel), ou seja, cada ator tem um tipo e não é possível alterá-lo uma vez definido esse tipo.
Os tipos mais simples em Linotte são: "texte" e "nombre".
Segue abaixo um exemplo usando os dois tipos:
* O interpretador Linotte não faz diferenciação de maiúsculas e minúsculas. Em contrapartida a acentuação é muito importante pois caso não seja respeitada o interpretador não irá reconhecer os comandos.
* Esse exemplo mostra que o interpretador pode transformar um valor de um ator do tipo "nombre" para o tipo "texte" (Tu ajoutes l’ âge dans le message). O inverso não é possível.
* É possível utilizarò sinal de + no lugar de "Tu ajoutes…dans Le…": Tu affiches message + âge.
* Em linote o tamanho das Strings é limitado apenas pela capacidade de memória do computador.
* O tipo "nombre" em linotte é um número decimal. Deve-se utilizar o ponto e não virgula como separador decimal.

## Impératif ou Présent? (Imperativo ou presente?)

É possível utilizar imperativo no lugar de presente durante a conjugação de um verbo. Assim, em vez de escrever: Tu affiches le document, pode-se escrever: Affiche le document.

## Les articles (Os artigos)

Os artigos são uma curiosidade da linguagem linotte pois sua única utilidade é melhorar a visibilidade de um programa escrito em Linotte para que fique mais próximo de uma linguagem humana. Assim, é mais agradável ler: tu affiche le message do que tu affiche message.
Segue a lista dos artigos mais comuns utilizados em Linotte: le, la, l', les, des, du, un, une, mon, ma, ton, ta, tes

## Les actions (As ações)

Escrever uma ação em um "livre"
É nada mais do que dar uma ordem ao interpretador utilizando qualquer frase começando por "tu" seguida de um verbo no presente do indicativo.
Exemplo:
* Deve-se escrever os comando todos na mesma linha por questões de melhor visibilidade, porém caso não de para colocar tudo na mesma linha são utilizados reticências para quebra de linha:

## Les casiers (As listas)

Casiers são papéis que permitem a criação de listas de atores: langage est un casier de texte valant "java", "c++", "logo", "linotte"
Pode-se construir igualmente uma lista de números: notes est un casier de nombre valant 15, 18, 12

## Les Acteurs Particuliers (Os atores particulares)

Na linguagem linotte existem atores à disposição que possuem valores dinâmicos ou estáticos(que somente podem ser lidos). Segue a lista de atores particulares existentes em Linotte:
année: contém o ano corrente mois: contém o número do mês corrente jour: contém o número do dia corrente heure: contém a hora corrente (em 24 horas) minute: contém o(s) minuto(s) corrente(s) seconde: contém o(s) segundo(s) corrente(s) version: contém a versão do interpretador Linotte que está sendo utilizada joker: ver o capítulo dos boucles auteur: contém o nome do autor do interpretador Linotte spécification: contém a versão das especificações do interpretador Linotte polices: casier que contém a lista de polices disponíveis suportadas pelo sistema sourisx: posição horizontal do mouse sourisy: posição vertical do mouse touche: marca das teclas création: contém o último ator criado com o verbo « créer » ecranv: altura vertical da tela ecranh: altura horizontal da tela couleurs: contém a lista das cores reconhecidas pelo Linotte livre: nome do livre que está sendo utilizado
Segue abaixo um exemplo que utiliza a hora e os segundos utilizado atores particulares:

## Les Grandes Rôles (Os grandes papéis)

Um grande rôle é um ator visível em todo um livre Linotte, ou seja, para utilizá-lo não é necessário declará-lo toda vez que iniciar um novo paragraphe.
Os grandes roles são definidos no inicio de um livre:
O fato de criar um ator somente uma vez para todo um livre permite otimizar e aumentar a execução de um livre linotte aumentando sua velocidade: o interpretador perde menos tempo criando (instanciando) outros atores na memória.

## Les commentaires (Os comentários)

Os cometários são utilizados para fazer anotações em um livre linotte ou desativar trechos de código.
Para fazer um comentário em linotte basta colocar (" no inicio de um comentário e ") no fim. Segue abaixo um exemplo:

## Les conditions (As condições)

As condições em linotte são frases que começam com si e são seguidas de um teste e depois de uma ação. Segue a lista das condições existentes em linotte:
si { artigo } [ator] est vide alors [ação] si { artigo } [ator] est non vide alors [ação] si { artigo } [ator] est plus grand que { artigo } [ator] alors [ação] si { artigo } [ator] est plus petit que { artigo } [ator] alors [ação] si { artigo } [ator] est moins grand que { artigo } [ator] alors [ação] si { artigo } [ator] est moins petit que { artigo } [ator] alors [ação] si { artigo } [ator] est égal à {article} [acteur] alors [ação] si { artigo } [ator] est différent de { artigo } [ator] alors [ação] si { artigo } [ator] contient { artigo } [ator] alors [ação] si { artigo } [espaço geográfico] est en collision avec { artigo } [espaço geográfico] alors [ação]
* Pode-se utilizar indiferentemente: grand/grande, petit/petite, différent/différente.
Segue abaixo um exemplo utilizando condições:
* Pode-se utilizar a condição sinon no inicio de uma frase:
* Ou alors:
* Pode-se utilizar ainda uma sequencia de sinons:
Exemplo:

## Les boucles e Le joker

As vezes é necessário repetir uma certa quantidade de vezes uma mesma instrução, como no exemplo abaixo:
Para simplificar o programa, pode-se utilizar uma boucle:
O interpretador irá executar o mesmo número de vezes o à que corresponde a varável compteur.
Em uma boucle (loop) o interpretador irá atribuir à variável joker o número de passagens pela boucle. Esse valor vai depender do rôle (tipo) do ator. No exemplo abaixo o ator compteur tem uma role nombre:
No tableau do atelier irá aparecer:
O joker é um ator particulier, ou seja, não se pode alterar seu valor e seu role (tipo) vai depender do ator que está sendo utilizado dentro da boucle (loop).
Segue abaixo o mesmo exemplo, no entanto utilizando um ator do tipo texte:
O resultado exibido no tableau será:
O rôle do joker tornou-se texte e o interpretador o decompôs em letras o ator compteur.
Segue um outro exemplo, percorrendo um carrier com uma boucle:
O resultado obtido no tableau será:
A utilização de uma boucle oferece a possibilidade de chamar uma parágraphe em cada passagem pela boucle e depois voltar para a mesma:
Será exibida a seguinte mensagem no tableau:
Quando é utilizado o verbo aller ou parcourir dentro de uma boucle o interpretador guarda na memória o lugar da chamada sobre uma pilha e quando encontrar o verbo revenir ele irá recuperar da pilha o último valor empilhado para continuar executando a partir daquele ponto.
DE....A
Segue um outro tipo de boucle que não utiliza nombre:
De A à B, tu affiches le joker
Se A é menor que B, o interpretador irá para quando A for maior que B. O funcionamento do joker é idêntico ao boucle Pour chaque.
Segue um exemplo:
A saída no tableau será:
Porém, se A é maior que B, então o valor de B será decrescente e irá parar quando B for maior que A:
Desta vez será exibida a seguida saída no tableau:
< 5 < 4 < 3 < 2 < 1
Tant que…
Essa boucle somente para se uma condição for satisfeita:
Segue um exemplo:
Supressão de um ator de um casier(lista)
Durante o percurso de um casier utilizando uma boucle, pode-se suprimir um elemento do casier utilizando o verbo ôter do ator particular joker:

## Les souffleurs

No teatro o souffleur é a pessoa que intervém quando o ator necessita de ajuda. Em Linotte o conceito é o mesmo.
Cria-se um souffleur no fim de um paragraphe e deve-se indicar quando ele deve "se manifestar" para ajudar ao ator.
Para criar um souffleur deve colocar no fim de um paragraphe o trecho seguinto:
Les souffleurs: Dés que mon nombre est égal a 0, tu vas vers la suíte
A sintaxe geral de um souffleur é:
Pode-se utilizar um souffleur em qualquer situação exceto dentro de uma boucle (loop).
Segue abaixo um exemplo de um programa com um souffleur que é executado infinitamente caso não haja um souffleur:
* Deve-se acrescentar o bloco souffleur sempre depois da declaração dos atores.
* Os souffleurs são acionados depois que a ação já foi realizada.

## Les Espèces (As espécies)

A noção de espécie no Linotte vem permitir um pouco de "programação orientada à objetos".
Uma espèce é um reagrupamento que partilha de características comuns.
Um chat é um espèce. Os chats têm as seguintes características: cor, idade, tamanho. Por exemplo, pode-se ter "Garfield " que possui a espèce chat: Garfiel é laranja, tem 15 meses de idade e mede 40 centímetros. Pode-se ter uma infinidade de chats com características diferentes ou até mesmo idênticas.
A noção de espécie no Linotte vem permitir um pouco de "programação orientada à objetos".
Uma espèce é um reagrupamento que partilha de características comuns.
Um chat é um espèce. Os chats têm as seguintes características: cor, idade, tamanho. Por exemplo, pode-se ter "Garfield " que possui a espèce chat: Garfiel é laranja, tem 15 meses de idade e mede 40 centímetros. Pode-se ter uma infinidade de chats com características diferentes ou até mesmo idênticas.
Para declarer um espèces deve-se colocar o bloco espèce no fim do livre Linotte:
A sintaxe geral para declaraçao de um expèce é a seguinte:
* Só é possível utilizar a expressão il a <valeur> <acteur> durante a criação de um ator que tenha um tipo espèce.
* Para utilizar um valor que pertence uma espèce é necessário utilizar a preposição "de":
Segue abaixo um exemplo completo da utilização de um espèce:
No tableau do atelier linotte sera exibido:
* É possível definir um valor inicial para uma característica de um espèce:
adresse est un texte valant "adresse inconnue"
Segue abaixo outro exemplo utilizando um casier de contacts:

## Les acteurs persistents (ou fichiers)

Para ler ou modificar um fichier no Linotte, deve-se indicar ao ator a localização do fichier no disco rígido de onde ele deve ser lido. Os atores que podem ser presistentes são aqueles que possuem os seguintes rôles:
texte nombre casier de textes casier de nombres espèce casier d'espèce
No momento da criação do ator, deve-se colocar "depuis" seguido do caminho do fichier:
Se o fichier não existir: - Quando o interpretador tentar fazer a leitura irá retornar um chaîne (vetor) vazio. - Caso atribua-se um valor o intepretador Linotte irá criar um valor fichier com o valor atribuído no disco rígido.
Exemplo 1:
Exemplo 2:
* Se estiver utilizando o MS Windows, o caminho deve ter a seguinte forma:
"c:\linotte\mon_message.txt"
* Tenha certeza de que o diretório existe, pois o Linotte não irá criá-lo.

## Charger un fichier depuis internet

É possível carregar um dado de fichiers armazenados em um site na internet. Para isso o nome do fichier deve começar com « http:// ».
Exemplo:
As imagens são igualmente carregáveis através da internet: