2

私は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では、これは拡張エディタコマンド「インデントリージョン」を使用して実行されます。

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)))))
于 2010-10-30T06:49:01.267 に答える
0

私はそれを考え出した!コピーと貼り付けのスキルが低いため、関数の括弧が多すぎました。

于 2010-10-30T01:35:23.123 に答える
0

通常評価される形式の最初のものは、ほとんどの場合、関数、マクロ、または特殊演算子を指定する記号である必要があります。フォームの最初のものはリスト(= CHOICE 3)です。より多くのコンテキストが役立ちます。チルノが言ったように、これは具体化されていないCOND条項のように見えます。

編集私はあなたのコードを関数に入れ、それを評価するのに十分な括弧と変数定義を追加しました、そしてそれはうまく評価されます。さらにコンテキストが必要です。

于 2010-10-30T00:45:13.693 に答える