4.3BSD/usr/contrib/icon/port/roman.icn

#
#          R O M A N   N U M E R A L S
#

#  This program takes Arabic numerals from standard input and writes
#  the corresponding Roman numerals to standard outout.

procedure main()
   local n
   while n := read() do
      write(roman(n) | "cannot convert")
end

procedure roman(n)
   local arabic, result
   static equiv
   initial equiv := ["","I","II","III","IV","V","VI","VII","VIII","IX"]
   integer(n) > 0 | fail
   result := ""
   every arabic := !n do
      result := map(result,"IVXLCDM","XLCDM**") || equiv[arabic+1]
   if find("*",result) then fail else return result
end