方案提供了bytevector
类型,可用于对字节和字节数组进行低级操作(请参见r6rs和chez手册)。但是,它似乎没有提供一种方法来检索基础pointer到正在存储的字节数组,并且我需要将该指针传递给外部C函数以从字节向量填充或读取数据。
为了更精确地了解上下文,我正在尝试编写一些代码来对Idris2中的字节进行低级处理,该代码使用Scheme作为后端,但是我是Scheme的新手,所以我肯定会忽略一些明显的东西:从字节向量中提取此指针的首选方法?
将字节向量的地址返回为整数的操作将非常危险,因为垃圾回收器随后可能会将字节向量移动并将其他对象放置在该位置。将陈旧的地址传递给C代码可能会导致内存损坏。]>
Chez Scheme的foreign-procedure
的文档说,声明为foreign-procedure
的参数接受字节向量,并将其内容的地址传递给外部函数。这是安全的,因为FFI和GC协作以确保在获取地址和调用外部函数之间不会移动对象-但请参阅有关将指针保留在外部数据结构中的警告。另请参见u8*
,这会临时阻止GC移动或回收对象。
在球拍中,lock-object
和lock-object
外部类型的工作方式相似。还有_bytes
操作,将类似指针的对象与偏移量结合在一起。例如,如果_bytes
是一个字节字符串,那么即使GC移动了_pointer
,_pointer
也会可靠地转换为ptr-add
的第二个字节的地址。我不知道Chez是否具有类似功能。