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 ...),这可能需要一个数字输入。
我是 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 ...),这可能需要一个数字输入。