Я пишу программу Lisp и стараюсь быть немного добросовестным в отношении типов. Я думаю, что есть улучшения производительности, но меня больше интересует использование аннотаций типа для документации и безопасности. Проблема nil
. До сих пор я столкнулся с двумя проблемами.Обращайтесь с номером типа wildcard
Приложение A:
>(defmethod foo ((bar bar-class) (quux quux-class))
...)
>(foo (make-instance 'bar-class) nil)
ERROR: No applicable method, etcetera etcetera, because nil is not of type quux-class
Приложение B:
(defmethod initialize-instance :after ((f foo) &rest args)
"Initialize the grid to be the right size, based on the height and width of the foo."
(declare (ignorable args))
(setf (slot-value f 'grid) (make-array (list (width f) (height f))
:element-type 'foo-component
:adjustable nil
:initial-element nil)))
style-warning:
NIL is not a FOO-COMPONENT.
Что лучшая практика здесь? До сих пор единственная проницательная идея, которую я имел, заключается в использовании null object pattern и имеет (defclass nil-quux-class (quux-class) ...)
и (defclass nil-foo-component (foo-component) ...)
, но это кажется в лучшем случае взломанным. Я не уверен почему, но он делает. Откровенно говоря, я не привык, чтобы проектировать patterny обходные в CLOS :)
Спасибо! A) Я не был в восторге от дублирования кода (дважды звоня по телефону), но, на мой взгляд, это имеет смысл. И по мере того, как программа растет, я, возможно, очень хочу обрабатывать 'nil' по-разному, что это позволит мне сделать. B) Да, мне нужна проверка ошибок. SBCL очень хорош в этом. – tsm
ОК. Btw Я добавил редактирование для вашего вызова для создания массива (фиксированные парсы и отступы); Наверное, это со временем появится ... –