Calling Lisp functions from C is sometimes possible, but is extremely
hackish and poorly supported as of SBCL 0.7.5. See funcall0
... funcall3
in the runtime system. The arguments must be
valid SBCL object descriptors (so that e.g. fixnums must be
left-shifted by 2.) As of SBCL 0.7.5, the format of object descriptors
is documented only by the source code and, in parts, by the old CMUCL
INTERNALS documentation.
Note that the garbage collector moves objects, and won't be able to fix up any references in C variables. There are three mechanisms for coping with this:
sb-ext:purify
moves all live Lisp
data into static or read-only areas such that it will never be moved
(or freed) again in the life of the Lisp session
sb-sys:with-pinned-objects
is a macro which arranges for some
set of objects to be pinned in memory for the dynamic extent of its
body forms. On ports which use the generational garbage collector (as
of SBCL 0.8.3, only the x86) this has a page granularity - i.e. the
entire 4k page or pages containing the objects will be locked down. On
other ports it is implemented by turning off GC for the duration (so
could be said to have a whole-world granularity).
without-gcing
macro.