Paweł "Cosi" Piątkowski, który ostatnio uraczył nas
implementacją na Atari uroczego języka ezoterycznego "BrainFuck",
obecnie proponuje kolejną ciekawostkę: połączenie języka LOGO i
Forth. Nieśmiało na forum
objawił
nam program
LogFORTH, w tej chwili w wersji 0.1 czyli dość
wczesnej. Zaintrygowany pomysłem, postanowiłem przedstawić zarówno
pliczek jak i dokumentację:
Jak to ugryźć?
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
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.