\ Romeinse cijfers - an 6-III-2025
decimal
create LIJST decimal    1000 , 10 , 5 , 1 , 100 , 500 , 50 ,
: CH>X ( ch -- n )      upc 87 mod 7 mod cells lijst + @ ;
0 value &               \ voor KEY en voor de leesbaarheid
: R>A ( <keys> -- )   0.                \ subtotaal en laatste-KEYwaarde
    begin  KEY to &   bl & <            \ geen afsluiter?
    while  & emit
           & ch>x 2dup >r > ?negate + r>
    repeat + space . ;
: ROME ( -- ) begin begin r>a
    & bl    = while space repeat
    & hx 0D = while cr    repeat ;
Negeer ongeldige tekens, voor 32bits forth
decimal
create LIJST decimal    1000 , 10 , 5 , 1 , 100 , 500 , 50 ,
: CH>X ( ch -- n )      upc 87 mod 7 mod cells lijst + @ ;
0 value &               \ voor KEY en voor de leesbaarheid
: GELDIG? ( ch -- geldig? )  ch A max   ch z min
    31 and   1 swap lshift   hx 1403218 and ;
                              ( XVMLIDC )
: R>A ( <keys> -- )   0.                \ subtotaal en laatste-KEYwaarde
    begin  KEY to &   bl & <            \ geen afsluiter?
    while  & geldig?
           if  & emit
               & ch>x 2dup >r > ?negate + r>
           then
    repeat + space . ;
: ROME ( -- ) begin begin r>a
    & bl    = while space repeat
    & hx 0D = while cr    repeat ;
\ Test voor de laatst gedefinieerde CH>X
: test ( -- ) s" MDCLXVI" 2dup type ."  ---> "
    for count s" ' CH>X" evaluate execute . next drop ;
\ Negen CH>X versies
\ Met IF's
\ 1
                                                     \ cellen
: CH>X ( ch -- n ) upc                               \ msp 55, arm 83, risc 44
    dup ch I = if drop 1    else
    dup ch V = if drop 5    else
    dup ch X = if drop 10   else
    dup ch L = if drop 50   else
    dup ch C = if drop 100  else
    dup ch D = if drop 500  else
        ch M = if      1000 else 0
    then then then then then then then ;
test
\ 2
: CH>X ( ch -- n ) upc to &                          \ msp 52, arm 73, risc 39
    & ch I = if 1    exit then
    & ch V = if 5    exit then
    & ch X = if 10   exit then
    & ch L = if 50   exit then
    & ch C = if 100  exit then
    & ch D = if 500  exit then
    & ch M = if 1000 exit then 0 ;
test
\ Alfabetisch met IF's, CDI L MXV
\ 3
: CH>X ( ch -- n ) upc                               \ msp 40, arm 55, risc 29
    dup ch L - s>d              \ ch ch-L neg?
    if  drop ch D - s>d         ( CDI )
        if 100 nip exit then
        if 1       exit then
           500     exit
    then
    if ch V - s>d               ( MVX )
        if 1000 nip exit then
        if 10       exit then
           5        exit
    then
           50 nip ;             ( L )
test
\ Met 2 lijsten en uitgeschreven SCAN
\ 4
create CH>X ( ch -- n )                              \ msp 36, arm 34, risc 25
    1 , 5 , 10 , 50 , 100 , 500 , 1000 ,
    does> ( ch lijst ) swap upc >r
    s" MDCLXVI" bounds
    begin count r@ <> while 2dup < until then rdrop
    - cells + @ ;
test
\ Idem met de noForth SCAN
\ 5
create CH>X ( ch -- n )  \ Q                         \ msp 30, arm 26, risc 21
    5000 , 1 , 5 , 10 , 50 , 100 , 500 , 1000 ,
    does> ( ch lijst ) swap upc >r
    s" MDCLXVI" bounds r> scan
    - cells + @ ;
test
\ Rekenend, zonder IF's
\ 6
create CH>X ( ch -- n )                              \ msp 25, arm 26, risc 19
    10 , 5 , 1 , 100 , 500 , 50 , 1000 ,            \ XVICDLM
    does> swap 31 and 24 mod 7 mod                  \ 0123456 index
    cells + @ ;
test
\ 7
create CH>X ( ch -- n )                              \ msp 25 , arm 25, risc 19
    50 , 1000 , 5 , 1 , 10 , 100 , 500 , 0 ,        \ LMVIXCD?
    does> swap upc 38 mod 7 and                     \ 01234567 index
    cells + @ ;
test
\ 8
create CH>X ( ch -- n )                              \ msp 24, arm 24, risc 18
    1000 , 10 , 5 , 1 , 100 , 500 , 50 ,            \ MXVICDL
    does> swap upc 87 mod 7 mod                     \ 0123456 index
    cells + @ ;
test
\ Het kan nog erger (past niet in 16bits forth)
\ 9
: CH>X  ( ch  -- n )                                 \ msp --, arm 37, risc 21
    31 and 24 mod 7 mod 975905 swap 3 * rshift
    dup 4 and 1+ swap 3 and for 10 * next ;
test
   \ <><>