PiF 11

  <terug>
- 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 ;


 
Groeten,
A.N.
  <terug>