Komputery aż do dwudziestej generacji włącznie odznaczały się „owadzim" zachowaniem: nie mogły kwestionować, co tym bardziej — przekształcać swoich programów. Programista „impregnował" swoją maszynę wiedzą jak Ewolucja „impregnuje" owada — instynktem(...). Edukacja komputera osiemdziesiątej generacji była już daleko bardziej podobna do wychowania dziecka aniżeli do klasycznego programowania maszyny cyfrowej". (Stanisław Lem "GOLEM XIV")
LOGO uważany jest za język najbardziej nadający się do pierwszego kontaktu z komputerem. Nie oznacza to jednak, że LOGO jest czymś w rodzaju "niby języka", czymś gorszym niż BASIC. LOGO zostało tak zbudowane, by już początkujący mógł posługiwać się środkami i metodami typowymi dla „dorosłej" informatyki, oglądając przy tym wyniki swoich prób natychmiast na ekranie. LOGO nie jest jednak wyłącznie udziwnionym sposobem rysowania obrazków. Z powodzeniem można w LOGO tworzyć poważne programy z myślą o „prawdziwych" zastosowaniach. Przykłady takich programów opublikujemy wkrótce.
Nie istnieje dotychczas uzgodniona, standardowa, polska wersja LOGO. Dlatego, komentując poszczególne komendy, przy niektórych podajemy proponowane polskie odpowiedniki, stosowane w niektórych przeróbkach.
Program w LOGO składa się ze słów
słowo
Słowem może być dowolny ciąg znaków nie zawierający odstępów, nawiasów, cudzysłowów i znaków działań arytmetycznych.
separatory
Słowo może zawierać któryś z tych znaków tzw: separatorów, lecz wówczas musimy poprzedzić ten znak znakiem backshlash.
element słowa
Znaki składające się na słowo nazywamy jego elementami.
słowo puste
Słowo nie zawierające żadnego znaku nazywa się słowem pustym. Oznaczamy je ". Słowa w LOGO mogą być nazwami procedur, zmiennych lub elementami, wyrażeń algebraicznych, których wartości są parametrami procedur.
linia
Słowa w programie grupowane są w linie, przy czym grupowanie ma najczęściej charakter czysto porządkowy.
lista
Oprócz słów program może zawierać listy, w skład których mogą wchodzić słowa lub inne listy. Obszerniej o budowie słów i list powiemy dalej.
procedura, parametr
Słowo użyte w programie musi być nazwą procedury, jej parametru lub jej obiektem. Parametry i obiekty procedur występują zawsze za ich nazwami.
obiekt, nazwa, słowo kluczowe
Słowo jest nazwą procedury, jeśli jest słowem kluczowym, czyli nazwą procedury podstawowej (primitive) i jako takie jest zdefiniowane w ramach samego programu tłumaczącego LOGO lub jeśli uprzednio została zdefiniowana procedura o tej nazwie.
procedura podstawowa
Słowo jest nazwą procedury, jeśli jest słowem kluczowym, czyli nazwą procedury podstawowej (primitive) i jako takie jest zdefiniowane w ramach samego programu tłumaczącego LOGO lub jeśli uprzednio została zdefiniowana procedura o tej nazwie.
definiowanie
Słowo użyte w programie bezpośrednio, tzn. bez cudzysłowu lub dwukropka i nie w ramach listy zawsze jest traktowane jak nazwa procedury, którą należy wykonać.
procedury
Procedurę definiuje się przy pomocy słowa kluczowego TO (TO DRZEWO). Definicja musi się kończyć słowem END, napisanym w osobnej linii.
EDIT
Wprowadzone uprzednio definicje można zmienić korzystając z trybu edycji, który uzyskuje się przy pomocy słowa kluczowego EDIT (np. EDIT "DRZEWO).
Podanie EDIT bez wskazania, o którą procedurę chodzi powoduje zawsze przywołanie ostatnio edytowanej procedury. Można również przywołać pusty edytor podajać jako parametr wejściowy EDIT listę pustą (EDIT []) i wykorzystać go do definiowania nowej procedury, można też wyedytować kilka procedur równocześnie podając jako parametr EDIT całą listę nazw (np. EDIT [DRZEWO DOM PŁOT]).
W trybie edycji można przesuwać kursor strzałkami, wstawiać nowe znaki i usuwać je przy pomocy DELETE. Strzałki w EXTEND MODE przesuwają kursor na początek i koniec linii (lewo-prawo) oraz na początek i koniec teksty (góra-dół). EXTEND MODE Y usuwa wszystkie znaki danej linii leżące na prawo od kursora i zapamiętuje je, a EXTEND MODE R — wstawia je w nowe miejsce.
Jeśli edytowany tekst nie mieści się na ekranie, wówczas można jego przesuwanie się zatrzymać przy pomocy SYMBOL SHIFT S. EXTEND MODE P powoduje wówczas powrót do poprzedniej strony, a EXTEND MODE N — przejście do następnej.
wyjście z edycji
Tryb edycji można opuścić przy pomocy zlecenia EXTEND MODE C i wówczas wszystkie edytowane procedury otrzymają nowe definicje lub przy pomocy BREAK i wówczas wszystkie wprowadzone podczas edycji zmiany zostają zapomniane.
ENDS
Przy pomocy słowa kluczowego ENDS [lista nazw] można również wyedytować zmienne wraz z ich wartościami, po czym zmienić ich nazwy i wartości.
parametry procedury
Zdefiniowana procedura może wymagać podania parametrów. W programie parametry podajemy bezpośrednio za jej nazwą, w definicji zaś trzeba je zadeklarować w pierwszej linii, podając ich nazwy po dwukropku (np. TO DRZEWO :Wysokość:liczba gałęzi:grubość pnia).
procedury funkcje OUTPUT OP
Procedura może po wykonaniu przyjmować pewne wartości wyjściowe i zachowuje się wówczas jak funkcja. Jeśli w treści procedury znajduje się słowo OUTPUT lub krócej OP, wówczas jej realizacja zostaje zakończona, a wartość wyrażenia następującego po tym słowie zostaje przekazana do procedury nadrzędnej (uwaga: każda procedura, niezależnie od sposobu kończeniu realizacji, musi kończyć się słowem END).
STOP
Realizacja procedury przed osiągnięciem END zostaje przerwana także w razie natrafienia na zlecenie STOP. W takim przypadku LOGO powraca do procedury bezpośrednio nadrzędnej (więc do tej, z której aktualnie realizowana procedura była wywoływana).
TOPLEVEL
Natomiast zlecenie TOPLEVEL zawsze przerywa realizację programu i powoduje powrót do najwyższego poziomu wywoływania, a więc w najczęstszym wypadku posługiwania się programem interpretującym LOGO — po prostu do stanu oczekiwania na zlecenie z klawiatury. TOPLEVEL jest więc odpowiednikiem zlecenia STOP w BASICU, podczas gdy STOP działaniem przypomina RETURN. Realizację każdego programu można również przerwać bezpośrednio z klawiatury przy pomocy BREAK, co wywołuje komunikat „STOPPED!!!".
Po zdefiniowaniu procedury uzyskujemy komunikat, np. „DRZEWO DEFINED" (lub "DRZEWO zdefiniowano"). Do wywołania procedury wystarcza teraz użycie jej nazwy w programie. Jeśli procedura wymaga podania parametrów, podajemy je zaraz za nazwą. Gdy zabraknie parametrów LOGO przerywa realizację programu komunikatem „Not enough inputs to DRZEWO" lub „za mało danych dla DRZEWO", gdy natomiast podano ich za dużo komunikatem „YOU don't say what to do with" lub „nic wiem, co zrobić z...".
Próba nadania nowo zdefiniowanej procedurze takiej samej nazwy, jaką ma procedura zdefiniowana już uprzednio kończy się komunikatem „DRZEWO is already defined" lub „DRZEWO jest już zdefiniowane". Trzeba w takim przypadku zmienić nazwę nowej procedury lub usunąć starą. Próba użycia jako nazwv słowa kluczowego kończy się komunikatem „FORWARD is used by LOGO" lub „NAPRZÓD jest zastrzeżone dla LOGO".
POPS
PO
POALL
.CONTENTS
Listę już zdefiniowanych procedur można obejrzeć (po uprzednim przejściu na tekstowy tryb organizacji ekranu!) dzięki słowom klubowym POTS (Print Out the TitleS), jeśli interesują nas tylko nazwy procedur oraz POPS (Print Out Procesure S), jeśli interesują nas ich pełne definicje. Możemy również obejrzeć treść jednej, wybranej procedury — PO nazwa, np. PO "DRZEWO oraz listę zmiennych — PONS (Print Out the NameS) wraz z ich wartościami. Natomiast POALL (Print Out ALL) powoduje wyświetlanie wszystkich zdefiniowanych procedur oraz zmiennych. Całą zawartość pamięci można również przejrzeć przy pomocy zlecenia CONTENTS (zwartość), które jednak wymaga dużego obszaru wolnej pamięci .CONTENTS (pamiętaj o kropce na początku!) podaje nie tylko zdefiniowane procedury i zmienne, ale również większość tekstów wprowadzonych z klawiatury i rozkazy wykonywane bezpośrednio.
.PRIMITIVES
Listę słów kluczowych można natomiast przypomnieć sobie przy pomocy zlecenia .PRIMITIVES.
ERASE | ER ALL | ERNS ERPS | ERN
Usunąć procedurę z pamięci można przv pomocv zlecenia ERASE lub krótko ER, np. ER "DRZEWO. Zlecenia ERALL ERNS, ERPS mają znaczenie analogiczne do odpowiednich konstrukcji z PO. Do usuwania zmiennych używamy zlecenia ERN nazwa, np. ERN "liczbagałęzi.
DEFINEDP PRIMITIVEP
Jeśli mamy wątpliwości czy dane słowo jest już użyte jako nazwa lub słowo kluczowe możemy również skorzystać ze zleceń DEFINEDP "DRZEWO lub PRIMITIVEP "DRZEWO. Zlecenia te są pomyślane jako środek używany w ramach innych procedur, tak więc po wykonaniu przyjmują (jak OUTPUT) wartość TRUE lub FALSE. Jeśli chcemy skorzystać z nich bezpośrednio, musimy powiedzieć LOGO, co ma uczynić z wynikiem tej operacji pisząc np. PRINT DEFINEDP "COS.
DEFINE TEXT
COPY DEF
Innymi środkami umożliwiającymi tworzenie programów samomodyfikujących się, a więc definiowanie nowych procedur w trakcie realizacji programu, są zlecenia DEFINE (np. DEFINE "SUMA[[:X:Y][PRINT:X+:Y]]), TEXT (np. PRINT TEXT "SUMA daje [:X:Y][PRINT :X+:Y oraz COPYDEF, która tworzy nową procedurę o nowej nazwie i treści identycznej z treścią wskazanej istniejącej procedury, np. COPYDEF "DODAĆ "SUMA utworzy nową procedurę.
TO DODAĆ :X:Y PRINT :X+:Y END
Przykład ten wskazuje, że mimo iż w zleceniach DEFINE i TEXT używamy nieco innego sposobu zapisu procedury: lista parametrów procedury i jej kolejne linie przedstawione są jako lista list, nie używa się natomiast END, to jednak w pamięci zdefiniowana procedura ma zawsze taką samą postać.
rekurencja
Procedury w LOGO mają wywoływać same siebie, możliwa jest więc tzw. rekurencja. Jeśli wywoływanie nie wiąże się z przekazywaniem parametrów do procedury nadrzędnej, wówczas rekurencja może być wykonywana dowolną ilość razy, na przykład:
TO ZOLWLATAWKOLKO FD 3 RT 3 ZOLWLATAWKOLKO END
lokalność parametru
Uwaga! lokalność parametru procedury jest przestrzegana bardzo starannie i w wypadku rekurencji mimo tej samej nazwy parametr na każdym stopniu wywołania zachowuje własną wartość, np.: TO SZEREG:LICZBA IF :LICZBA 100 SZEREG :LICZBA 3 PR :LICZBA END daje w wyniku wywołania SZEREG 5 następujący wyniki: 133 45 15 5. Przeanalizuj dokładnie ten przykład!
zmienne są globalne MAKE
W LOGO wszystkie zmienne poza parametrami procedur są globalne. Zmienne tworzy się i nadaje się im wartość przy pomocy zlecenia MAKE, np. MAKE A 1 tworzy zmienną o nazwie A i nadaje jej wartość 1. Wartością zmiennej może być liczba lub lista, która może być z kolei oczywiście listą liczb, list zmiennych lub słów, albo wręcz wszystkiego po trochu równocześnie. Od użytkownika nie wymaga się uprzedniego zadeklarowania charakteru zmiennej.
THING
Posługując się zmienną poprzedzamy jej nazwę dwukropkiem, jeśli chcemy posłużyć się jej wartością — :A znaczy wartość zmiennej A. Zamiast dwukropka możemy użyć słowa kluczowego THING. Gdy interesuje nas nie — wartość, a nazwa zmiennej (podobnie w wypadku procedur — poprzedzamy ją znakiem ".Samo A np. A nie poprzedzone żadnym znakiem zostałoby przez LOGO zrozumiane, jako wywołanie procedur o nazwie A.
separatory
= + - () "
listy
Słowa w LOGO oddzielone muszą być separatorem. Najprostszym separatorem jest odstęp — pamiętaj, że np. nazwa procedury i jej parametr w wypadku jej wywołania to dwa oddzielne słowa i DRZEWO 5 znaczy coś zupełnie innego niż DRZEWO5 (to ostatnie na ogół nic nie znaczy). LOGO nie wie również, jak zrobić np. RT45 bez uprzedniego zdefiniowania gdyż słowem kluczowym RT należy posługiwać się tak: RT 45.
Separatorami są też nawiasy zwykłe używane przy zapisie wyrażeń arytmetycznych oraz instrukcji zachłannych (patrz dalej) oraz nawiasy kwadratowe oznaczające listy i znaki działań arytmetycznych. Oznacza listę złożoną z obiektów zawartych wewnątrz nawiasu.
-5 o - 5
Separatory nie muszą być oddzielane od sąsiednich słów odstępami, zalecane jest jednak oddzielenie odstępami liczb i oznaczeń arytmetycznych ze względu na możliwość nieporozumienia: —5 znaczy liczba minus pięć, natomiast — 5 znaczy operator odejmowania i liczba 5 jako odjemna. Różnica polega na tym, że np. 7 — 5 jest jedną liczbą równą 2, natomiast 7 — 5 to para dwóch liczb, efektem pomyłki jest więc zazwyczaj komunikat, że podano za mało parametrów bądź LOGO nie wie, co robić z niepotrzebną mu dodatkową liczbą.
instrukcje zachłanne
Niektóre instrukcje są zachłanne: umieszczane w nawiasie okrągłym wraz z grupą obiektów obejmują swym działaniem całą tę grupę, np. (PRINT "Ala "ma" kota) daje w wyniku Ala ma kota.
LIST
WORD
SENTENCE
Podobnie (LIST "Ala "ma "kota) jest równoważne [Ala ma kota], a WORD ("Ala "ba"ma) znaczy "Alabama. (SENTENCE "Ala "ma "kota) również jest — podobne jak LIST - równoważne [Ala ma kota], ale wynikiem operacji SENTENCE zawsze jest lista złożona ze słów, a nie z innych list. Ewentualnie listy składowe SENTENCE traktuje po prostu jako grupy słów.
Władysław Majewski