Pergunta

Eu estou trabalhando na confecção de um para dois jogadores, tic-tac-toe jogo, e estou na fase onde eu trabalho todos os erros na minha código.O erro atual, eu estou preso em um illegal function call erro no código a seguir:

(cond

[...snip...]

((= CHOICE 3)
 (IF (NUMBERP (AREF *BOARD* 0 2))
     (SETF (AREF *BOARD* 0 2) *MARKER*)
     (INVALID-SELECTION)))

O que estou fazendo de errado?

EDITAR Toda a função se parece com isso:

(defun select (choice)
    (cond ((= choice 1)
               (if (numberp (aref *board* 0 0)) (setf (aref *board* 0 0) *marker*)
                                                (invalid-selection))))
                ((= choice 2)
               (if (numberp (aref *board* 0 1)) (setf (aref *board* 0 1) *marker*)
                                                (invalid-selection))))
              ((= choice 3)
               (if (numberp (aref *board* 0 2)) (setf (aref *board* 0 2) *marker*)
                                                (invalid-selection))))
              ((= choice 4)
               (if (numberp (aref *board* 1 0)) (setf (aref *board* 1 0) *marker*)
                                                (invalid-selection))))
              ((= choice 5)
               (if (numberp (aref *board* 1 1)) (setf (aref *board* 1 1) *marker*)
                                                (invalid-selection))))
              ((= choice 6)
               (if (numberp (aref *board* 1 2)) (setf (aref *board* 1 2) *marker*)
                                                (invalid-selection))))
              ((= choice 7)
               (if (numberp (aref *board* 2 0)) (setf (aref *board* 2 0) *marker*)
                                                (invalid-selection))))
              ((= choice 8)
               (if (numberp (aref *board* 2 1)) (setf (aref *board* 2 1) *marker*)
                                                (invalid-selection))))
              ((= choice 9)
               (if (numberp (aref *board* 2 2)) (setf (aref *board* 2 2) *marker*)
                                                (invalid-selection))))
Foi útil?

Solução 3

Eu descobri! Eu tinha muitos parênteses na função devido a poucas habilidades de cópia+colagem.

Outras dicas

Sua função parece assim, apenas porque não é recuada corretamente.

Selecione o código e recupere a região - qualquer editor que entenda um pouco o LISP, deve fazer isso por você. Na Lispworks, isso é feito com o comando do editor estendido 'Região do Recurso'.

Você também pode substituir o COND por um caso mais simples:

(case choice
  (1 ...)
  (2 ...))

Toda a função pode ser menor usando estojo e uma função local:

(defun select (choice)
  (flet ((do-something (x y)
           (if (numberp (aref *board* x y))
               (setf (aref *board* x y) *marker*)
             (invalid-selection))))
    (case choice
      (1 (do-something 0 0))
      (2 (do-something 0 1))
      (3 (do-something 0 2))
      (4 (do-something 1 0))
      (5 (do-something 1 1))
      (6 (do-something 1 2))
      (7 (do-something 2 0))
      (8 (do-something 2 1))
      (9 (do-something 2 2)))))

A primeira coisa que normalmente seriam avaliados formulário deve quase sempre ser um símbolo de que os nomes de uma função, macro, ou operador especial.A primeira coisa em seu formulário é a lista (= CHOICE 3).Mais contexto, iria ajudar;como Cirno disse, isso parece um desencarnado COND cláusula.

editar Eu coloquei o seu código em uma função e adicionado o suficiente parênteses e definições de variáveis para avaliar isso, e avalia-se bem.Ainda precisa de mais contexto.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top