CLOS: Как сделать так, чтобы слот имел принудительный тип вектора символов?

Я пытаюсь создать класс, который может хранить вектор символов в слоте в SBCL. Я не могу понять, как его настроить.

Мое лучшее предположение до сих пор было

(defclass Individual ()
  ((discrete-decisions :type (vector symbol))))

Это возвращает следующую ошибку:

keyword argument not a symbol:
(DISCRETE-DECISIONS :TYPE (VECTOR SYMBOL)).
   [Condition of type SB-INT:SIMPLE-PROGRAM-ERROR]

Некоторые эксперименты показали, что изменение типа на просто symbol возвращает ту же ошибку. Я думал, что symbol допустимый тип в Common Lisp... я ошибаюсь?

Как я могу заставить это работать?

[РЕДАКТИРОВАТЬ]

Вышеупомянутая проблема, с которой я столкнулся, заключалась в запуске SBCL 1.0.58 в сборке Slime от 22 сентября 2012 г. под Emacs 24.2. Когда я запускаю SBCL 1.0.58 из командной строки, проблем нет. Это не похоже на проблему SBCL...


person sadakatsu    schedule 23.09.2012    source источник
comment
Кстати, в настройках безопасности по умолчанию SBCL не будет проверять типы слотов   -  person Rainer Joswig    schedule 24.09.2012
comment
Я использую SBCL 1.0.58 в Windows 7. Может ли это быть ошибкой?   -  person sadakatsu    schedule 24.09.2012
comment
может быть, вам следует обратиться к списку рассылки sbcl   -  person Rainer Joswig    schedule 24.09.2012
comment
В спецификации говорится, что эффект хранения значений другого типа в слот не определен. Таким образом, ожидать проверки типа не "переносимо". В качестве альтернативы можно оставить тип неуказанным и проверить себя с помощью check-type.   -  person Miron Brezuleanu    schedule 24.09.2012


Ответы (2)


Вы можете рассмотреть возможность определения метода :after для средства доступа/записи слота. Кроме того, максимальная степень контроля может быть реализована путем определения собственного метакласса и настройки класса использования слота.

person Dan Lentz    schedule 17.05.2013
comment
Или используйте :before. Например, для ячейки класса со слотом генома мы можем убедиться, что тип объекта в слоте генома соответствует указанному в определении класса: (defmethod (setf cell-genome) :before (new-value (object cell)) (let ((sd-genome (slot-definition-for-cell-genome))) (assert (typep new-value (sb-mop:slot-definition-type sd-genome))))) - person dat; 23.06.2016

Я знаю, что я, вероятно, опоздал, но вы должны обернуть свое объявление classe оптимизацией для безопасности. Например:

(locally (declare (optimize safety))
    (defclass test-class ()
      ((some-slot :type real :initarg :some-slot :accessor :test-some-slot))))
person YuriAlbuquerque    schedule 03.05.2013