Как определить структуры в Lisp, используя параметры в определении

StackOverflow https://stackoverflow.com/questions/4354681

Вопрос

Я хочу написать какой-нибудь код lisp, как это

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

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

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

Однако, когда я загружаю этот код в интерпретатор CleisP и попробуйте сделать новую доску (с помощью 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))) )

Действительно, я не люблю иметь оба составной доски, так и создания доступа, потому что это может привести к ошибаниям программирования.

Это было полезно?

Решение

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

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

CLHS Документация для расправляться а также Списки боа лямбда.

Другие советы

Действительно, я не люблю иметь оба составной доски, так и создания доступа, потому что это может привести к ошибаниям программирования.

Там есть справедливый момент, но затем, имея size а также matrix Оба доступны также могут привести к программированию ошибок тоже.

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top