Getting back to this; sorry about the delay.
Thanks for taking the time to write the detailed code examples. vector-shrink! and string-shrink! are also useful.
I've explored the FFI some more. There are lots of C APIs that return a vector of some datatype that would be useful to bring over to Scheme. All of the following are useful:
- collect N-bit integers into a buffer in C, possibly truncate, turn into a Scheme homogeneous numeric vector
- collect N-bit integers into a buffer in C, possibly truncate, turn into a generic Scheme vector (i.e. the elements are converted from C integers into Scheme fixnums, some might become bignums instead)
- collect char* string into a buffer in C, possibly truncate, turn into a Scheme string
- collect WCHAR string into a buffer in C, possibly truncate, turn into a Scheme string
When collecting C integers to be turned into fixnums later, would it make sense to pre-allocate a Scheme vector with space in its body for (* capacity (max size-of-that-c-integer-type size-of-a-scheme-value)) bytes? Then fill the buffer and do an in-place conversion from C integers to fixnums. If this works, we wouldn't have to allocate a separate vector for the fixnums.