lisp嵌套if语句

时间:2014-03-22 21:03:28

标签: common-lisp nested-if

我正在使用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的误解而且我一直在寻找年龄并且无法提出解决方案。

2 个答案:

答案 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。您可以使用andor代替嵌套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.
相关问题