Clisp编译错误:" string"不是一个真实的数字

时间:2015-11-30 22:44:34

标签: lisp common-lisp

我是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

这个可恶的小错误是否有任何原因爆发?如果有人可以提供帮助,我们将不胜感激。我已经在这里工作了几个小时。

1 个答案:

答案 0 :(得分:0)

我不确定状态变量应该做什么,但它是可选的,默认值为1,因为你没有将不同的值传递给(tonormal'(“MXXIV”“MMCMXX”) ),它触发了第一个cond子句,这意味着它将“MXXIV”传递给(toroman ...),这可能需要数字输入。