我剛開始使用泛型函數,想知道這是否可能(我真的希望如此!)。Common Lisp:專用於數組長度的泛型函數
我已用於處理不同長度的向量3包:vector2,的Vector3和的Vector4。
每個包具有處理該長度的矢量的功能:
vector2:normalize - for normalizing *vector2s*
vector3:normalize - for normalizing *vector3s*
etc.
我的向量類型數組(對速度和內存使用,因爲這是用於寫入遊戲)這樣一個的Vector3是:
(make-array 3 :element-type `single-float).
現在我正在編寫一個名爲的矢量包,它將包含處理任何矢量類型的泛型函數。
所以傳遞載體:一個正常化的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))
...基於我在question 6083238看到,但很明顯,只有專門簡單,單精度浮點數數組作爲:
V> (class-of (make-array 4 :element-type `single-float))
#<BUILT-IN-CLASS SB-KERNEL::SIMPLE-ARRAY-SINGLE-FLOAT>
會是什麼考慮到它需要快速而不是內存佔用,這是做這件事的最好方法嗎?
乾杯提前!
絕對鑽石!很好的解釋,鏈接和示例代碼。像這樣的答案是爲什麼stackoverflow是美好的。今晚我會實施這個! – Baggers 2012-08-17 10:04:51
很高興聽到這一點。你成功實施了這個嗎? – 2012-08-18 06:17:17
我當然做到了!我還沒有回去讓宏產生defmethods,但它的好處是能夠在repl中敲出想法而不用擔心向量長度。希望很快我會有一些很好的3D演示來展示,但即使在這個階段,也能夠玩弄代碼並看到正在運行的opengl演示變化是可愛的(對於這種交互式編譯來說,我相當陌生!) 。再次感謝 – Baggers 2012-08-20 15:38:58