Domínios De Execução



Esta secção analisa em maior detalhe os diferentes tipos de contexto (domínios de execução) em que as instruções que compõem o código de um modelo NetLogo podem executar.

Como já foi referido na introdução (Capítulo 0), existem três tipos básicos de agente que podem executar código: O observer, os patches, e as turtles.

O observer é o domínio inicial, ou por defeito, em que um modelo NetLogo começa normalmente a executar. Existe exactamente um observer, que se mantém constante ao longo de todo o funcionamento do NetLogo (para qualquer modelo). Por outro lado, os outros dois tipos de agente são em número variável: O número de patches pode variar de modelo para modelo, e até ser diferente para duas execuções do mesmo modelo (no entanto, é necessário interromper toda a execução antes de se poderem criar ou destruir patches). A única maneira de determinar o número de patches em existência é modificando as dimensões da janela gráfica. Para as menores dimensões possíveis (X=0 e Y=0), obtém-se um único patch, com coordenadas (0,0). Portanto, o número mínimo possível de patches em existência é um, sendo que o número exacto é sempre igual a screen-size-x * screen-size-y. As turtles apresentam ainda mais flexibilidade, uma vez que podem ser criadas e destruídas ao longo da execução de um modelo (sendo essa criação e destruição comandada por instruções no código do programa). Pode existir, em qualquer altura, um qualquer número de turtles, incluíndo zero.

Normalmente, toda a execução de um modelo NetLogo começa com a activação de botões no interface desse modelo. Ou seja, o botão, ao ser premido, executa o código que lhe foi associado pelo utilizador ao ser criado. Usualmente (mas não obrigatoriamente), esse código não é um conjunto de instruções, mas sim o nome de um procedimento definido pelo utilizador e que desempenha a função que esse botão representa. A única e rara excepção a essa regra encontra-se explicada a seguir.

É possível definir um procedimento que, em vez de ser invocado por um botão ou outro procedimento, é executado imediatamente a seguir ao modelo ser carregado no NetLogo (através da opção de menu File->Open... ou File->Models Library). Este procedimento escreve-se como outro procedimento qualquer, executando no domínio do observer, excepto que o seu nome tem que ser startup. Tal procedimento poderia ser usado, por exemplo, para inicializar um modelo imediatamente em vez de esperar que o utilizador premisse um botão.

Apesar do domínio de execução por defeito ser o do observer, tem que existir uma maneira de fazer executar instruções ou procedimentos no contexto doutro agente (patch ou turtle). Na verdade, existem três maneiras: Chamando essas instruções ou procedimentos a partir de um procedimento que já esteja a correr no domínio desejado (ou seja, os domínios de execução são "herdados" de uns procedimentos para outros), usando a primitiva ask, ou modificando o botão associado a um procedimento para que execute automaticamente noutro domínio (ver figura).

Quando o domínio de execução deixa o observer e passa para outro tipo de agente, já não é possível, a partir desse agente, fazer executar código no domínio do observer. Ou seja, não se pode fazer ask observer [ instruções ... ]. A única maneira de fazer executar código no domínio do observer é associando-o a um botão que corre no domínio do observer (que é a associação por defeito), ou usando o procedimento startup, descrito acima.

Nem todos os procedimentos ou blocos de instruções podem ser executados em domínios diferentes.

Por exemplo, se var for uma variável global, a instrução set var 0 pode ser executada em qualquer domínio, pois não existe dúvida sobre qual a variável em causa. Por outro lado, se var for uma variável de turtle (definida com a primitiva turtles-own), a mesma instrução passa a fazer sentido apenas se executada no domínio das turtles. Se for usada noutro contexto, o NetLogo reporta um erro de compilação.

E também existem restrições quanto às primitivas: Algumas são específicas a determinados domínios de execução. Por exemplo, apenas o observer pode executar a primitiva clear-all; apenas as turtles podem executar a primitiva hatch. Mais uma vez, se for utilizada alguma primitiva incompatível com o domínio de execução em que está inserida, o NetLogo reporta um erro de compilação.

É possível definir domínios de execução que são subconjuntos do domínio das turtles. Isto é feito declarando, no início do programa, "subespécies" de turtles usando a primitiva breeds. Quando tal é feito, é possível criar agentes que, além de partilharem as características de todas as turtles, têm outras características particulares (como variáveis). Por exemplo:

breeds [ t1 t2 ]
turtles-own [ a b c ]
t1-own [ alfa ]
t2-own [ beta gama ]

Desta maneira, são criadas dois tipos de turtles, t1 e t2, além da turtle "genérica", que é a que não pertence ao tipo t1 ou t2. Todas as turtles (incluíndo as genéricas) têm acesso às variáveis a, b e c, mas apenas as turtles t1 têm acesso à variável alfa e apenas as t2 têm acesso às variáveis beta e gama. Tipos de turtles diferentes podem também ter formas diferentes (ver Shapes Editor).
Usando a primitiva ask e o conjunto de agentes correspondente (turtles, t1, t2), é possível fazer executar código apenas por um tipo de turtles, ou por todas elas.

Para mais informações sobre quais as variáveis específicas a cada domínio de execução e as maneiras de as aceder, consultar a secção Visibilidade De Variáveis.

Para mais detalhes sobre a primitiva ask e problemas comuns decorrentes da sua utilização, ver a secção sobre Sincronização.