Żółw - wykres - obiekt

Żółw (turtle) w LOGO może zapamiętywać zmienne oraz wykonywać instrukcje i funkcje - jest aktywnym obiektem, jeśli użyjemy nazewnictwa stosowanego powszechnie w programowaniu.
W dialekcie POOL każdy program jest funkcją (ciągiem instrukcji) głównego żółwia #first. Żółw #first może tworzyć nowe żółwie, które mogą posiadać własne zmienne, a także wykonywać swoje własne zadania-programy. Funkcje i zmienne, które są dostępne dla żółwi "potomnych" można określić definiując klasy.

W POOL dostępna jest także uproszczona wersja żółwia: obiekt (object). Obiekty nie posiadają reprezentcji graficznej i nie mogą obsługiwać zdarzeń związanych z grafiką (np. kliknięć myszy). Dzięki temu obiekty zajmują mniej pamięci, są szybciej tworzone i szybciej wykonują polecenia.

Począwszy od wersji POOL 1.5 dostępny jest jeszcze jeden typ żółwia: wykres (plot). Wykres pozwala zwizualizować cały zbiór danych, używając różnych stylów do wyświetlenia poszczególnych wartości wielowymiarowych danych. Każdy wykres posiada dwie specjalne zmienne globalne:
   - :data, przechowująca dane do wyświetlenia;
   - :style, która jest słownikiem właściwości używanych do narysowania wykresu.
Wykres może być rysowany w głównym lub dodatkowym oknie graficznym, zależnie od wartości argumentów konstruktora wykresu. Właściwości okna graficznego można zmieniać przy pomocy zmiennej współdzielonej :pool_cfg (dla okna głównego) lub :nazwa_canvas_cfg (dla okien dodatkowych, gdzie nazwa jest nazwą okna podaną jako argument konstruktora wykresu).

Przykład 1:

;funkcja rysująca:
to spirala :s :c :length
  let "a :c * sign :s
  let "b abs :c
  repeat :length [
    fd :s rt :a
    "a := :a * :b
  ]
  (print who "skończył)
end

;dwa nowe żółwie potomne:
"t := newt
"u := newt

;wywołanie instrukcji dla żółwi potomnych:
ht @ :t
ht @ :u

;wywołanie funkcji rysującej:
(spirala -2 1.006 450) @ :t
(spirala -2 (-1.004) 600) @ :u
spirala 2 0.99 100

Rezultat wykonania:

t1 skończył
first skończył
t2 skończył

W powyższym przykładzie wywołania instrukcji ht oraz funkcji spirala dla żółwi :t i :u są wykonywane równolegle i nie wstrzymują wykonania programu żółwia #first. Z tego powodu dla każdego uruchomienia programu kolejność pojawiających się napisów "nazwa skończył" może być inna.

Przykład 2:

;klasa opisująca wykres spirali
to spirala :p1 :p2 :deg
  ;funkcja obliczająca dane do wyświetlenia
  to fn [:a :p1] [:b :p2]
    ;będziemy tworzyć listę 2-elementowych tablic,
    ;oto konstruktor listy i inicjalizaja pierwszego elementu:
    "data := (list array :a 0)

    ;zmienna :cfg będzie skrótem do :spirala_canvas_cfg
    let "cfg thing word world "_canvas_cfg

    let "t 0 let "s 0.1
    do.while [
      "t += :s
      let "f :a * exp :b * :t
      let "x (sign :deg) * :f * cos :t
      let "y :f * sin :t

      let "p array :x :y
      let "d (distance :p last :data)
      queue :data :p ;dodaj kolejną tablicę do listy

      if :d > 3 ["s := 0.5 * :s]
      if :d < 1 ["s := 2 * :s]
    ] (abs :x < :cfg,"max_x && abs :y < :cfg,"max_y)
  end

  fn ;oblicz wykres używając parametrów konstruktora spirali
  setr 0 ;promień równy zero powoduje, że symbole punktów danych nie będą rysowane
  :style,"mode := "line ;rysuj linię łączącą punkty danych

  ;stoper obraca wykres spirali (wartości danych nie ulegają zmianie)
  "tick := timer [rt :deg] 20
end

;utwórz dwa wykresy klasy spirala:
"w1 := (newp "Spirala $spirala 2 0.001 (-1)) (setxy 100 0) @ :w1
"w2 := (newp "Spirala $spirala 2 0.001 1) (setxy -100 0) @ :w2

;wywołaj tą linię w oknie poleceń:
;(fn 1 0.0002) @ :w1

Rezultat wykonania:

Obracające się wyresy spiral.

Zobacz także:

Klasy i dziedziczenie
Synchronizacja wielu obiektów

Spis treści