2011-10-12 15 views
5

Ciao sto cercando di creare un nidificato se in lisp, ma continuiamo a ricevere l'errore e non sappiamo come risolverlo!nidificato se in lisp

** - EVAL: troppi parametri per operatore speciale se:

(defun spread-stones-helper(game-state StoneInHand Player player-index pit-index) 

    ;; Do we have more stones in our hand? 
    (if (> 0 StoneInHand) 
     ;; Are we above the pit limit? 
     (if (> pit-index 5) 
      ;; Switch the player and reset the pit-index to 0 
      (setq player-index (switchplayer player-index)) 
      (setq pit-index '0) 
     ) 

     ;; Add 1 to the pit 
     (set-pit game-state player-index (GetCorrectPit player-index pit-index) (+ (get-pit game-state player-index (GetCorrectPit player-index pit-index)) 1)) 

     ;; Recursive call the function, with one less stone and 1 up in pit-index 
     (spread-stones-helper game-state (- StoneInHand 1) Player player-index (+ pit-index 1)) 
    ) 
    ;; There are no more stones in hand, run capture stones 
    ;; (captureStones game-state StoneInHand Player player-index pit-index) 
) 
+0

Penso che probabilmente ti stai confondendo con lo strano stile paren/indentazione che hai creato. – Ken

risposta

8

in Lisp l'operatore if accetta tre espressioni che sono la condizione, il valore nel caso in cui la condizione è vera e valore quando la condizione è falsa .. . per esempio

(if (< x 0) 
    (print "x is negative") 
    (print "x is greater or equal than zero")) 

si può anche omettere l'ultima espressione e in questo caso si presume di essere NIL.

Se si vuole mettere più espressioni in uno dei due casi li si deve avvolgere in un progn modulo

(if (< x 0) 
    (progn 
     (print "HEY!!!!") 
     (print "The value of x is negative..."))) 

Il caso di avere un if un'espressione con uno solo dei due rami pieni e con molte espressioni è risultato essere molto frequenti e sono stati aggiunti quindi due varianti speciali per questo uso esatto:

(when (< x 0) 
    (do-this) 
    (do-that) 
    (do-even-that-other-thing)) 

(unless (< x 0) 
    (do-this) 
    (do-that) 
    (do-even-that-other-thing)) 

La forma when è equivalente ad

(if (< x 0) 
    (progn 
    (do-this) 
    (do-that) 
    (do-even-that-other-thing))) 

La forma unless ha lo stesso significato, ma con la condizione rovesciata ... in altre parole, è equivalente a

(if (not (< x 0)) 
    (progn 
    (do-this) 
    (do-that) 
    (do-even-that-other-thing))) 

Per ricapitolare si dovrebbe usare if solo quando è necessario scrivere codice per entrambi i rami (il vero e il falso). Altrimenti utilizzare when o unless a seconda di ciò che è più leggibile per il test.

Quando si utilizza un modulo if, è necessario utilizzare uno progn nelle filiali in cui è necessario inserire più di un modulo.

5

Non dimenticare di utilizzare (progn ...) per più di una se-dichiarazione

(defun spread-stones-helper (game-state StoneInHand Player 
          player-index pit-index) 

    ;; Do we have more stones in our hand? 
    (if (> 0 StoneInHand) 
     (progn 
     ;; Are we above the pit limit? 
     (if (> pit-index 5) 
     (progn 
       ;; Switch the player and reset the pit-index to 0 
       (setq player-index (switchplayer player-index)) 
       (setq pit-index '0))) 

     ;; Add 1 to the pit 
     (set-pit game-state player-index 
        (GetCorrectPit player-index pit-index) 
        (+ (get-pit game-state player-index 
           (GetCorrectPit player-index pit-index)) 
        1)) 

     ;; Recursive call the function, with one less stone and 1 
     ;; up in pit-index 
     (spread-stones-helper game-state 
           (- StoneInHand 1) 
           Player 
           player-index 
           (+ pit-index 1)))) 
    ;; There are no more stones in hand, run capture stones 
    ;; (captureStones game-state StoneInHand Player player-index pit-index) 
    ) 
5

" se "esegue un test e due moduli -

Hai dato il primo" se "un test e tre forms

Assume (> 0 StoneInHand) è vero.

Si desidera eseguire entrambe le istruzioni if ​​e set-pit?

Se è così, è necessario metterli in una (progn)