And You can do it with magic of meta programming:
defmodule RomanParser do
def parse(input), do: parse(input, 0)
numerals = [
{"M", 1000},
{"CM", 900},
{"D", 500},
{"CD", 400},
{"C", 100},
{"XC", 90},
{"L", 50},
{"XL", 40},
{"X", 10},
{"IX", 9},
{"V", 5},
{"IV", 4},
{"I", 1}
]
for {roman, decimal} <- numerals do
defp parse(unquote(roman) <> rest, total), do: parse(rest, total + unquote(decimal))
end
defp parse("", total), do: total
end
RomanParser.parse("MMMDXVI") #=> 3516






















