Common Lisp: Cffi: 设置一个外部类型的Setf

4

最近我一直在尝试使用非常棒的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的setter,但我希望有一种内置的方法来完成这个任务,只是我没找到。我已经阅读了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)))

这样就不会分配额外的内存,而且值会直接设置。

好吧,这是我的小幻想,有人知道它是否能够实现吗?

1个回答

1

我已经阅读了CFFI源代码,似乎这不是通过内置机制支持的。那里有处理数组类型的代码,但它没有被公开或导出,因此显然不能使用。还有一个拟议的块内存接口,但尚未编写。

所以这次没戏了,但CFFI非常棒,所以我会用另一种方式来实现它。

p.s. 还有WAAF-CFFI值得研究,但我还没有具体信息。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接