1
ローマ数字を10進形式に変換する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)スタイル:ダッシュ区切り名、ラクダキャセない、してください。 – coredump
私はMCMが1900年に有効であることを知っていますが、なぜMIMは1999年に有効ではありませんか? – Sylwester
Common Lispのフォーマットは、すでに[ローマ数字で印刷](http://www.lispworks.com/documentation/HyperSpec/Body/22_cba.htm)であることにも注意してください。 –