2010-12-04 57 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