4

我想写一些这样的 Lisp 代码

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

为了定义一个代表游戏棋盘的结构。

我希望能够创建一个带有 make-board 的新板,它将使用给定的尺寸(大小 x 大小)动态创建矩阵,这样我就不必从另一个函数调用 make-board矩阵。

但是,当我将该代码加载到 clisp 解释器并尝试制作一个新板(使用 make-board)时,我收到一条错误消息,告诉我“大小”没有价值。

有没有办法在结构的定义中使用结构的字段?

或者我应该这样做吗?

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

defstructBOA lambda 列表的 CLHS 文档。

于 2010-12-04T19:15:18.403 回答
1

真的,我不喜欢同时使用 make-board 和 create-board,因为这可能会导致编程错误。

有一个公平的观点,但是,size如果matrix两者都可用,也会导致编程错误。

测量数组的大小不需要 O(n),所以我只是size完全消除了这个插槽。如果您通常想要 a 的值board,则很容易制作一个简单的包装函数。

如果您想要一个更通用的解决方案来解决“我的一些插槽由我的其他一些插槽决定”,肯尼蒂尔顿的细胞项目,尽管这些天它似乎并不十分活跃。

最后,除非你有理由不这样做,否则我会使用defclass而不是。defstruct

于 2010-12-04T18:47:07.313 回答