2016-11-30 4 views
1

私はLISPのゲームマスターマインドを解決するプレイヤーを作成しようとしています。ループは、グローバル変数*counter*内部ループが必要なペグの長さに基づいて色を推測することになって4未満である間に実行するようになっている間、私は、ヘルパー機能ネストされたループ共通LISP

(defparameter *counter* 0) 

;analyze the score to determine whether points need to be added to counter 
(defun analyze (last-response) 
    (if (> (first last-response) 0) 
     (setf *counter* (+ (first last-response) *counter*)))) 

;helper function for finding correct color 
(defun guessColor (length colors last-response) 
    (loop while (< *counter* 4) do 
     (loop for i from 1 to length 
      collect (first colors) 
      (setf colors (rest colors))) 
    (analyze (last-reponse)))) 

;baseline Holyguacamole player will guess all colors before trying all combinations of correct color 
(defun HolyGuacamole (board colors SCSA last-response) 
    (declare (ignore SCSA)) 
    ;(print last-response) 
    (guessColor board colors last-response) 
    (print *counter*) 
    ;(sortColor) 
) 

ザで次のネストされたループを使用してみました(可変長)。私は、マクロ展開の時にコンパイルエラー

に実行してきた(LOOPのWHILE(< COUNTER 4)...)。つかいます ;
ブレイクオン信号を代行受信します。

私はLISPに慣れていないので、そのエラーコードが何を意味し、どのように修正するのかよくわかりません。適切なカッコで正しくネストしたように感じましたが、実際に何が問題なのかは実際には分かりません。

LinkとMastermind環境。

+0

プログラム全体の量はどれくらいですか?あなたはそれを貼り付けることができますか、それとも自己完結型の例に分解することができますか?私は 'score'や' analyze'の定義や '* counter * 'の宣言を見ません。 –

+0

@GregoryNisbetゲーム自体のコードは非常に大きいです。ヘルパー機能と* counter *の宣言を編集しました。スコアが最後の応答に変更されました – trungnt

+0

''(analyze(last-reponse))) ''は ''(last-reponseを分析してください)) ''と思う)... ...他にもいくつかのエラーがあるようです... 'clisp'や' sbcl'で正確なコンパイラエラーを再現できませんでした。 –

答えて

1

原則として、ループを別のループ内にネストするのに障害はありません。しかし、COLLECTまたはCOLLECTING節は@jkiiskiが指摘したように、単一の式しか取ることができません。例えば

、次のプログラム

(defun nested-loop() 
    (loop for i from 1 to 10 doing 
     (loop for j from 1 to 10 collecting 
       (print "some string") 
       (print (list 'nested-loop i j))))) 

(nested-loop) 

はCLISPの下で構文エラーを生成します。 do又はdoing句作品を使用

*** - LOOP: illegal syntax near (PRINT (LIST 'NESTED-LOOP I J)) in 
     (LOOP FOR J FROM 1 TO 10 COLLECTING (PRINT "some string") 
     (PRINT (LIST 'NESTED-LOOP I J))) 

progncollecting句に関連付けられている複数の式をグループ化しないように。

(defun nested-loop() 
    (loop for i from 1 to 10 doing 
     (loop for j from 1 to 10 collecting 
       (progn 
       (print "some string") 
       (print (list 'nested-loop i j)))))) 

(nested-loop) 
+0

お返事ありがとうございます。さらに考えてみると、ネストされたループを使って私がこのゲームに必要な方法で動作するとは思わない。私は以下のコードを書き直しました。それはコンパイルされますが、print last-responseでテストすると、すべてのNILの – trungnt