diff --git a/libguile/values.c b/libguile/values.c index 8bbfc7164..7dd9ecc9d 100644 --- a/libguile/values.c +++ b/libguile/values.c @@ -35,6 +35,24 @@ SCM scm_values_vtable; +/* OBJ must be a values object containing exactly two values. + scm_i_extract_values_2 puts those two values into *p1 and *p2. */ +void +scm_i_extract_values_2 (SCM obj, SCM *p1, SCM *p2) +{ + SCM values; + + SCM_ASSERT_TYPE (SCM_VALUESP (obj), obj, SCM_ARG1, + "scm_i_extract_values_2", "values"); + values = scm_struct_ref (obj, SCM_INUM0); + if (!scm_is_null_or_nil (SCM_CDDR (values))) + scm_wrong_type_arg_msg + ("scm_i_extract_values_2", SCM_ARG1, obj, + "a values object containing exactly two values"); + *p1 = SCM_CAR (values); + *p2 = SCM_CADR (values); +} + static SCM print_values (SCM obj, SCM pwps) { diff --git a/libguile/values.h b/libguile/values.h index 0750aecdc..65ad8a119 100644 --- a/libguile/values.h +++ b/libguile/values.h @@ -30,6 +30,8 @@ SCM_API SCM scm_values_vtable; #define SCM_VALUESP(x) (SCM_STRUCTP (x)\ && scm_is_eq (scm_struct_vtable (x), scm_values_vtable)) +SCM_INTERNAL void scm_i_extract_values_2 (SCM obj, SCM *p1, SCM *p2); + SCM_API SCM scm_values (SCM args); SCM_INTERNAL void scm_init_values (void);