Clisp编译错误:";“字符串”;这不是一个真实的数字

Clisp编译错误:";“字符串”;这不是一个真实的数字,lisp,common-lisp,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

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

有什么理由会出现这个该死的小错误吗?如果有人能帮忙,我将不胜感激。我已经做了几个小时了。

我不确定state变量应该做什么,但是它是可选的,默认值为1,并且由于您没有将不同的值传递到(tonormal'(“mxxv”“MMCMXX”)),它会触发第一个cond子句,这意味着它将“mxxv”传递到(toroman…),这可能需要一个数字输入。

(长度名册)
-这个表达式是什么意思?谁知道托罗姆人在做什么…@Rainer-呃,这是个打字错误。谢谢你指出这一点。这意味着检查所传递字符串的长度何时为零。令人惊讶的是,托罗曼很好用。@Hex37顺便说一句,格式可以将数字格式化为罗马数字。(格式t“~@R”)啊,你刚才回答了我自己的问题。我不是故意让它去“托罗曼”的。非常感谢。