Chamada de Função ilegal em Common Lisp
-
27-09-2019 - |
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))))
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.