0 value owed
0 value paid
: $. ( n -- )
   <# # # [char] . hold #s [char] $ hold #> type ;
: status   ." CHARGE: " owed $. ."    PAID: " paid $. cr ;
: reset   0 to paid 0 to owed ;

: make-change ( n -- ) paid owed - emit-coins reset ;
: ?make-change paid owed >= if make-change then status ;
: charge ( n -- ) +to owed ?make-change ;   : c charge ;
: pay ( n -- ) +to paid ?make-change ;      : p pay ;
: cancel   0 to owed ?make-change ;

create coins 2000 , 1000 , 500 , 100 , 25 , 10 , 5 , 1 ,
: n-coin ( $ coin -- )
   dup -rot /mod 0 ?do over $. space loop nip ;
: emit-coins ( n -- )
   ." DISPENSING ------ "
   coins swap begin dup while
     over @ n-coin >r cell+ r>
   repeat
   cr 2drop ;

." INSTRUCTIONS" cr
." ------------" cr
."  c[harge] --- charge an amount in cents" cr
."  p[ay]    --- pay an amount in cents" cr
." cancel            --- cancel current transaction" cr
." bye               --- exit" cr
status
quit

0 value owed
0 value paid
: $. ( n -- ) <# # # [char] . hold #s [char] $ hold #> type ;
: status   ." CHARGE: " owed $. ."    PAID: " paid $. cr ;
: reset   0 to paid 0 to owed ;
create coins 2000 , 1000 , 500 , 100 , 25 , 10 , 5 , 1 ,
: n-coin ( $ coin -- )
   dup -rot /mod 0 ?do over $. space loop nip ;
: emit-coins ( n -- )
   ." DISPENSING ------ "
   coins swap begin dup while over @ n-coin >r cell+ r> repeat
   cr 2drop ;
: make-change ( n -- ) paid owed - emit-coins reset ;
: ?make-change paid owed >= if make-change then status ;
: charge ( n -- ) +to owed ?make-change ;   : c charge ;
: pay ( n -- ) +to paid ?make-change ;      : p pay ;
: cancel   0 to owed ?make-change ;
." INSTRUCTIONS" cr
." ------------" cr
."  c[harge] --- charge an amount in cents" cr
."  p[ay]    --- pay an amount in cents" cr
." cancel            --- cancel current transaction" cr
." bye               --- exit" cr
status
quit