У меня есть программа lisp, которая преобразует римские цифры в десятичную форму. Он отлично работает для корректных входных данных, однако я не уверен, как проверить, является ли вход действительной римской цифрой. В настоящее время, например, при некорректном вводе («MIM»), он по-прежнему пытается его неправильно преобразовать. Мне нужно это, чтобы вместо этого вернуть сообщение ERROR. преобразование типаLISP - Проверьте конвертер римской цифры для действительной римской цифры
(defun mapRomanToDecimal (chars nums string)
(loop as char across string
as i = (position char chars)
collect (and i (nth i nums))))
(defun parseThroughRoman (R)
(loop with nums = (mapRomanToDecimal "IVXLCDM" '(1 5 10 50 100 500 1000) R)
as (A B) on nums if A sum (if (and B (< A B)) (- A) A)))
(defun romanToDecimal (RomanNumeral)
(format t "~d~%" (parseThroughRoman (numlist-to-string RomanNumeral))))
(defun numlist-to-string (lst)
(when lst
(concatenate 'string
(write-to-string (car lst)) (numlist-to-string (cdr lst)))))
(romanToDecimal '(C D V)) -> 405
(romanToDecimal '(M I M)) -> 1999
(1) Обратите внимание, что ' "MIM"' и ' '(MIM)' разные значения (строка против списка) , (2) Вам нужно четко указать правило, которое указывает, что делает ввод действительным или нет. Затем вы сможете добавить чеки. (3) стиль: тире-разделенные имена, нет camelCase, пожалуйста. – coredump
Я знаю, что MCM действителен в течение 1900 года, то почему MIM не действует в 1999 году? – Sylwester
Также обратите внимание, что формат Common Lisp уже может [печатать как римские цифры] (http://www.lispworks.com/documentation/HyperSpec/Body/22_cba.htm). –