Как определить структуры в Lisp, используя параметры в определении
-
08-10-2019 - |
Вопрос
Я хочу написать какой-нибудь код 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
Если у вас нет причины не.