Leo: |
Und Forth selbst? Bleibt das dann im Dezimalzustand? Wie wird denn so'n HX dann aussehen?
|
Theo: |
: HX
HEX \ Zeitweilige Basiszahl
BL WORD COUNT EVALUATE \ Aktion!
DECIMAL \ Basiszahl wiederherstellen
; IMMEDIATE
Nur zu, probier's mal aus.
|
Leo: |
HX 10 . [rtn] 16 ok
10 HX . [rtn] A ok
Jawoll, mein Kompliment, das ist Zauberei.
|
Theo: |
Jubel nicht zu früh. Ein paar Schwachpunkte sitzen noch drin.
Erstens habe ich es für selbstverständlich gehalten,
dass sich das System im Dezimalzustand befindet,
denn am Ende setze ich es ganz normal (?) wieder auf dezimal.
Das ist nicht besonders schön.
Wir rufen den >R ... ettungsdienst:
: HX
BASE @ >R \ Rette Basiszahl
HEX \ Zeitweilige Basiszahl
BL WORD COUNT EVALUATE \ Aktion!
R> BASE ! \ Stell Basiszahl wieder her
; IMMEDIATE
|
Leo: |
Das kapier ich.
Gerettet werden kann nicht auf den gewöhnlichen Stack,
da das nächste Wort alles Mögliche sein kann.
Man weiß also nicht, was es mit dem Stack anrichten wird.
Und zweitens?
|
Theo: |
Zweitens steht da knallhart HEX drin,
ich hätte aber gern eine Routine,
die dasselbe auch mit anderen Basiszahlen fertig bringt.
Das könnte man mit einer Variablen oder einem Value lösen,
aber ich betrachte das als eine ausgezeichnete Gelegenheit,
dich noch einmal mit CREATE und DOES> zu konfrontieren.
Sieh dir das mal an:
: FFBASE ( zeitweilige-basiszahl ccc -- )
CREATE C, ALIGN IMMEDIATE
DOES> C@ ( tempbase )
BASE @ >R \ Save Basiszahl
BASE ! \ Zeitweilige Basiszahl
BL WORD COUNT EVALUATE \ Aktion!
R> BASE ! ; \ Stell Basiszahl wieder her
DECIMAL
16 FFBASE HX 2 FFBASE BN 10 FFBASE DM
|