- Oplossing van de opgave in PiF 10
- Het einde van HIER
Opgave 10a
Wat doet deze code?
0 (sdk zz over + swap do i c@ z < - loop [char] . emit .
Antwoord:
Het aantal ingevulde vakjes verschijnt als extensie achter de naam geplakt.
Opgave 10b
Maak een .SDK die HIER op stack verwacht.
: .sdk ( hier -- ) .. ;
De oude definitie van .SDK gebruikt zelf de HIER niet. We moeten nu niet alleen VAKNR maar ook HIER aan .VAKJE doorgeven via de stack.
: .sdk ( -- ) \ Oude versie
0 \ vaknr
zb 0 do
cr cr zb 0 do
cr cr zb 0 do
3 spaces zb 0 do dup .vakje 1+
loop loop loop loop drop ;
: .sdk ( hier -- ) \ Nieuwe versie
0 \ hier en vaknr
zb 0 do
cr cr zb 0 do
cr cr zb 0 do
3 spaces zb 0 do 2dup .vakje 1+
loop loop loop loop 2drop ;
.VAKJE ontdoen we van het woord HIER omdat HIER nu op stack staat.
: .vakje ( nr -- ) \ Oude versie
hier over = [char] > and bl or emit
(sdk + c@ >symbool emit
space ;
: .vakje ( hier nr -- ) \ Nieuwe versie
tuck = [char] > and bl or emit
(sdk + c@ >symbool emit
space ;
In het hoofdwoord SU moeten we voor .SDK het woord HIER invoegen.
: su ( -- ) \ Het hoofdwoord
page
begin 0 0 at-xy
cr space naam count type
hier .sdk
cr cr .s
key
27 over <> \ Stop met [escape]
while doen drop
repeat
drop ;
Het einde van HIER
We gaan even door met het elimineren van de value HIER uit de code:
Bij het binnengaan van SU zetten we een nul op stack, de startwaarde voor HIER. We schaffen HIER als value af en laten zijn waarde blijvend op stack staan, als bovenste, dus steeds goed bereikbaar.
: su ( -- ) \ Nieuwe versie
0 \ hier
page
begin 0 0 at-xy
cr space naam count type
dup .sdk
cr cr .s
key swap \ key hier
over 27 <> \ Stop met [escape]
while doen nip \ hier
repeat
2drop ;
Dat heeft gevolgen voor DOEN
: doen ( key -- key ) \ Oude versie
[char] [ over = if hier west to hier exit then
[char] ] over = if hier oost to hier exit then
[char] = over = if hier noord to hier exit then
[char] ' over = if hier zuid to hier exit then
dup symbool? if hier invullen exit then
[char] \ over = if hleeg? ?exit h@ to hier exit then
bl over = if hier wis exit then
;
: doen ( key hier -- key hier ) \ Nieuwe versie
over [char] [ = if west exit then
over [char] ] = if oost exit then
over [char] = = if noord exit then
over [char] ' = if zuid exit then
over symbool? if over invullen exit then
over [char] \ = if hleeg? ?exit drop h@ exit then
over bl = if dup wis exit then
;
Hier vind je sudo5.f, de file met de code tot nu toe.
Opgave 11
a) Bedenk voor- en nadelen van HIER op stack tegenover HIER als value.
b) Heeft het nut om in de definitie van H> de code HP C@ door H@ te vervangen?
: >h ( x -- ) hp 1+ dup to hp c! ;
: h@ ( -- x ) hp c@ ;
: h> ( -- x ) hp c@ hp 1- to hp ;