Funkcje obsługi zdarzeń i sygnałów

to onzdarzenie :arg1 :arg2 ...
    instrukcje
end

to onsignalnazwa :turtle :data
    instrukcje
end

to onsignal :name :turtle :data
    instrukcje
end

Zdarzenia w są przypisane sytuacjom, których kolejność wystąpienia jest trudna do przewidzenia podczas pisania programu. Są to np. czynności wykonane przez elementy interfejsu użytkownika (poruszenie myszą, wciśnięcie przycisku) oraz czynności żółwi (zderzenie żółwi, przekroczenie granicy okna graficznego). Zdarzenia można powiązać z funkcjami obsługi, które są wyzwalane przez dane zdarzenie.
Sygnały są specjalnym przypadkiem zdarzeń. Są generowane programowo przez żółwie i stopery. Sygnały pozwalają na synchronizację równoległego działania wielu żółwi.

Aby zdefiniować funkcję obsługi zdarzenia wystarczy nadać jej odpowiednią nazwę i użyć zestawu argumentów używanego w danym zdarzeniu. Nazwa funkcji powinna być nazwą zdarzenia z przedrostkiem "on".
Funkcja obsługi sygnału powinna nosić nazwę danego sygnału z przedrostkiem "onsignal"; w tym przypadku dostępne argumenty to :turtle (żółw, który wysłał sygnał) i :data (zmienna zawierająca informacje dodane podczas zgłaszania sygnału). Funkcja o nazwie "onsignal" obsługuje wszystkie sygnały, które nie zostały wcześniej obsłużone przez dedykowane funkcje "onsignalnazwa"; w tym przypadku dostępny jest argument :name zawierający nazwę sygnału.

Funkcja obsługi jest wykonywana jako osobne zadanie żółwia. Zadania te są wstawiane do kolejki zadań w kolejności, w jakiej nadeszły zdarzenia.

Uwaga 1: Definicja funkcji obsługi nie musi wykorzystywać wszystkich argumentów zdarzenia, jednak te, które są użyte, muszą zachować kolejność podaną w opisie zdarzenia.
Uwaga 2: Funkcja obsługi zdarzenia (synału) jest aktywna dla żółwia, który zdefiniował funkcję. Funkcja obsługi jest widoczna ale nieaktywna dla żółwi utworzonych przez żółwia definiującego funkcję. Instrukcje eventenable, eventdisable umożliwiają włączanie i wyłączanie obsługi zdarzenia po zdefiniowaniu funkcji obsługi.

Przykład 1:

to onmouseclick :mousepos
  print :mousepos
end

Rezultat wykonania:
Pozycja kliknięcia myszą wypisana po każdym kliknięciu.

{-295 130}
{119 18}
{-14 -100}
{87 145}

Przykład 2:

to onsignalcyk :turtle :data
  (print :turtle :data)
end

"t := (timer "cyk 300 50 4)

Rezultat wykonania:

first {1 50.0078125 50.0078125}
first {2 301.0234375 351.03125}
first {3 302.015625 653.046875}
first {4 302.015625 955.0625}

Przykład 3:

to onsignal :name :turtle
  (print "sygnał :name "od :turtle)
end

to onsignaldwa
  print "dedykowana_obsługa_dwa
end

signal "raz
signal "dwa
signal "trzy

Rezultat wykonania:

sygnał raz od first
dedykowana_obsługa_dwa
sygnał trzy od first

Zobacz także:

Lista zdarzeń
Definicja i wywołanie funkcji

Spis treści