A primitive procedure is a Scheme-callable procedure that is implemented in C. Primitive procedures are created in MzScheme with the function scheme_make_prim_w_arity, which takes a C function pointer, the name of the primitive, and information about the number of Scheme arguments that it takes; it returns a Scheme procedure value.
The C function implementing the procedure must take two arguments: an
integer that specifies the number of arguments passed to the
procedure, and an array of Scheme_Object * arguments. The
number of arguments passed to the function will be checked using the
arity information. (The arity information provided to
scheme_make_prim_w_arity is also used for the Scheme
arity procedure.) The procedure implementation is not allowed
to mutate the input array of arguments, although it may mutate the
arguments themselves when appropriate (e.g., a fill in a vector
The function scheme_make_prim_closure_w_arity is similar to scheme_make_prim_w_arity, but it takes an additional count and Scheme_Object array that is copied into the created procedure; the procedure is passed back to the C function when the closure is invoked. In this way, closure-like data from the C world can be associated with the primitive procedure.
To work well with MzScheme threads, a C function that performs substantial or unbounded work should occasionally call SCHEME_USE_FUEL; see section 8.2 for details.
typedef Scheme_Object *(Scheme_Prim)(int argc, Scheme_Object **argv);
mina should be the minimum number of arguments that
must be supplied to the procedure. The value
maxa should be the
maximum number of arguments that can be supplied to the procedure, or
-1 if the procedure can take arbitrarily many arguments. The
maxa values are used for automatically checking
the argument count before the primitive is invoked, and also for the
arity procedure. The
name argument is used to
report application arity errors at run-time.
scheme_make_prim_w_arity, but if
non-zero, the compiler assumes that an application of the procedure
to constant values can be folded to a constant. For example,
string-length are folding primitives, but
cons are not.
typedef Scheme_Object *(Scheme_Prim_Closure_Proc)(int argc, Scheme_Object **argv, Scheme_Object *prim);
The macro SCHEME_PRIM_CLOSURE_ELS takes a primitive-closure
object and returns an array with the same length and content
vals. (3m: see section 3.1 for a caution
typedef Scheme_Object *(Scheme_Closed_Prim)(void *data, int argc, Scheme_Object **argv);
Creates a closed primitive procedure value without arity information. This function is provided for backward compatibility only.