INVOERSTROOM, oplossingen

(an,nov2025)
  1. {{TEL ... }}

    \ Tel het aantal tekens en woorden in een tekst met }} als afsluiter
    decimal
    : {{TEL ( invoerstroom -- #tekens #woorden )
        0 dup
        begin  bl-word count   s" }}" 2over s<>
        while  nip 1 d+
        repeat 2drop ;
    
    \ Voorbeeld
    {{TEL
    Het Egel-project bestaat uit ongeveer 50 eenvoudige voorbeelden
    van hardwarebesturing met noForth op de MSP430. In elk
    voorbeeld vindt u een bestand met Forth-code, documentatie
    en links naar meer informatie op internet. }}  ( 189 32 )
    
  2. {{SOM ... }}

    \ Som van de getallen in een tekst met }} als afsluiter
    decimal
    : >N ( adr len -- n ok? )       \ len <> 0
        dup 0= ?abort 2dup upper
        bounds 0 >r
        begin  2dup = if 2drop r> true exit then    \ klaar, ok
               count dup ch : ch A within or        \ geen cijfer?
               ch 0 - 9 over u< 7 and -
               dup base @ u<                        \ cijfer?
        while  r> base @ * + >r
        repeat drop 2drop r> false ;                \ geen getal
    
    : {{SOM ( invoerstroom -- som van de getallen in de tekst)
        0
        begin  bl-word count   s" }}" 2over s<>
        while  >n and +
        repeat 2drop ;
    
    \ Met >NUMBER in plaats van >N
    : {{SOM ( invoerstroom -- som van de getallen)
        0
        begin  bl-word count   s" }}" 2over s<>
        while  0 dup 2swap >number nip or 0= and +
        repeat 2drop ;
    
    \ Voorbeeld
    {{SOM
    Etappes op de route Arnhem-Barcelona
    --- Nederland: Arnhem 0 km, Maastricht 156 km
    --- Belgie: Luik 37 km, Arlon 127 km
    --- Luxemburg: Luxemburg 47 km
    --- Frankrijk: Metz 53 km, Nancy 51 km
        Dijon 214 km, Lyon 189 km, Nimes 251 km
        Monpellier 46 km, Perpignan 150 km
    --- Spanje: Gerona 92 km, Barcelona 97 km }}  ( 1510 )
    
  3. C,, ...

    \ Doe een C, zolang het getallen zijn (geen afsluiter nodig) \ Met >N
    : C,, ( invoerstroom -- )
        begin  bl-word
               dup count >n
        while  c, drop
        repeat drop find 0= ?abort
        execute ;
    
    \ Met >NUMBER
    : C,, ( invoerstroom -- )
        begin  bl-word
               dup count 0 dup 2swap >number nip or 0=
        while  c, drop
        repeat drop find 0= ?abort
        execute ;
    
    \ Voorbeeld
    C,, 1 2 3 5 8 13
    21 34 55 89 144 233 align \ klaar
    
    (* Het effect van dit voorbeeld is:
       1 c, 2 c, 3 c, 5 c, 8 c, 13 c, 21 c, 34 c,
       55 c, 89 c, 144 c, 233 c, align
    *)