私は Lisp プログラムを書いていて、型について少し気をつけようとしています。パフォーマンスが向上したと思いますが、ドキュメントと安全のために型注釈を使用することにもっと興味があります。問題はnil
. これまでに2つの問題に遭遇しました。
展示物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 オブジェクト パターン(defclass nil-quux-class (quux-class) ...)
を使用してandを持つ(defclass nil-foo-component (foo-component) ...)
ことですが、それはせいぜいハッキーに思えます。理由はわかりませんが、そうです。率直に言って、私はCLOSでパターン化された回避策を設計することに慣れていません:)