2

我正在制作一个两人井字游戏,并且正处于解决代码中所有错误的阶段。我坚持的当前错误是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))))
4

3 回答 3

2

您的函数只是看起来像那样,只是因为它没有正确缩进。

选择代码并缩进该区域 - 任何懂一点 Lisp 的编辑器都应该为你做这件事。在 LispWorks 中,这是通过扩展编辑器命令“缩进区域”完成的。

您还可以用更简单的 CASE 替换 COND:

(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)))))
于 2010-10-30T06:49:01.267 回答
0

正常求值形式的第一件事几乎总是一个符号,它命名一个函数、宏或特殊运算符。表单中的第一件事是列表(= CHOICE 3)。更多的上下文会有所帮助;正如 Cirno 所说,这看起来像是一个没有实体的 COND 子句。

编辑我把你的代码放在一个函数中,并添加了足够的括号和变量定义来评估它,它评估得很好。仍然需要更多的上下文。

于 2010-10-30T00:45:13.693 回答
0

我想到了!由于复制+粘贴技能不佳,我在函数中有太多括号。

于 2010-10-30T01:35:23.123 回答