作为一个项目,我需要使用递归在lisp中创建一个罗马数字转换器.在处理罗马数字到英语部分时,我遇到了一个问题,编译器告诉我,我的一个变量是一个未定义的函数.我是lisp的新手,可以使用此程序可能的任何提示或技巧.我想知道我必须做出的改变,以避免得到该错误,如果有人有我的递归的提示,将不胜感激.
我知道我的代码很乱,但我打算学习所有正确的格式化方法,当我有一些有用的东西时.该函数应该采用罗马数字列表,然后将列表的第一个和第二个元素转换为相应的整数并添加它们.它递归调用,直到它返回NIL时它将返回0并添加所有剩余的整数并将其显示为原子.希望这是有道理的.先感谢您.
(defun toNatural (numerals)
"take a list of roman numerals and process them into a natural number"
(cond ((eql numerals NIL) 0)
((< (romans (first (numerals)))
(romans (second (numerals))))
(+ (- (romans (first (numerals))))
(toNatural (cdr (numerals)))))
(t
(+ (romans (first (numerals)))
(toNatural (cdr (numerals)))))))
(defun romans (numer)
"take a numeral and translate it to its integer value and return it"
(cond((eql numer '(M)) 1000)
((eql numer '(D)) 500)
((eql numer '(C)) 100)
((eql numer '(L)) 50)
((eql numer '(X)) 10)
((eql numer '(V)) 5)
((eql numer '(I)) 1)
(t 0)))
Run Code Online (Sandbox Code Playgroud)
这是错误.我为这个项目使用emacs和clisp.
The following functions were used but not defined:
NUMERALS
0 errors, 0 warnings
Run Code Online (Sandbox Code Playgroud)
在Common Lisp中,表单的(blah)意思是"调用函数blah",表单的(blah foobar)意思是"调用函数foo,使用参数foobar".因此,numerals当您确实想要使用变量的值时,您告诉编译器在多个位置调用该函数.
此外,除非您的lisp环境使用"现代模式",否则表示的符号与表示的符号"toNatural"相同,"tonatural"或者"TONATURAL"不使用大小写来区分分词符,请使用" - "(so (defun to-natural ...).
| 归档时间: |
|
| 查看次数: |
495 次 |
| 最近记录: |