This is an implementation with lots of parentheses :)
#lang scheme
(define (sum-of-ints li [sum 0])
(if [< (length li) 2]
(+ sum (apply + li))
(let ([f (first li)]
[s (second li)])
(if [> s f]
(sum-of-ints (cddr li) (+ sum (- s f)))
(sum-of-ints (cdr li) (+ sum f))))))
(define roman-to-dec '())
(set! roman-to-dec
(let ([rtoa #hash((#\M . 1000)
(#\D . 500)
(#\C . 100)
(#\L . 50)
(#\X . 10)
(#\V . 5)
(#\I . 1))])
(lambda (roman)
(sum-of-ints
(map
(lambda (x) (hash-ref rtoa x))
(string->list (string-upcase roman)))))))
(define test-data '("XLII" "LXIX" "mi" "MCMLXXXV"))
(for ([r test-data])
(printf "~a ~a~n" r (roman-to-dec r)))
+% mzscheme roman.ss
XLII 42
LXIX 69
mi 1001
MCMLXXXV 1985
Like the perl version, it uses a lexical scope to hide the hash.
It however uses a method of combining the numbers that is closer to how we'd do it in our heads i.e.
following the Subtractive principle