# UCBLogo

UCBLogo, também conhecido como Berkeley Logo, é bastante próximo de uma linguagem de programação Logo padrão, com suas facilidades para manipular listas, arquivos, entrada e saída e recursão em scripts, podendo ser utilizado para ensinar a maior parte dos conceitos científicos, como o professor Brian Harvey, da Universidade da Califórnia em Berkeley fez em sua trilogia Computer Science Logo Style.

## Interface

O UCBLogo possui uma interface gráfica bastante rudimentar. Alguns projetos semelhantes fornecem uma interface mais aprimorada. O MSWLogo e o seu sucessor FMSLogo, para Microsoft Windows, são usados em algumas escolas do Reino Unido e da Austrália. Também há soluções em software livre, como o KTurtle.

## Design

A linguagem Logo foi projetada com o espírito de "piso baixo e teto alto", que possibilita acesso fácil aos novatos e atende às necessidades de usuários avançados. As animações exigem habilidades de desenhar e de apagar formas. O processo é o mesmo, exceto que naquela uma linha é registrada no visor e nesta uma linha é removida. Usando-se a analogia da tartaruga, a sua caneta precisa pintar e precisa apagar. A tartaruga pode ser configurada para apagar tudo abaixo dela, através do comando PENERASE (PE), enquanto a caneta pode ser configurada para começar a desenhar novamente com o comando PENPAINT (PPT).

### A caneta

A analogia de uma tartaruga com uma caneta presa à sua cauda é frequentemente usada. A caneta da tartaruga pode ser levantada e baixada, desenhando, assim, uma linha pontilhada.
Um código de exemplo:

### Dados

O UCBLogo possui três tipos de dados:
* a palavra
* a lista
* a matriz
Um número é um caso especial de palavra.
Não há tipagem estática. O interpretador detecta o tipo de dados pelo contexto.
Há dois símbolos importantes:
* Dois pontos (:) significa o conteúdo de. Esse é um símbolo extremamente útil que lembra aos estudantes que uma variável é realmente algum 'lugar' na memória.
* As aspas (") significam a palavra é avaliada como ela mesma, ou seu valor após a avaliação é o mesmo que era antes. Para usuários de outras linguagens de programação: As aspas não são emparelhadas como aspas simples que abrem e que fecham.
Um número é um tipo especial de auto-avaliação: ele realmente pode ser escrito com uma aspa simples. 2 é realmente "2.
A atribuição de variáveis (por exemoplo: x := y + 3) é tratada no Logo com o comando make, como exemplificado por essas duas afirmações equivalentes:
make recebe dois parâmetros, o segundo dos quais aqui é sum :y "3. sum recebe dois 'parâmetros' e é uma 'operação', por conseguinte, o cálculo é possível. "3 é avaliado para 3, e :y recebe os conteúdos da coisa chamada y, estas são somadas, devolvendo um número.
O efeito de make é colocar o resultado no primeiro parâmetro. De uma perspectiva programática, o primeiro argumento de make é passado por referência, enquanto que o segundo é passado por valor.

#### Escopo

Variáveis não precisam ser declaradas antes de seu uso; seu escopo é, então, global.
Uma variável pode ser declarada local, aí seu escopo é limitado àquele procedimento e a quaisquer procedimentos que ele chamar (também conhecido como escopo dinâmico). Chamar um procedimento com entradas (o nome geralmente utilizado para argumentos na literatura Logo) também cria variáveis locais que contém os valores dos argumentos.

#### Listas

O Logo herda as listas do Lisp, e elas são seu método primário de armazenar vetores. Matrizes também são fornecidas.
* Operadores existem para converter palavras em listas e listas em matrizes, bem como o caminho inverso.
* Esse tipo de dados possui a vantagem sobre as matrizes, que são infinitamente expansíveis. Os dados são extraídos usando as operações em primeiro lugar, butfirst, último, butlast, butmember, membro e item. Elementos de dados são adicionados usando as sentenças fput e lput.
* Uma lista pode ser considerada uma fila com os operadores queue e dequeue, ou uma pilha com as operações push e pop.
* Recursão, em vez da iteração, é o método natural para processar listas.

#### Comandos de controle de estrutura

O Logo fornece muitas estruturas de controle comuns.
Existe uma estrutura de seleção:
* ifelse teste [ lista de instruções se verdadeiro ] [ lista de instruções se falso ]
Há três comandos de iteração:
* while condição [ lista de instruções ]
* until condição [ lista de instruções ]
* repeat número [ lista de instruções ]
A Recursividade é o paradigma de processamento preferido do Logo.

#### Modelo de iteração

O Logo também fornece estruturas de controle baseadas em listas. A ideia básica é de duas listas:
cada comando é aplicado por sua vez a cada um dos itens de dados. Há muitos desses comandos modelo com nomes como MAP, APPLY, FILTER, FOREACH, REDUCE e CASCADE. Eles representam quatro tipos de modelos de iteração, conhecidos como ranhura explícita, procedimento nomeado, ranhura nomeada (ou Lambda) e procedimento-texto.

#### Listas de propriedades

Uma lista de propriedades é uma lista especial onde os itens ímpares são nomes de propriedades e os pares são seus respectivos valores. Existem três comandos para processar listas de propriedades:

### Entrada/Saída

O texto pode ser escrito para a janela de comandos (fluxo de saída) utilizando-se print e para a janela gráfica utilizando-se label.
Os comandos padrão são readlist readword readchar com o fluxo de entrada normal sendo o teclado. Na tradição Unix, o fluxo de entrada pode ser modificado, logo a entrada pode vir de um arquivo em disco. Similarmente, a saída pode ser redirecionada.

## Sintaxe

Os Comandos podem ser escritos em uma ou mais linhas. Muitos comandos possuem formas mnemônicas curtas; por exemplo FORWARD e RIGHT são codificados FD e RT respectivamente. Isso torna a entrada abreviada. Qualquer coisa escrita após o ; (ponto-e-vírgula) é ignorada, permitindo ao programador inserir comentários.
O programa Alô mundo em Logo parece com:

### Loops

Existem três comandos de loop (repetição):REPEAT é um deles. O código a seguir desenha um quadrado:
O comando FD 100 LEFT 90 é executado quatro vezes.
Uma aproximação de um círculo pode ser construída facilmente com 360 pequenas rotações e um passo adiante: REPEAT 360 [FD 1 RIGHT 1]. Os loops podem ser alinhados, fornecendo resultados significativos com pequeno esforço.
Outro exemplo de loops alinhados:

### Funções e procedimentos

Cada linha é composta de chamadas de funções, ou subrotinas na terminologia da programação, das quais existem dois tipos:
* comandos (que fazem algo mas não retornam um valor) como print.
* operações (que apenas retornam um valor, sua saída) como sum, first ou readlist.
Um comando é similar a um procedimento da linguagem Pascal e uma operação é similar a uma função dessa linguagem. Um subconjunto especial de operações, chamados predicados, que apenas retornam a palavra true ou false sao convenientemente escritos com um p final. Exemplos incluem emptyp, wordp, e listp.
* As expressões podem ser primitivas, ou podem ser definidas pelo usuário.
* Expressões podem ter zero, um ou mais parâmetros.
Os Procedimentos podem ser definidos na linha de comando, usando-se o par TO END :
No entanto, em algumas das primeiras versões do Logo, o procedimento é limitado ao comprimento físico da linha do dispositivo de entrada.
Todos os ambientes Logo podem invocar um editor, geralmente através de EDALL. No editor, os procedimentos podem ser escritos em várias linhas, pois nada é interpretado até a edição estar completa.
A nova palavra é salva no vocabulário disponível, mas a definição será perdida uma vez que a sessão do Logo acabar. Internamente, os procedimentos são palavras e, neste caso, toda vez que CHAIR for introduzida, a sequência REPEAT 4 [FD 100 LEFT 90] FD 200 será executada. A palavra CHAIR pode ser usada como um comando; por exemplo, REPEAT 4 [CHAIR] repetiria a operação CHAIR quatro vezes.
Uma espera WAIT entre o desenho e o apagamento pode introduzir a ilusão de movimento:

### Argumentos/parâmetros

O Logo pode fornecer informação extra à suas palavras e retornar informação. O procedimento (palavra) é instruído para esperar algo e fornecer um nome. Os dois pontos são utilizados para esse propósito. Ele passa a informação por valor e os dois pontos são pronunciados como o valor de. Quando o procedimento é executado com um comando tal qual CHAIR 200, a palavra :thesize pega o valor 200, então quando FD :thesize é executado, o interpretador entende FD, o valor de 200.

### Outras notas

A Matemática utiliza notação prefixada, como: sum :x :y, product :x :y, difference :x :y, quotient :x :y. A notação infixa também está disponivel.
O Logo permite recursividade, que é o processo onde um procedimento chama a si próprio.