0

こんにちは、Common Lisp を使用して曲データベースを作成しています。曲情報が適切に形成されていることを確認しようとしています。つまり、曲情報のリストに 6 つの要素がありますが、リスト内の各要素のタイプも確認したいと考えています。最初に6つの要素があることを確認し、次に各要素のタイプを確認することにより、ifステートメントを使用してこれを実行しようとしています。

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

基本的に、私はこのコードを最初に持っています。正直なところ、LISP を使い始めたばかりで、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 で 2 番目のテストに失敗するかどうかがわかりますが、要素数がNIL6 でない場合です。何かandが. _ ここでは、次のように使用します。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 に答える