我正在编写一个 Lisp 程序,并试图对类型有点认真。我想有性能改进,但我对使用类型注释来记录和安全更感兴趣。问题是nil
。到目前为止,我遇到了两个问题。
展品 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.
这里的最佳做法是什么?到目前为止,我唯一有远见的想法是使用空对象模式并拥有(defclass nil-quux-class (quux-class) ...)
and (defclass nil-foo-component (foo-component) ...)
,但这似乎充其量是 hacky。我不知道为什么,但确实如此。坦率地说,我不习惯在 CLOS 中设计模式变通方法 :)