Poniższe informacje zostały przygotowane przez Pawła "Cosi"
Piątkowskiego, który jest jednocześnie autorem programu -
mieszanki Logo i Forth - pod nazwą "LogForth":
1. Co to jest LogForth?
LogFORTH jest biblioteką języka Logo, umożliwiającą programiście
korzystanie z konstrukcji języka Forth w środowisku Logo.
2. Z czego się składa LogForth?
Na dysku znajduja sie nastepujace pliki:
DOS.SYS
CP.SYS - pliki systemowe DOSa
AUTORUN.SYS - interpreter Logo
LOGFORTH - biblioteka LogFORTH
LIBCOSI - biblioteka libcosi
BENCH - biblioteka benchmark
CZYTAJ.DOC - ta dokumentacja
Po uruchomieniu interpretera należy wpisać: LOAD "D:LOGFORTH
3. Lista funkcji
OPER lista
Wykonuje podaną listę działań Forth-a. Dostepnę operacje:
liczba rzeczywista - wrzuca podana liczbe na stos
+ - * / - wykonuje odpowiednie działanie, zgodnie z konwencja RPN
(odwrotna notacja polska)
. - ściąga liczbę ze stosu i wypisuje na ekran
SWAP - zamienia miejscami dwa górne elementy stosu
DUP - kopiuje górny element stosu
DROP - usuwa górny element ze stosu
:procedura - wykonuje zdefiniowaną w Logo procedurę o podanej
nazwie.
Przykład:
OPER [2 4 * .]
wykonuje działanie 2*4 i wypisuje wynik na ekran.
DOLOOP lista
Wykonuje pętlę zgodnie z konwencją Fortha. Dwa górne elementy stosu
oznaczają kolejno początkowy i końcowy stan licznika. Lista działań
jak w funkcji OPER, dodatkowo I wrzuca na stos aktualną wartość
licznika. Przykład:
OPER [11 1] DOLOOP [I 2 * .]
wyświetla 10 kolejnych liczb parzystych.
S?
Zwraca wartość górnego elementu stosu, jednocześnie ściągając go.
Przykład:
OPER [2 4 *] PRINT S?
wyświetla wynik mnożenia 2*4 (jak w pierwszym przykładzie).
S! element
Wrzuca na stos podany element. Przykład:
S! FIRST RL OPER [DUP * .]
pobiera z klawiatury liczbę, a następnie wyświetla kwadrat tej
liczby.
Biblioteka libcosi
Zawiera kilka dodatkowych funkcji, rozszerzajacych mozliwosci Logo.
Nie jest wymagana przez "LogFORTH". Bibliotekę wczytujemy
wpisując: LOAD "D:LIBCOSI
Funkcje:
# komentarz
Komentarz.
@ "zmienna wartosc
Synonim dla MAKE.
ASM adres kod
Umieszcza w podanym miejscu w pamięci kod maszynowy. Przykład: ASM 709 [10 80 126 50]
$ lista
Zwraca podaną listę jako słowo. Przykład:
SHOW $ [ALA MA KOTA]
FOR "zmienna od do blok
Iteruje blok po zmiennej, od wartości "od" do wartości "do".
Przykład:
FOR "T 1 10 [PR :T]
FOREACH lista "zmienna blok
Wykonuje podany blok dla każdego klucza listy, przekazując ten
klucz do zmiennej. Przykład:
FOREACH [1 2 A] "T [PR :T]
LGET "lista
Zwraca ostatni element z listy, usuwając go jednocześnie z tej
listy. Przykład:
@ "LI [A B C D]
PR LGET "LI
SHOW :LI
FGET "lista
Jak wyżej, z tym że pobiera pierwszy element listy.
SLICE lista n
Zwraca n-ty element listy. Przykład:
PR SLICE [A B C D] 3
SETSLICE "lista n wartosc
Ustawia wartosc n-tego elementu listy. Przykład:
@ "LI [1 2 3 4]
SETSLICE "LI 2 "X
SHOW :LI
INC "zmienna
Zwiększa o 1 wartość zmiennej liczbowej.
DEC "zmienna
Zmniejsza wartość zmiennej.
Biblioteka bench
Zawiera tylko jedną funkcję, pozwalająca na testowanie czasu
wykonania procedur. Aby ją wczytać, należy wpisać: LOAD "D:BENCH
Wywołanie:
TEST [polecenie]
Po zakończeniu działania procedury funkcja wyświetla czas jej
wykonania.
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)
wawrzyn 2010-10-08 00:08:55
Ciekawe, ze wybor padl wlasnie na Forth i Logo. Obydwa jezyki sa godne uwagi i niedoceniane. Forth ma nalepke archaicznego, Logo jezyka dla dzieci (choc projekt Starlogo temu skutecznie zaprzecza). Wracajac do Fortha - jego tworca, Chuck Moore, to niesamowicie ciekawa osoba. Przy okazji, ciekawe, czy powyzszy projekt to taka sztuka dla sztuki, czy autor zamierza do czegos go uzyc? Kaz 2010-10-08 02:55:50
Wawrzyn - na forum latwiej widac takie pytania, posty o LogForth sa tutaj: