# Alice (linguagem de programação)

Alice é uma linguagem de programação funcional, concebida pelo Laboratório de Programação de Sistemas da Universidade do Sarre. Trata-se de um dialeto do Standard ML, complementado com suporte a avaliação atrasada, concorrência (multithreading e computação distribuída através de chamadas de procedimento remoto) e programação com restrições.
A implementação da linguagem Alice da Universidade do Sarre usa a máquina virtual SEAM (Simple Extensible Abstract Machine). Trata-se de um software livre que tem entre suas características compilação just in time e código nativo para a arquitetura x86.

## Visão global

As versões iniciais de Alice eram executadas na máquina virtual Mozart/Oz, permitindo interação entre o código em Alice e o código em Oz. Chamadas a procedimentos remotos em Alice dependem da máquina virtual, porque ela pode, de fato, enviar código a ser computado a partir de um computador para outro.
Alice é um ambiente de programação tridimensional de fácil utilização no qual podem ser criadas animações e interações entre personagens e objetos lembrando muito jogos de vídeo game. Desenvolvido pela Universidade Carnegie Mellon, localizada na cidade de Pittsburgh, Pensilvânia, Estados Unidos, o objetivo do software Alice é ensinar os principais conceitos de programação aos alunos do Ensino Médio. Posteriormente, devido a sua facilidade e compreensão, o alvo de estudo ao Alice tornou-se a Lógica Computacional.
O programa Alice basicamente compreende um ambiente virtual denominado World (Mundo), onde as interações acontecem. A partir de elementos pré-programados que acompanham o ambiente, é possível criar histórias seguindo uma construção lógica. Cada objeto possui características próprias com classes básicas que podem ser modificadas e organizadas a maneira do programador.
A primeira versão do software Alice foi disponibilizada para download em 1999 e já passou por inúmeras atualizações, porém, ainda é uma versão parcial. Inicialmente, o projeto era pequeno com o intuito de ensinar os conceitos básicos de programação aos alunos do Ensino Médio. Com o tempo, o projeto cresceu, conseguiu o financiamento de grandes empresas na área de software e, atualmente, conta com vários colaboradores, professores e pesquisadores não só da Universidade Carnegie Mellon, mas também provenientes de outras universidades. Os primeiros e principais financiadores do projeto são a Microsoft e a SunMicrosystems.

## Exemplo

Objectos, em programação, são representações físicas ou não com limites bem definidos e que podem realizar ou sofrer ações através dos métodos no ambiente em que está inserido. No Alice, alguns objetos possuem o sinal “+” ao lado esquerdo de seu nome, o que indica que tais objetos são compostos por outras partes, também denominadas objetos. Clicando sobre cada um dos objetos, na área abaixo da lista, Área de Detalhes, região 4, irão aparecer os principais métodos do objeto selecionado. Também na Área de Detalhes, existe a aba Propriedades (Properties). Outras propriedades como tamanho e para deslocar os objetos são encontradas no Mundo no botão Add Object.
Cada objeto possui 21 métodos e são os mesmos para todos os objetos do ambiente. São os métodos fundamentais e não podem ser alterados. É com esses métodos que o programador poderá juntá-los de diferentes formas. É através da junção dos métodos fundamentais que poderão ser criados novos métodos. Esses métodos criam as animações que podem ser visualizadas no Mundo. Basta clicar sobre elas e arrastá-las para a região à direita identificada pelo número 6, Área de Edição. Métodos também podem ser eventos, se arrastados para a região 4, Área de Eventos. Através de um evento, pode-se criar movimentos contínuos ou limitados ao andamento da animação. Também é possível criar interações com as animações através de periféricos do computador como o mouse e o teclado, por exemplo.
A região de principal interesse é a marcada pelo número 6, Área de Edição, onde é possível criar parâmetros e variáveis através dos respectivos botões. No rodapé dessa região, encontram-se as Funções Lógicas. As principais funções lógicas são Do in order, Do together, If/Else, Loop, While, For all in order, For all together e as auxiliares Wait e Print. As funções e os métodos são arrastados para a Área de Edição.
Quanto às funções do ambiente, é necessário que os métodos estejam dentro delas para que sejam executadas. Na utilização de mais de um método, verifique se existem outros métodos ou eventos associados entre si quando for fazer a visualização da animação.
É a função que determina a realização seqüencial dos métodos. Porém, o ambiente Alice, por padrão, já executa os comandos dessa forma. Métodos seqüenciais são métodos em etapas. Assim, o método seguinte somente será executado quando o método atual concluir sua execução. Sua utilidade surge quando estamos usando funções que não são executadas seqüencialmente e, dentro dessas, usamos a função Do in order. Para utilizar essa função, basta clicar com o botão esquerdo do mouse sobre a função e arrastá-la para a Área de Edição. Os métodos devem estar dentro da função para que os mesmos sejam executados em ordem seqüencial.
É a função essencial para movimentos em conjunto. Todos os métodos que estiverem dentro da função Do together serão realizados ao mesmo tempo. É bom observar que métodos diferentes possuem durações diferentes. Para utilização, clicamos com o botão esquerdo do mouse sobre a função e a movemos para a Área de Edição.
A função If/Else é certamente uma das funções mais essenciais para a elaboração de uma ação em programação. Essa função necessita de dois resultados, porém, isso não é obrigatório. Para uma expressão arbitrária, dizemos que, se a função If possuir o resultado afirmativo, os métodos existentes em seu interior serão executados, caso contrário, serão executados os métodos existentes no interior da função Else. Com o botão esquerdo do mouse, clicamos sobre a função e a arrastamos para a Área de Edição.
A função Loop determina a quantidade de vezes que uma ação, método ou função vai se repetir. As repetições somente podem ser números naturais até o infinito. A função Loop é usada para movimentos contínuos, assim, não é necessário repetir o mesmo código várias vezes. O Loop repetirá a ação tantas vezes forem necessárias. Para utilização, a função deve ser arrastada para a Área de Edição como as outras.
A função While é bem parecida com a função Loop. A diferença está no fato da repetição ser condicional, isto é, a função realizará a avaliação de uma expressão antes de iniciar sua execução. A função While pode ser descrita como a junção da função Loop com a função If/Else. Se a condição for verdadeira, a função While é executada, senão, avança para o método imediatamente abaixo. Somente através de outra instrução é possível parar a execução da função While. Após arrastar essa função para a Área de Edição, os métodos devem ser inseridos dentro da mesma.
É uma das funções para a manipulação de listas. Nessa função, somente será possível modificar ou realizar uma ação em um objeto de cada vez. Ao criar uma lista, você adiciona os objetos na mesma e qualquer comando que envolva a lista se refletirá nos objetos, dependendo do que a lista é composta, se é de objetos ou partes de objetos. Essa função avança de um em um objeto na ordem que foram adicionados na lista criada.
É uma lista para mover todos de uma só vez. Ao criar uma lista, você adiciona os objetos na mesma e os comandos afetam todos os objetos ao mesmo tempo e de uma única vez. A forma de adicionar a função e de criar as listas é idêntica a da função anterior.
Os Eventos que podem ser criados no ambiente Alice podem ser métodos, variáveis ou algum comando que tenha uma reação através do teclado ou mouse. Os eventos constituem ações ou pedaços de animações que irão acontecer no decorrer da história ou animação criada. É comumente usado para sons e para interação.
Os eventos não-interativos possuem uma execução breve ou contínua. O fato de não serem interativos é que não utilizam periféricos para ocorrerem. Normalmente são métodos, funções ou objetos que estão inseridos no evento.
São Eventos Interativos: When a key is typed, When the mouse is clicked on something, Let the mouse move <object>, Let the arrow key move <subject>, Let the mouse move the camera, Let the mouse orient the camera.