我是lisp的新手,如果这个问题听起来很迂腐,请道歉:
我试图为一个家庭作业项目构建一个Lisp程序,它将一系列罗马数字改为十进制数,使用1函数和递归。不允许使用变量,预测,赋值或循环。
到目前为止我所拥有的是:
(defun tonormal (inputs &optional (state 1) rostr)
(COND
((= state 1) (dolist (x inputs) (print (toroman nil 2 x))))
((= state 2) (COND
((equal (subseq rostr 0 1) "M" ) (+ 1000 (toroman nil 2 (subseq rostr 1))))
((equal (subseq rostr 0 2) "CM") (+ 900 (toroman nil 2 (subseq rostr 2))))
((equal (subseq rostr 0 1) "D" ) (+ 500 (toroman nil 2 (subseq rostr 1))))
((equal (subseq rostr 0 2) "CD") (+ 400 (toroman nil 2 (subseq rostr 2))))
((equal (subseq rostr 0 1) "C" ) (+ 100 (toroman nil 2 (subseq rostr 1))))
((equal (subseq rostr 0 2) "XC") (+ 90 (toroman nil 2 (subseq rostr 2))))
((equal (subseq rostr 0 1) "L" ) (+ 50 (toroman nil 2 (subseq rostr 1))))
((equal (subseq rostr 0 2) "XL") (+ 40 (toroman nil 2 (subseq rostr 2))))
((equal (subseq rostr 0 1) "X" ) (+ 10 (toroman nil 2 (subseq rostr 1))))
((equal (subseq rostr 0 2) "IX") (+ 9 (toroman nil 2 (subseq rostr 2))))
((equal (subseq rostr 0 1) "V" ) (+ 5 (toroman nil 2 (subseq rostr 1))))
((equal (subseq rostr 0 2) "IV") (+ 4 (toroman nil 2 (subseq rostr 2))))
((equal (subseq rostr 0 1) "I" ) (+ 1 (toroman nil 2 (subseq rostr 1))))
((= (length rostr) 0) (values))))))
当我尝试调用该函数时,收到此错误消息:
[191]> (tonormal '("MXXIV" "MMCMXX"))
*** - >=: "MXXIV" is not a real number
这个可恶的小错误是否有任何原因爆发?如果有人可以提供帮助,我们将不胜感激。我已经在这里工作了几个小时。
答案 0 :(得分:0)
我不确定状态变量应该做什么,但它是可选的,默认值为1,因为你没有将不同的值传递给(tonormal'(“MXXIV”“MMCMXX”) ),它触发了第一个cond子句,这意味着它将“MXXIV”传递给(toroman ...),这可能需要数字输入。