This page (revision-21) was last changed on 03-Feb-2023 15:21 by Carsten Strotmann 

This page was created on 29-Jul-2010 13:57 by Carsten Strotmann

Only authorized users are allowed to rename pages.

Only authorized users are allowed to delete pages.

Page revision history

Version Date Modified Size Author Changes ... Change note
21 03-Feb-2023 15:21 27 KB Carsten Strotmann to previous

Page References

Incoming links Outgoing links

Version management

Difference between version and

At line 633 added 55 lines
!!!Rekursion
Bevor die Technik der Rekursion für das volksFORTH dargestellt wird, soll ein anderes Wort __.LASTNAME__ zeigen, daß das Wort __LAST__ mit dem in der Literatur oft anzutreffenden __LATEST__ identisch ist: Beide Worte liefern die "name field address" (nfa) des zuletzt definierten Wortes im CURRENT-Vokabular. Das Wort __LAST'__ dagegen liefert die "code field address" (cfa) des zuletzt definierten Wortes.
{{{
: .lastname last @ .name ;
}}}
Die Rekursion ist eine Technik, bei der ein Wort sich immer wieder selbst aufruft. Eines der bekannten Beispiele dafür ist die Berechnung der Fakultät einer positiven ganzen Zahl. Hierbei ergibt sich n! aus dem Produkt aller ihrer Vorgänger.
Im volksFORTH ist der Selbstaufruf eines Wortes durch __RECURSIVE__ gekennzeichnet, so daß sich ein Programm zur Fakultätsberechnung wie folgt präsentiert:
{{{
: fakultät ( +n -- n! )
recursive
dup 0< IF drop ." keine negativen Zahlen! " exit
THEN
?dup 0= IF 1 \ spezialfall 0
ELSE dup 1- fakultät *
THEN ;
cr 4 fakultät .
cr 5 fakultät .
cr 6 fakultät .
}}}
Allerdings findet sich — vor allem in der fig-FORTH-Literatur — ein Wort __MYSELF__, das mit dem in FORTH83-Umgebungen anzutreffenden __RECURSE__ identisch ist. Da auch diese Konstruktion, bei der MYSELF/RECURSE als Platshalter für den Wortnamen dienen, gerne eingesetzt wird, werden die möglichen Definitionen und eine weitere Form von FAKULTÄT gezeigt:
{{{
: myself last @ name> , ; immediate
: myself last' , ; immediate
: recurse [compile] myself ; immediate
' myself Alias recurse immediate
: fakultät ( +n -- n! )
dup 0< IF ." keine negativen Zahlen erlaubt!"
ELSE ?dup 0= IF 1
ELSE dup 1- myself *
THEN
THEN ;
}}}
Bei der Verwendung von __RECURSE__ wird lediglich __MYSELF__ dadurch ersetzt:
{{{
...
ELSE ?dup 0= IF 1
ELSE dup 1- recurse *
THEN
THEN ;
...
}}}