4

このようなLispコードを書きたい

(defstruct board
    (size 7)
    (matrix (make-array (list size size))
    (red-stones 0)
    (black-stones 0))

ゲームのボードを表す構造を定義するため。

指定された次元(サイズxサイズ)でその場でマトリックスを作成するmake-boardを使用して新しいボードを作成できるようにしたいので、make-boardを作成する別の関数からmake-boardを呼び出す必要はありません。マトリックス。

ただし、そのコードをclispインタープリターにロードして、(make-boardを使用して)新しいボードを作成しようとすると、「size」に値がないことを示すエラーメッセージが表示されます。

構造の定義そのもので構造のフィールドを使用する方法はありますか?

それとも私はこれをすべきですか?

(defstruct board
    size
    matrix
    (red-stones 0)
    (black-stones 0))

(defun create-board (size)
    (make-board :size size :matrix (make-array (list size size))) )

本当に、make-boardとcreate-boardの両方を利用できるようにするのは好きではありません。プログラミングの間違いにつながる可能性があるからです。

4

2 に答える 2

2

boaコンストラクターを使用できます。

(defstruct (board
    (:constructor make-board (&optional (size 7)
                              &aux (matrix (make-array (list size size))))))
  (size)
  (matrix)
  (red-stones 0)
  (black-stones 0))

defstructおよびBOAラムダリストのCLHSドキュメント。

于 2010-12-04T19:15:18.403 に答える
1

本当に、make-boardとcreate-boardの両方を利用できるようにするのは好きではありません。プログラミングの間違いにつながる可能性があるからです。

公平な点はありますがsizematrix両方を利用できるようにすることで、プログラミングの間違いにもつながる可能性があります。

配列のサイズを測定するのにO(n)は必要ないので、sizeスロットを完全に削除します。の値が一般的に必要な場合boardは、単純なラッパー関数を簡単に作成できます。

「私のスロットのいくつかは他のスロットのいくつかによって決定される」というより一般的な解決策が必要な場合は、Kenny TiltonのCellsプロジェクトがありますが、最近はそれほどアクティブではないようです。

最後に、あなたがそうしない理由がない限り、私はではdefclassなく使用します。defstruct

于 2010-12-04T18:47:07.313 に答える