====== r> und >r ======
Man kann r> und >r auf verschiedene Forthworte verteilen. Aber was für Anwendungen könnten das sein, die so etwas //brauchen//?
Siehe auch: {{enigmatic:milendorf98.pdf}}
: A 'a emit r> ;
: B 'b emit ;
: C 'c emit ;
: D 'd emit >r ;
: AB a b ;
: CD c d ;
: ABCD ab cd ;
----
Hinweis:
gForth benutzt ' als Präfix von Zahlen - damit wird hier ein Ascii-Wert auf den Stack gelegt.
Für andere Forth Systeme geht möglicherweise ''ascii a'' besser.
----
Hmm, habe zuerst nicht geglaubt das dass ueberhaupt funktionieren konnte (ich nahm an das Beispiel moechte data manipulieren).
FORTH> abcd acdb ok
Es geht also doch, und fummelt mit 'Flow of Control.' (Voellig write-only meiner
Meinung nach, aber schoen trickreich.)
So wuerde ich der return stack als data stack missbrauchen:
: send-B R> '[' emit 'b' >R >R ;
: get-B? 'a' emit R> R> emit >R ;
: test send-B get-B? ']' emit ;
In iForth gibt test dann '[ab]' aus.
--- //[[mhx@iae.nl|marcel hendrix]] 2006/05/22 21:21//
Noch ein Rätsel mit Return-Stack-Missbrauch (und ein bisschen Nützlichkeit).
Es ärgert mich, wenn ich am Anfang einer Funktion etwas initialisiere und am Ende deinitialisieren muss.
Als vergesslicher Mensch lösche ich nämlich oft die Initialisierung (ohne die Deinitialisierung) oder vertausche die Reihenfolge.
Ein Beispiel, was ich NICHT mag:
: t1
." Look at the middle of the screen "
at? >r >r
12 20 at ." THIS IS THE MIDDLE OF THE SCREEN "
r> r> at ;
Das Cursor-Speichern mit at? und das Zurücksetzen mit at steht weit auseinander. Ein Tippfehler - CRASH!
Das Beispiel, wie ich es mag:
: pushcursor
r>
at? >r >r
>r
LATER r> r> at ;
: t2
." Look at the middle of the screen "
pushcursor
12 20 at ." THIS IS THE MIDDLE OF THE SCREEN " ;
Die gefährlichen Dinge stehen in pushcursor. Beim Aufrufe initialisiert es, am Wortende (Semikolon) deinitialisiert es sich. Wer zuletzt initialisiert, wird übrigens zuerst deinitialisiert - so ist es meist richtig.
Das Rätsel: Wie ist das Wort LATER definiert?
Die Auflösung (ein bisschen kodiert):
3A 20 4C 41 54 45 52 20-72 3E 20 72 3E 20 73 77
61 70 20 3E 72 20 3E 72-20 3B 0D 0A 20 20 20 20
Gehört habe ich von LATER erstmals am Rande der Forth-Tagung 1988 in Aachen. Leider ist mir der Name des Hamburger Autors entfallen, aber in einer der folgenden VDs hat er es beschrieben.
----
Vielleicht geht's so:
: later [ -opt ] r> r> 2>r ;
Ist ganz nuetzlich. Ein Beispiel...
: [] '[' emit later ']' emit ;
: .phrase bl word count type ;
: .num 0 .r ;
: test [] .phrase ;
: t2 [] .num ;
FORTH> test hello,world [hello,world]
FORTH> 88 t2 [88] ok
Ohne later muss mann das so machen:
: test '[' emit .phrase ']' emit ;
: t2 '[' emit 0 .r ']' emit ;
Also die zwei emits lassen sich nicht so einfach faktorisieren.
--- //[[mhx@iae.nl|marcel hendrix]] 2008/01/08 02:09//
Bei mir war die Auflösung etwas einfacher als bei Marcel, aber vermutlich der gleiche swap auf dem Returnstack:
: LATER r> r> swap >r >r ;
=== Neues Rätsel (noch missbräuchlicher) ===
Code R<>S
SP, BP XCHG
next
end-code
Ein Assemblerwort, das erstaunlich portabel auf x86-Systemen ist.
Was tut es?
Wofür könnte sowas gut sein?!?
--- //[[clv@arcor.de|clv]] 2009-02-09//
> Wofür könnte sowas gut sein?!?
Eine Moeglichkeit ist ''DUP SWAP OVER ...'' auch auf der return stack moeglich zu machen.
Ob das "gut" waere ist eine andere Sache.
Fuer ein nuetzliches Resultat muss ''R<>S'' 2, 4, 6 ... Mahl angerufen werden.
Ein nuetzliches Missbrauch ist Debugging. Wenn mann ein Stackfehler in
Wort ''x'' vermutet, baut mann ''R<>S x R<>S'' irgendwo (wo es Weh tut) ein.
--- //[[mhx@iae.nl|marcel hendrix]] 2008/02/10 07:59//