我想写一些这样的Lisp代码
(defstruct board
(size 7)
(matrix (make-array (list size size))
(red-stones 0)
(black-stones 0))
为了定义代表游戏棋盘的结构。
我希望能够创建一个带有制作板的新电路板,它将使用给定尺寸(尺寸x尺寸)动态创建矩阵,这样我就不必从另一个函数调用make-board这就是矩阵。
然而,当我将该代码加载到clisp解释器并尝试创建一个新的板(带有makeboard)时,我收到一条错误消息,告诉我“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))) )
真的,我不喜欢同时提供制作板和创建板,因为这可能会导致编程错误。
答案 0 :(得分: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 lambda lists的CLHS文档。
答案 1 :(得分:1)
真的,我不喜欢同时提供制作板和创建板,因为这可能会导致编程错误。
有一个公平的观点,但是,通过让size
和matrix
都可以导致编程错误。
不需要O(n)来测量数组的大小,所以我只是完全消除了size
个插槽。如果你通常想要board
的那个值,那么很容易做一个简单的包装函数。
如果你想要一个更为通用的解决方案“我的其他一些插槽由我的其他插槽确定”,肯尼蒂尔顿的Cells项目,尽管它现在看起来并不是非常活跃。
最后,我会使用defclass
而不是defstruct
,除非你有理由不这样做。