Visibilidade De Variáveis
Existem quatro tipos básicos de variáveis no NetLogo no que respeita à sua visibilidade, isto é, de que partes do código cada tipo de variável pode ser acedida, tanto para leitura como para modificação. Esses tipos são:
Variáveis globais, definidas pela primitiva globals usada no início do código, ou criadas por intermédio de elementos do interface como sliders, switches, ou choices (menus). Quando uma variável é associada a um slider, por exemplo, já não deve (nem pode) ser declarada com a primitiva globals. Apenas as variáveis globais para "uso interno" devem ser declaradas dessa maneira.
Variáveis de patch. São definidas com a primitiva patches-own no início do código (antes de quaisquer procedimentos). O NetLogo possui algumas variáveis deste tipo pré-definidas, e estas não podem ser declaradas.
Variáveis de turtle. São definidas com a primitiva turtles-own no início do código, ou, para o caso de variáveis pertencentes apenas a um tipo de turtle com o nome tipo (declarado com a primitiva breeds), deve-se usar a primitiva tipo-own. Existem variáveis de turtle pré-definidas.
Variáveis locais. São variáveis auxiliares particulares a um procedimento e que servem para guardar valores intermédios de cálculos, por exemplo. Definem-se com a primitiva locals, que deve aparecer dentro do procedimento, a seguir à instrução to nome-do-procedimento, mas antes de quaisquer outras instruções.
Existe uma diferença crucial entre os vários tipos de variáveis, além da sua visibilidade: A sua existência.
Para cada variável global, existe sempre uma e apenas uma instância dessa variável, ou seja, todas as referências ao nome dessa variável, em qualquer parte do código, e feitas por qualquer agente, referem-se aos mesmos conteúdos. Se um agente modificar esse conteúdo, a modificação é vista por todos os agentes.
Para as variáveis de patch ou de turtle, o comportamento é diferente. Num dado momento, existem tantas variáveis com um determinado nome como o número de agentes que possuem essa variável. Por exemplo, se declararmos turtles-own [ idade ], e existirem, num dado momento, 100 turtles, então existem 100 instâncias da variável idade. Isto é, cada turtle possui a sua, independentemente das outras. Se uma turtle executar set idade idade + 1, essa instrução modifica apenas a sua própria variável idade, permanecendo as outras (pertencentes a outras turtles) inalteradas. Em princípio (excepto no caso descrito à frente), apenas um agente pode aceder às suas próprias variáveis (não globais). Isto é, se tentássemos executar a mesma instrução no domínio do observer ou de um patch, obteríamos um erro de compilação. Quando uma turtle é criada ou destruída, as suas variáveis próprias são também criadas ou destruídas, respectivamente, e, neste último caso, os conteúdos das variáveis perdem-se.
Quanto às variáveis locais, estas existem apenas quando o procedimento onde estão declaradas está a executar. Assim, em cada instante, pode existir um qualquer número de instâncias da mesma variável, uma para cada agente que esteja a executar esse procedimento (ver Sincronização para esclarecimentos sobre o conceito de agentes a executarem em paralelo). Não existe nenhuma maneira de um procedimento aceder às variáveis locais doutro procedimento (nem isso teria qualquer utilidade). Além disso, quando um procedimento termina a sua execução para um determinado agente, as instâncias correspondentes das suas variáveis locais são destruídas, isto é, não deixam apenas de ser visíveis: Se o mesmo agente voltar a executar o mesmo procedimento, os antigos conteúdos que as variáveis locais tinham no fim da execução anterior estão perdidos.
Todas as variáveis, de todos os tipos, têm que ter nomes únicos. O único caso em que pode haver repetição do nome de uma variável é entre variáveis locais de procedimentos diferentes.
De um modo geral, as regras de visibilidade de uma variável (isto é, poder aceder a uma determinada variável, tanto para leitura como para escrita) são as seguintes:
Todas as variáveis globais são visíveis de qualquer parte do código, por qualquer agente (domínio de
execução), e o mesmo nome refere-se sempre à mesma variável (instância).
As variáveis locais só existem e são visíveis dentro do procedimento onde estão declaradas,
independentemente do agente que executa o procedimento. No caso do mesmo procedimento ser executado
simultaneamente por vários agentes, cada agente acede à sua própria instância dessa variável, sendo as
várias instâncias completamente independentes.
Quando um agente executa, as únicas variáveis (excepto variáveis locais do procedimento actual) a que pode
aceder são exactamente estas:
O observer apenas pode aceder a variáveis globais.
Um patch particular pode aceder às variáveis globais e à sua própria instância das variáveis de patch.
Uma turtle pode aceder às variáveis globais, à sua instância das variáveis de turtle (pré-definidas e
definidas com a primitiva turtles-own) e à sua instância das variáveis pertencentes à eventual breed
particular da turtle em questão (definidas com a primitiva breed-own). Além disso, uma turtle
pode sempre aceder directamente às variáveis do patch que se encontra por baixo de si (uma turtle está
sempre colocada em cima de um patch particular, qualquer que seja a sua posição).
No entanto, o NetLogo põe à disposição um mecanismo para que qualquer agente (incluíndo o observer) possa aceder (ler ou modificar) uma variável doutro agente particular (turtle ou patch):
Ao nome de uma variável de turtle ou patch pode ser acrescentado o sufixo -of, seguido do agente
particular a cuja variável se deseja aceder. Usando o exemplo acima, o observer não pode executar a
instrução set idade 0 (idade é uma variável de turtle), mas pode executar set idade-of
turtle 123 0, que significa que está a pôr a instância da variável idade da turtle com o número
123 (todas as turtles têm um número único, ver à frente) com o valor 0. Ou seja, esta instrução é
equivalente a ask turtle 123 [ set idade 0 ]. No entanto, se quisermos ler o valor da variável, por
exemplo, para o copiar para a variável global gvar, é mais fácil usar o sufixo -of:
set gvar idade-of turtle 123
Mas também podíamos fazer ask turtle 123 [ set gvar idade ]. Por outro lado, se quisermos modificar
simultaneamente todas as instâncias de uma variável de um conjunto de agentes, não poderíamos usar o sufixo
-of (que apenas trabalha com agentes particulares, ou seja, um de cada vez). Teríamos que usar
ask. Por exemplo:
ask patches [ set pcolor white ]
Poría todos os patches com a cor branca.
Como é evidente, o sufixo -of não pode ser usado para aceder a variáveis globais ou locais. Note-se também que uma turtle não precisa de usar este sufixo para aceder a uma variável do patch no qual se encontra. Por exemplo, para tornar o patch que está por baixo de uma turtle em vermelho, esta pode fazer apenas set pcolor red, em vez de set pcolor-of patch-here red, o que é completamente equivalente. (Também poderia usar a primitiva stamp para este efeito: stamp red) No entanto, um patch não pode aceder directamente, da mesma maneira, às variáveis de uma turtle que se encontre por cima, pois pode não haver nenhuma ou haver várias.
Esta secção termina com uma lista de variáveis pré-definidas pelo NetLogo.
Nome | Tipo | Descrição |
breed | turtle (leitura/escrita) | Nome do conjunto de agentes ("subespécie") a que pertence esta turtle. |
color | turtle (leitura/escrita) | Cor actual da turtle. |
dx | turtle (leitura) | sin heading |
dy | turtle (leitura) | cos heading |
heading | turtle (leitura/escrita) | Ângulo (em graus) segundo o qual a turtle está orientada. |
hidden? | turtle (leitura/escrita) | Variável booleana que indica se a turtle é visível na janela gráfica. |
mouse-down? | global (leitura) | Variável booleana que indica se o botão esquerdo do rato está premido, com o cursor dentro da janela gráfica. |
mouse-xcor | global (leitura) | Coordenada X do cursor do rato dentro da janela gráfica. |
mouse-ycor | global (leitura) | Coordenada Y do cursor do rato dentro da janela gráfica. |
myself | patch/turtle (leitura) | Designa o agente que pediu ao agente actual para executar código. |
pcolor | patch (leitura/escrita) | Cor actual do patch. |
pxcor | patch (leitura) | Coordenada X do patch. |
pycor | patch (leitura) | Coordenada Y do patch. |
screen-edge-x | global (leitura) | Coordenada X máxima da janela gráfica. |
screen-edge-y | global (leitura) | Coordenada Y máxima da janela gráfica. |
screen-size-x | global (leitura) | 2 * screen-edge-x + 1 |
screen-size-y | global (leitura) | 2 * screen-edge-y + 1 |
self | patch/turtle (leitura) | Designa o agente actual. |
shape | turtle (leitura/escrita) | Nome do objecto gráfico que dá forma a esta turtle. |
size | turtle (leitura/escrita) | Tamanho da turtle na janela gráfica. |
timer | global (leitura) | Número de segundos passados desde que a instrução reset-timer foi executada. |
who | turtle (leitura) | Número da turtle. |
xcor | turtle (leitura/escrita) | Coordenada X actual da turtle. |
ycor | turtle (leitura/escrita) | Coordenada Y actual da turtle. |
©opyright 2004, Centro de Física Teórica e Computacional