You could create functions that transform between Lisp and C types (such as :int <-> '(signed-byte 32)).
Yes, this is what my code does. It constructs a library (a hash table, internally) of optimized lisp
functions to do the copying, one for each LISP<-->CFFI type pair, plus a generic set at a higher safety
level where the Lisp type is just T. But doesn't inline or macroexpand the copying because I don't
think this buys much because most of the cycles are likely spent iterating, not funcallling.
There are a various approaches to take when passing arrays. What is important from my own
perspective, as a user, is to have them publicized and accessible, so I don't end up reinventing them.
Hence I put my solution on cliki's FFI page. Very likely, at some point cffi will have functionality
that renders it redundant.