/* The bindings, which must have the format ((v1 i1) (v2 i2) ... (vn in)), are * transformed to the lists (vn .. v2 v1) and (i1 i2 ... in). If a duplicate * variable name is detected, an error is signalled. */ static void transform_bindings (const SCM bindings, const SCM expr, SCM *const names, SCM *const vars, SCM *const initptr) { SCM rnames = SCM_EOL; SCM rvars = SCM_EOL; SCM rinits = SCM_EOL; SCM binding_idx = bindings; for (; !scm_is_null (binding_idx); binding_idx = CDR (binding_idx)) { const SCM binding = CAR (binding_idx); const SCM CDR_binding = CDR (binding); const SCM name = CAR (binding); ASSERT_SYNTAX_2 (scm_is_false (scm_c_memq (name, rnames)), s_duplicate_binding, name, expr); rnames = scm_cons (name, rnames); rvars = scm_cons (scm_gensym (SCM_UNDEFINED), rvars); rinits = scm_cons (CAR (CDR_binding), rinits); } *names = scm_reverse_x (rnames, SCM_UNDEFINED); *vars = scm_reverse_x (rvars, SCM_UNDEFINED); *initptr = scm_reverse_x (rinits, SCM_UNDEFINED); }
static int applicablep (SCM actual, SCM formal) { /* We already know that the cpl is well formed. */ return scm_is_true (scm_c_memq (formal, CPL_OF (actual))); }