2011-10-12 11 views
5

Hola, estoy tratando de crear un anidado si está en lisp, pero seguimos obteniendo el error, ¡y no sabemos cómo solucionarlo!Anidado si en lisp

** - EVAL: demasiados parámetros de operador especial SI:

(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

Creo que probablemente se esté confundiendo con el extraño estilo de hendidura/muesca que ha creado. – Ken

Respuesta

8

en Lisp el operador if acepta tres expresiones que son la condición, el valor en caso de que la condición es verdadera y valor cuando la condición es falsa .. ., por ejemplo

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

también es posible omitir la última expresión y en este caso se asume es nulo.

Si usted quiere poner más expresiones en uno de los dos casos hay que envolverlos en una forma progn

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

el caso de tener una expresión if con sólo una de las dos ramas llenas y con muchas expresiones se encontró que era muy frecuente y se añadieron por lo tanto dos variaciones especiales para este uso exacto:

(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 anterior es equivalente a

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

La forma unless tiene el mismo significado, pero con la condición invierte ... en otras palabras, es equivalente a

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

En resumen se debe utilizar if sólo cuando es necesario escribir código para ambas ramas (la verdadera y la falsa). De lo contrario, use when o unless según lo que sea más legible para su prueba.

Al usar un formulario if debe usar un progn en las sucursales donde debe colocar más de un formulario.

5

No se olvide de utilizar (progn ...) para más de una sentencia if

(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

" si "toma una prueba y dos formularios:

Has dado la primera prueba" si "y tres formas

Suponer (> 0 StoneInHand) es verdadero.

¿Desea ejecutar tanto el segundo enunciado if como el set-pit?

Si es así, es necesario envolverlos en un (progn)