少しハックですが、スペシャライザーでこれを行うことができますeql
。
(defmethod foo ((first (eql :simplex)) (thing vector))
<method body here>)
次に、それを次のいずれかとして呼び出す必要があります
(foo :step #(0 1 0 1))
また
(apply #'foo '(:step #(0 1 0 1)))
したがって、あなたの状況では、次のようなことをします
(defmethod dimension ((type (eql :simplex)) (thing vector))
;; calculate dimension of a SIMPLEX here
)
(defmethod dimension ((type (eql :step)) (thing vector))
;; calculate dimension of a STEP here
)
についても同じですboundary
。
処理しているものが本当に異なる構造であることを意図している場合は、生のリストを使用する代わりにstruct
s またはes を定義することを検討してください。class
その時点で、適切な型でメソッドを定義するだけで簡単にできます。これにより、このアプローチの面倒な呼び出し要件を回避できます。