私はジェネリック関数を使い始めたばかりで、これが可能かどうか疑問に思っています (私は本当にそう願っています!)。
長さの異なるベクトルを処理するための 3 つのパッケージを作成しました: vector2、vector3、およびvector4。
各パッケージには、その長さのベクトルを処理する関数があります。
vector2:normalize - for normalizing *vector2s*
vector3:normalize - for normalizing *vector3s*
etc.
私のベクトルは型付き配列です(ゲームを書くための速度とメモリの使用のため)ので、vector3は次のとおりです。
(make-array 3 :element-type `single-float).
現在、任意のベクター型を処理するための汎用関数を含む、vectorsというパッケージを作成しています。
したがって、vector:normalize をvector3に渡すと、 vector3などが返されます。
私はこれを試しました:
(defmethod v+1 ((vec-a #.(class-of (make-array 3
:element-type
`single-float)))
(vec-b #.(class-of (make-array 3
:element-type
`single-float))))
(v3:v+1 vec-a vec-b))
(defmethod v+1 ((vec-a #.(class-of (make-array 4
:element-type
`single-float)))
(vec-b #.(class-of (make-array 4
:element-type
`single-float))))
(v4:v+1 vec-a vec-b))
...質問 6083238で見たものに基づいていますが、明らかに、単純な単一浮動小数点配列にのみ特化しています。
V> (class-of (make-array 4 :element-type `single-float))
#<BUILT-IN-CLASS SB-KERNEL::SIMPLE-ARRAY-SINGLE-FLOAT>
高速であり、メモリを大量に消費しない必要があることを考えると、これを行うための最良の方法は何でしょうか?
事前に乾杯!