Clisp编译错误:";“字符串”;这不是一个真实的数字
我是lisp新手,如果这个问题听起来很迂腐,我深表歉意: 我正在尝试为一个家庭作业项目构建一个Lisp程序,该程序使用1函数和递归将一系列罗马数字转换为十进制数字。不允许使用变量、程序、赋值或循环 到目前为止,我得到的是: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
(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”)啊,你刚才回答了我自己的问题。我不是故意让它去“托罗曼”的。非常感谢。