0

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

4

2 回答 2

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

看看这个你会得到incomplete它是否是 6 个元素并且没有通过第二次测试,但NIL如果它不是 6 个元素。如果需要通过多个测试才能成为.,您可以使用andand而不是嵌套 if 。我会在这里使用,像这样:orTand

(defun checkSongInfo (par1 par2)
  (if (and (= 6 (length (nth par1 par2))) 
           (integerp (first (nth par1 par2))))
      'complete
      'incomplete))

complete如果两个测试都通过,incomplete否则 返回。

于 2014-03-23T00:26:32.663 回答
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.
于 2014-03-22T21:15:05.843 回答