2010-12-04 28 views
4

使用参数Lisp的结构,我想,以定义表示游戏的董事会结构来写一些Lisp代码这样如何定义的定义

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

我希望能够创建一个带有制作板的新电路板,该电路板将随着给定尺寸(大小x尺寸)随时创建矩阵,这样我就不必从另一个调用制作板函数,使矩阵。

但是,当我将该代码加载到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都可用,因为这可能会导致编程错误。

+0

我建议你熟悉一下** CLOS **,它本质上就是Common Lisp的对象/类系统。将_board_定义为一个类,您可以通过`(defmethod create-board((type-of thing)))`指定_methods_。也就是说,用于使用同一个类的各种_methods_依赖于什么类型的用户形式提供的信息。如果你确实下了这个兔子洞,我建议[这个](http://www.aiai.ed.ac.uk/~jeff/clos-guide.html)** CLOS **介绍,以及包含:CL-MOP _Closer对于元类的MOP_系统,ql:quickload-able。 – miercoledi 2014-10-10 03:00:49

回答

2

你可以使用一个蟒蛇构造:

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

CLHS文档defstructBOA lambda lists

1

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

有一个公平点,但随后,由具有sizematrix都可用可导致编程错误,太。

它不需要O(n)来衡量一个数组的大小,所以我只需要完全消除size插槽。如果您通常需要board的值,则可以轻松制作简单的包装功能。

在有机会你想要一个更普遍的解决方案,肯尼蒂尔顿的Cells项目“我的一些槽是由一些我的其他插槽的决定”,但它并不显得非常活跃,这些天。

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

+1

单元common-lisp.net页面已过时。开发继续https://github.com/kennytilton/cells,Cell即将在quicklisp中提供。 – Ramarren 2010-12-04 18:55:11