如何使用定义中的参数在Lisp中定义结构

时间:2010-12-04 17:05:44

标签: lisp common-lisp structure clisp

我想写一些这样的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))) )

真的,我不喜欢同时提供制作板和创建板,因为这可能会导致编程错误。

2 个答案:

答案 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))

defstructBOA lambda lists的CLHS文档。

答案 1 :(得分:1)

  

真的,我不喜欢同时提供制作板和创建板,因为这可能会导致编程错误。

有一个公平的观点,但是,通过让sizematrix都可以导致编程错误。

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

如果你想要一个更为通用的解决方案“我的其他一些插槽由我的其他插槽确定”,肯尼蒂尔顿的Cells项目,尽管它现在看起来并不是非常活跃。

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