Как определить структуры в Лиспе, используя параметры в определении - PullRequest
4 голосов
/ 04 декабря 2010

Я хочу написать такой код на Лиспе, как этот

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

, чтобы определить структуру, представляющую игровую доску.

Я хочу иметь возможность создавать новую доску сmake-board, которая будет создавать матрицу на лету с заданным размером (размер x размер), так что мне не придется вызывать make-board из другой функции, которая создает матрицу.

Однако, когдаЯ загружаю этот код в интерпретатор clisp и пытаюсь создать новую доску (с make-board), я получаю сообщение об ошибке, сообщающее, что «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))) )

Действительно, мне не нравится, когда доступны как make-board, так и create-boardпотому что это может привести к ошибкам программирования.

Ответы [ 2 ]

2 голосов
/ 04 декабря 2010

Вы можете использовать конструктор Боа:

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

Документация CLHS для defstruct и Лямбда-списки BOA .

1 голос
/ 04 декабря 2010

На самом деле, мне не нравится, когда доступны как make-board, так и create-board, потому что это может привести к ошибкам программирования.

Это справедливо, но тогданаличие size и matrix в обоих случаях также может привести к ошибкам программирования.

Для измерения размера массива не требуется O (n), поэтому я просто исключил бы size слот в целом.Если вам обычно требуется это значение для board, легко создать простую функцию-обертку.

Если вы хотите более общее решение, «некоторые из моих слотов определяются другими моими слотами»", Проект Кенни Тилтона Cells , хотя в наши дни он кажется не слишком активным.

Наконец, я бы использовал defclass вместо defstruct, если у вас нетпричина не.

...