我正在使用Common lisp创建一个歌曲数据库,我尝试检查歌曲信息是否格式正确 - 即它在歌曲信息列表中有6个元素,但我还想检查列表中每个元素的类型。我尝试使用if语句,首先检查是否有6个元素,然后检查每个元素的类型。
(defun checkSongInfo (par1 par2)
(if (= 6 (length (nth par1 par2))
(if (intergerp (first (nth par1 par2)))) 'complete 'incomplete))
所以基本上我开始使用这个代码,老实说我刚开始使用LISP并且不熟悉它。基本上我试图在这里做的是检查6个元素,如果这是成功的,if语句的成功结果应该是检查列表的第一个元素,歌曲和列表作为参数传递,这些部分我的代码应该工作,因为我已经尝试将它们直接输入终端并且他们做他们应该做的事情。问题在于if语句,目前它告诉我参数太少了。我做的第一个if语句
if(=6 (length (nth par1 par2))) 'complete 'incomplete
但是当我输入另一个if语句时,它给了我if语句操作符错误消息的参数很少。这可能只是由于我对LISP的误解而且我一直在寻找年龄并且无法提出解决方案。
答案 0 :(得分:3)
您的括号出现问题,而且您的代码中可能拼写错误integerp
。我想你想这样做:
(defun checkSongInfo (par1 par2)
(if (= 6 (length (nth par1 par2))) ; added a ) here
(if (integerp (first (nth par1 par2))) ; removed a ) here, intergerp => integerp
'complete
'incomplete))) ; added a ) here
如果它是6个元素并且第二个测试失败,那么你将得到incomplete
,如果它不是6个元素,则会NIL
。您可以使用and
和or
代替嵌套ifs,如果有多个测试需要通过T
。我会在这里使用and
,如下所示:
(defun checkSongInfo (par1 par2)
(if (and (= 6 (length (nth par1 par2)))
(integerp (first (nth par1 par2))))
'complete
'incomplete))
如果两个测试都通过,则返回complete
,否则返回incomplete
。
答案 1 :(得分:1)
else
表单是if
的可选表单。从风格上讲,如果没有else
表达式,您可以使用when
。
(defun checkSongInfo (par1 par2)
(when (= 6 (length (nth par1 par2))) ; You're missing a ) here.
(if (intergerp (first (nth par1 par2)))
'complete
'incomplete))) ; Also missed a ) here.