Clisp compile error: "string" is not a real number

Clisp compile error: "string" is not a real number

我是 lisp 的新手,如果这个问题听起来很迂腐,我深表歉意:

我正在尝试为家庭作业项目构建一个 Lisp 程序,该项目使用一个函数和递归将一系列罗马数字更改为十进制数字。不允许使用变量、progn、赋值或循环。

我目前的情况是这样的:

(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,并且由于您没有将不同的值传递给 (tonormal '("MXXIV" "MMCMXX")), 它触发了第一个 cond 子句,这意味着它将 "MXXIV" 传递给 (toroman ...),这可能需要一个数字输入。