私は最近素晴らしいcffiで遊んでいますが、組み込みメカニズムを使用して何かが可能かどうかを判断するのに問題があります。
ベクトルの外部配列を作成し、これが可能になるように外部型の変換を設定したいと思います。
> (defparameter a (foreign-alloc 'vec3 :count 10))
A
> (setf (mem-aref a 'vec3 4) (convert-to-foreign #(1.0 2.0 3.0) 'vec3))
#(1.0 2.0 3.0)
> (convert-from-foreign (mem-aref b 'vec3 4) 'vec3)
#(1.0 2.0 3.0
これまでのところ、外部vec3の作成と取得は許可されていますが、取得は許可されていない次のものがあります。
(defcstruct %vec3
(components :float :count 3))
(define-foreign-type vec3-type ()
()
(:actual-type %vec3)
(:simple-parser vec3))
(defmethod translate-from-foreign (value (type vec3-type))
(make-array
3
:element-type 'single-float
:initial-contents (list (mem-aref value :float 0)
(mem-aref value :float 1)
(mem-aref value :float 2))))
問題は、vec3のセッターとして機能する関数を簡単に設定できる一方で、これを行うための組み込みの方法があり、私には見えないことを望んでいることです。cffiマニュアルを読み、translate-to-foreignメソッドとexpand-to-foreign-dynを見てきましたが、を使用して基本的に次のようなものに展開する方法が見つかりませんでした。
(let ((tmp (mem-aref a '%vec3 4)))
(setf (mem-aref tmp :float 0) (aref lisp-value 0))
(setf (mem-aref tmp :float 1) (aref lisp-value 1))
(setf (mem-aref tmp :float 2) (aref lisp-value 2)))
余分なメモリが割り当てられず、値が直接設定されるようにします。
それは私の小さな空想です、それを機能させることができるかどうか誰かが知っていますか?