Task

Create a function taking a positive integer as its parameter and returning a string containing the Roman numeral representation of that integer. Modern Roman numerals are written by expressing each digit separately, starting with the left most digit and skipping any digit with a value of zero.



In Roman numerals:

 1990 is rendered: 1000=M, 900=CM, 90=XC; resulting in MCMXC
 2008 is written as 2000=MM, 8=VIII; or MMVIII
 1666 uses each Roman symbol in descending order: MDCLXVI


 
: vector ( ...n"- )
  here [ &, times ] dip : .data ` swap ` + ` @ ` do ` ; ;
: .I  dup     @ ^buffer'add ;
: .V  dup 1 + @ ^buffer'add ;
: .X  dup 2 + @ ^buffer'add ;
 
[ .I .X       drop ]
[ .V .I .I .I drop ]
[ .V .I .I    drop ]
[ .V .I       drop ]
[ .V          drop ]
[ .I .V       drop ]
[ .I .I .I    drop ]
[ .I .I       drop ]
[ .I          drop ]
&drop
10 vector .digit
 
: record ( an- )
  10 /mod dup [ [ over 2 + ] dip record ] &drop if .digit ;
: toRoman   ( n-a )
  here ^buffer'set
  dup 1 3999 within 0 =
  [ "EX LIMITO!\n" ] [ "IVXLCDM" swap record here ] if ;
 