Paweł "Cosi" Piątkowski uzupełnił informacje na temat
wymyślonego przez niego LogForth. Poniżej druga część opisu,
a całość połączoną można znaleźć w dziale "Poradniki" -
"FAQ o LogForth". Druga część rozpoczyna się od punktu 4:
4. Jak korzystać?
W trybie bezpośrednim Fortha wpisujemy dane i słowa oddzielone
spacjami. Jeżeli wpiszemy liczbę, wskakuje na stos; jeżeli operator
matematyczny, ze stosu pobierane są dwie liczby, a następnie
wrzucany wynik. Jeżeli wpiszemy:
5 4 + 3 * .
to Forth wrzuci na stos dwie liczby (5 i 4), doda to siebie, wynik
pomnoży przez 3, a następnie wyświetli wynik (kropka).
Liczbami na stosie można operować za pomocą słów DUP, DROP i SWAP.
Pierwsze kopiuje liczbę znajdującą się na szczycie stosu, drugie
usuwa górną liczbę ze stosu, a trzecie zamienia miejscami dwie
górne liczby. W LogFORTHcie to samo uzyskujemy za pomocą funkcji
OPER. Poprzedni przykład można zapisać jako:
OPER [5 4 + 3 * .]
5. Różnice w stosunku do Fortha
dostępny jest tylko tryb bezpośredni; odpowiednikiem trybu
kompilowanego są deklaracje procedur w Logo
LogFORTH operuje na liczbach rzeczywistych (fig-FORTH na
całkowitych)
nie ma możliwości zagnieżdżania pętli DOLOOP (trzeba zamiast
tego użyć polecenia REPEAT)
6. Wady i niedociągnięcia (bo przecież jakieś muszą
być!)
WYDAJNOŚĆ!!! chciałbym powiedzieć, że LogFORTH łączy
elastyczność Logo z szybkością Fortha, ale tak nie jest. Kiepska
wydajność Logo to jest najsłabsze ogniwo we wszystkich projektach
związanych z tym językiem
wpisanie "nielegalnych" słów w instrukcji OPER nie powoduje
wyświetlenia błędu; zamiast tego program ignoruje błędny fragment
(a tak nie powinno być)
7. Wstawki maszynowe w Logo
To jest chyba jedyny sposób, żeby poprawić wydajność programów, nie
przepisując przy tym od nowa interpretera Logo. Niestety, albo i
stety, nie w całej pamięci można pisać. Według książki "Języki
Atari XL/XE" wersja kartridżowa zostawia dla użytkownika obszar od
$600 do $7FFF. W przypadku wersji dyskowej trzeba od tego odjąć
jeszcze miejsce na DOS-a. Zostaje powiedzmy obszar $1E00-$7FFF,
KTÓRY JEST PRZEZNACZONY NA DANE I PROGRAMY, tak więc na przykład
zadeklarowanie nowej zmiennej może nam skasować wstawkę maszynową,
jak również wstawka maszynowa może nadpisać kod w Logo (co
zazwyczaj powoduje zwis).
Jak widać, sytuacja nie jest za ciekawa. Bez problemów można pisać
po obszarze rejestrów i Display List - można w ten sposób nawet
ingerować w obszar grafiki żółwi. Natomiast nie udało mi się
wymyślić, gdzie można bezpiecznie umieścić kod maszynowy. Pewnym
rozwiązaniem jest oczywiście pilnowanie zużycia pamięci i liczenie
po cichu na to, że nasz kod nie zostanie zamazany, ale Logo ma tak
nieszczęśliwie rozwiązany mechanizm garbage collection, że po
krótszym lub dłuższym czasie i tak zmienne wejdą w obszar, gdzie
jest wstawka.
Mam nadzieję, że teraz, kiedy udało się wywołać pewne
zainteresowanie językiem Logo, ktoś bardziej obeznany z mapą
pamięci Atari odkryje, gdzie można umieszczać procedury maszynowe.
A to dałoby nam już połączenie Logo, Fortha i języka maszynowego
:-D
8. Sztuczki w Logo
Programowanie na piecu przyzwyczaja człowieka do pewnych rzeczy,
bez których trudno się potem obejść. Twórcy Logo nie przewidzieli
ich wykorzystania, ale można je uzyskać okrężną drogą:
Pętle WHILE
Logo niestety jest pozbawione podstawowych elementów programowania
strukturalnego, jakimi są pętle. Zamiast tego zalecana jest
rekurencja (pomijam fakt, jakie to nieoptymalne). W ten sposób
łatwo zaprojektować pętlę:
TO FUNKCJA
MAKE "N 10
PR [START]
WHILE
PR [KONIEC]
END
TO WHILE
IF :N>0 [PR :N MAKE "N :N-1] [STOP]
WHILE
END
Funkcje o zmiennej liczbie parametrów
Baardzo przydatna rzecz. Można ją zrealizować, przekazując do
funkcji parametry w formie listy (tak jak to jest robione w
Perlu):
TO FUNKCJA :LISTA
IF EMPTYP :LISTA [STOP]
MAKE "PARAM FIRST :LISTA
...
FUNKCJA BF :LISTA
END
Tablice asocjacyjne
Kolejna fajna rzecz z Perla :)
MAKE "LISTA [[IMIE JAN] [NAZWISKO NOWAK] [WIEK 37]]
FIRST SLICE :LISTA numer (tak uzyskujemy klucz)
LAST SLICE :LISTA numer (a tak wartość)
(SLICE jest funkcją z biblioteki libcosi)
Odwołanie do zmiennej przez nazwę (referencje)
To nie jest żadna sztuczka, tylko normalny element języka. Ale
spróbujcie mi pokazać atarowski język, który to umożliwia ;)
MAKE "REF1 "REF2
MAKE "REF2 "X
MAKE "X 10
PR THING THING THING "REF1
albo
PR THING THING :REF1
(to taka mocno zagnieżdżona referencja)
Pseudostałe
Logo nie obsługuje stałych. Ale:
TO PI
OP 3.14159
END
MAKE "S PI*:R*:R
Zmienne lokalne
Tego też niby nie ma w Logo. Można to prosto zrealizować,
wykorzystując fakt, że parametry funkcji są lokalne:
MAKE "X 10
TO FUNKCJA :X
MAKE "X 20
PR :X
END
FUNKCJA 0
PR :X
Tablice n-wymiarowe (Bajtek 5/87)
Bardzo ciekawy sposób, w dodatku pozwalający na zakładanie bardzo
dużych tablic bez obciążania pamięci. Wykorzystuje zwykłe zmienne o
odpowiednich nazwach, w tym przypadku tablica#i,j:
TO TAB :NAZWA :I :J
OP (WORD :NAZWA "# :I ", :J)
END
MAKE (TAB "A 5 4) "ABC (tworzy "komórkę" A[5,4])
PR THING (TAB "A 5 4)
albo
PR :A#5,4 (wypisuje zawartość komórki)
Andrzej 2009-06-24 00:47:33
Lubilem logo na Atari. Dzieki Cosi bo sie pobawie dla przypomnienia. Kaz 2009-06-24 09:34:04
Ja pamietam, ze "wydalem" nawet wlasna gazetke w podstawowce o Atari i zapodawalem tam kurs - przyklady programowania w Logo... he he. Cosi 2009-06-24 11:59:00
Andrzej: jakbyś miał jakieś pytania, to wal śmiało na cosi1 małpa tlen kropa pl :-) Andrzej 2009-06-25 23:54:56
Dzieki Cosi, w razie czego napisze. A gdzie znajde Fortha dla Atari? I jaki polecasz? Kaz 2009-06-26 00:11:05
Troche jest tutaj: http://atarionline.pl/v01/index.php?ct=utils&sub=4.+Programowanie A sporo o Forth znajdziesz tutaj: http://atariwiki.strotmann.de/xwiki/bin/view/Main/ Cosi 2009-06-27 14:55:21
Ewentualnie VolksForth: http://cosi.com.pl/pub/VolksForth.zip Fajnie by było wypromować go jako tzw. "standard de facto", bo to ciekawa implementacja. Pozwala m.in. tworzyć pliki .COM. Tylko jakaś bogatsza dokumentacja by się przydała... figForth ma tą zaletę, że w TA jest kurs Rolanda Pantoły, poświęcony właśnie tej implementacji. Kaz 2009-06-29 00:47:13
A o fig-Forth byla tez ksiazka wydana przez SOETO. Cosi 2009-06-29 12:16:54
Za tą książkę wiele bym dał (noo, bez przesady, ale ze dwie-trzy dychy na pewno ;-)) Gdzieś jeszcze była dokumentacja do VF, z której dowiedziałem się, jak kompilować do .COM, ale za cholerę nie potrafię sobie przypomnieć, gdzie to było...