Hello Guilers! Following our discussion on the unpleasant static initialization code (in the `bdw-gc-static-alloc' branch) for subrs because of the dichotomy between "simple subrs" (with few arguments) and "generic subrs" (with an arbitrary number of arguments), I investigated all this. Currently, "generic subrs" (or "gsubrs") are implemented using "compiled closures" (or "cclos"), as can be seen in `create_gsubr ()'. Compiled closures are essentially a wrapper (a cell) around a zero-argument subr that conveys information about the real number of required, optional, and rest arguments. Prior to the switch to double-cells as the storage unit for subrs, the 24 MSBs of the type tag of a subr were used to store the "subr table entry number" of that subr. Now that we no longer use a table, those 24 bits are unused. The attached patch creates a new type tag, `scm_tc7_gsubr', whereby the 24 MSBs are used to store gsubr arity information as returned by `SCM_GSUBR_MAKTYPE ()'. This makes cclos useless, which simplifies the code and reduces the overhead when creating and invoking such procedures. In theory all subrs could be encoded as gsubrs, but the interpreter would need to be able to handle them as efficiently as the specialize `scm_tc7_subr*', and fiddling with the interpreter may not be so useful these days. Objections to committing this? Thanks, Ludo'.