Недопустимый вызов функции в Common Lisp - PullRequest
2 голосов
/ 30 октября 2010

Я работаю над созданием игры в крестики-нолики для двух игроков и нахожусь в стадии, когда я решаю все ошибки в моем коде. Текущая ошибка, на которой я застрял, - это ошибка illegal function call в следующем коде:

(cond

[...snip...]

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

Что я делаю не так?

РЕДАКТИРОВАТЬ Вся функция выглядит следующим образом:

(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))))

Ответы [ 3 ]

2 голосов
/ 30 октября 2010

Ваша функция выглядит так только потому, что она не имеет правильного отступа.

Выберите код и сделайте отступ в области - любой редактор, который понимает немного Lisp, должен сделать это за вас.В LispWorks это делается с помощью расширенной команды редактора 'Indent Region'.

Вы также можете заменить COND более простым CASE:

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

С помощью CASE всю функцию можно уменьшитьи локальная функция:

(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)))))
0 голосов
/ 30 октября 2010

Я понял это! У меня было слишком много скобок в функции из-за плохих навыков копирования + вставки.

0 голосов
/ 30 октября 2010

Первым делом в нормально оцененной форме почти всегда должен быть символ, который называет функцию, макрос или специальный оператор.Первое, что в вашей форме это список (= CHOICE 3).Больше контекста поможет;как сказал Цирно, это выглядит как бестелесное предложение COND.

edit Я поместил ваш код в функцию и добавил достаточно скобок и определений переменных, чтобы оценить его, и он оценивается нормально.Еще нужно больше контекста.

...