smalltalk-2-trabalho [CLP - BCC/UFPEL]
Trace: • smalltalk-2-trabalho
Composição dos Nomes
Variáveis Temporárias
Variáveis de Instância com Nome
Variáveis de Instância Indexada
Variáveis de Instância de Classes
Semântica da Atribuição
Variáveis partilhadas
Grupo: Guilherme Povala e Lívia Amaral
Smalltalk é case sensitive, ou seja, a linguagem é sensível a caracteres maiúsculos e minúsculos. O nome da variável deve começar com uma letra minúscula, seguido de quaisquer letras, números ou caractere de sublinhar. É uma convenção Smalltalk usar letras maiúsculas para separar palavras no mesmo nome de variável. Um exemplo seria uma variável chamada nomeDoEstudante.
Atualmente, não há limites de caracteres para nomes de variáveis.
Apenas 5 palavras-chave de Smalltalk são reservadas:
true, false, nil, self, super
Em Smalltalk faz-se a distinção entre variáveis e bindings. Em termos gerais, uma variável é uma associação entre um nome (identificador) e um valor guardado numa certa localização. Em termos gerais, o binding estabelece a correspondência entre o espaço de nomes de um programa e o conjunto de entidades manipuladas pelo programa. Em Smalltalk, os bindings distinguem-se da variáveis no sentido em que suportam operações adicionais e frequentemente têm um valor constante.
Em Smalltalk as variáveis são tipificadas dinamicamente. Isto significa que uma variável pode conter objetos de qualquer tipo (classe) e, portanto, em instantes diferentes da sua vida pode conter objetos de tipos diferentes.
Em linguagens com tipificação estática o tipo de cada identificador é conhecido em tempo de compilação através da sua declaração. A tipificação estática possibilita a escrita de programas mais claros, com uma interpretação mais rígida, maior apoio do compilador e maior facilidade de otimização. No entanto, impõe restrições algo excessivas. A tipificação dinâmica possibilita uma grande flexibilidade de escrita mas tem como contrapartida o fato dos eventuais erros só virem a ser detectados tardiamente.
Temporárias Variáveis Partilhadas
Instância Classes
Variáveis de instância de classes Espaços Nominativos
Não há tipos primitivos, ao contrário de outras linguagens orientadas a objeto; strings, números e caracteres são implementados como classes em Smalltalk, por isso esta linguagem é considerada puramente orientada a objetos. Tecnicamente, todo elemento de Smalltalk é um objeto de primeira ordem.
O tempo de vida de uma variável temporária inicia-se quando é declarada num método, ou num bloco, e termina quando o bloco, ou método, termina o processamento. São declaradas entre barras verticais e variáveis diferentes são separadas por um ou mais espaços, tabs, ou geral por white-space characters.
| umaVariável duasVariáveis |
As variáveis de instância guardam informação relativa a uma instância (ou objeto). Em geral, objetos diferentes têm valores diferentes nas suas variáveis de instância.
Este tipo de variáveis são declaradas na definição da classe. Todas as instâncias da classe terão a sua própria cópia da variável. As variáveis serão acedidas pelo seu nome.
Este tipo de variáveis não têm nome; são acedidas por um índice inteiro. Instâncias (objetos) diferentes de uma classe podem ter números diferentes de variáveis de instância indexadas. As coleções, variam em tamanho, e portanto têm uma variável de instância indexada para cada um dos seus elementos.
| umArray |
umArray := #( 1 'dois' 3 ).
A instância umArray tem 3 variáveis de instância indexadas acessíveis através de mensagens como at: e at: put:
Uma variável cujo alcance é uma classe e que é usada para guardar dados que podem ser diferentes em cada uma das subclasses da classe onde foi definida. As variáveis de instância de classes são declaradas na definição de classe. Cada subclasse dessa classe tem a sua própria cópia da variável e pode também fazer atribuições independentemente das outras classes da hierarquia. As variáveis de instância de classe são privadas para a classe onde são definidas e para suas subclasses pelo que só podem ser acendidas por métodos de classes.
Cada uma das subclasses Português e Inglês pode inicializar a sua cópia da variável wordCollection independentemente.
Como não há tipos em Smalltalk, apenas declarações implícitas são aceitas.
A declaração de uma variável é dada entre duas barras
i := 1 + (5 * 6)
"O retorno dado será 31"
O valor por omissão ("default value") para qualquer variável é o objeto nil. Para atribuir um novo valor a uma variável usa-se o operador ':='. Na memória as variáveis são representadas por um identificador de objeto ("object pointer").
aPoint := 3.2 @ 1.0
Como todas as atribuições e passagem de parâmetros em Smalltalk são feitas por referência, os apelidos passam a ser parte integral da linguagem.
A expressão obj1 := obj2 significa "liga o obj1 ao objeto referenciado por obj2" e não "copia o conteúdo do obj2 para o espaço de memória reservado para obj1". Assim, obj1 e obj2 referem o mesmo objeto.
| obj1 obj2 | " 1) "
obj1 := 1.5 @ 3.2. " 2) "
obj2 := obj1. " 3) "
obj2 y: 10. " 4) "
^obj1 " responde 1.5@10"
Ao avaliar a expressão "3)", as mensagens que podem ser enviadas para obj2 são alteradas. A partir daquele momento, as mensagens aceites por obj2 são as correspondentes aos métodos de instância definidos na classe do objeto que obj2 referencia. Neste caso estamos a falar da classe Point. O Smalltalk tem gestão automática de memória, pelo que a libertação de objetos mortos (inacessíveis ao programador) é automática.
Neste momento, os bindings são utilizados na implementação de variáveis partilhadas, classes e espaços nominativos (name spaces).
As variáveis partilhadas (às vezes também chamadas statics) são bindings acessíveis a vários objetos. Uma variável partilhada é definida relativamente a uma classe ou a um espaço nominativo, e o seu tempo de vida coincide com o tempo de vida da classe ou do espaço nominativo. O seu valor pode ser declarado variável ou constante. Uma variável partilhada constante gera um erro se for feita alguma tentativa de alterar o seu valor.
Quando definidas relativamente a uma classe, as variáveis partilhadas são usadas para guardar dados úteis a todas as instâncias da classe e das suas subclasses. Ex.: A classe
Date tem uma variável partilhada chamada MonthNames cujo valor é um array contendo os nomes dos 12 meses do ano e que está acessível a todos os objetos da classe.
Os nomes das variáveis partilhadas começam por uma maiúscula e o seu valor é logicamente independente de qualquer objeto.
Quando definidas relativamente a um espaço nominativo, as variáveis partilhadas podem ser vistas como variáveis globais nesse espaço, i.e., estão acessíveis a todos os objetos desse espaço.
Atualmente, uma classe é vista como um binding constante associando o nome da classe ao objeto que a define.
Como em Smalltalk, a vinculação ocorre primeiramente durante o tempo de execução e pode mudar durante o curso da execução do programa, a vinculação dessa linguagem é dita dinâmica.