summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libguile/fluids.c17
-rw-r--r--libguile/fluids.h2
2 files changed, 19 insertions, 0 deletions
diff --git a/libguile/fluids.c b/libguile/fluids.c
index 32a5ffd37..7be538f9d 100644
--- a/libguile/fluids.c
+++ b/libguile/fluids.c
@@ -233,6 +233,23 @@ scm_c_with_fluid (SCM fluid, SCM value, SCM (*cproc) (), void *cdata)
}
#undef FUNC_NAME
+static void
+swap_fluid (SCM data)
+{
+ SCM f = SCM_CAR (data);
+ SCM t = scm_fluid_ref (f);
+ scm_fluid_set_x (f, SCM_CDR (data));
+ SCM_SETCDR (data, t);
+}
+
+void
+scm_frame_fluid (SCM fluid, SCM value)
+{
+ SCM data = scm_cons (fluid, value);
+ scm_frame_rewind_with_scm (swap_fluid, data, SCM_F_WIND_EXPLICITLY);
+ scm_frame_unwind_with_scm (swap_fluid, data, SCM_F_WIND_EXPLICITLY);
+}
+
void
scm_init_fluids ()
{
diff --git a/libguile/fluids.h b/libguile/fluids.h
index 07dce8523..8a5150e83 100644
--- a/libguile/fluids.h
+++ b/libguile/fluids.h
@@ -76,6 +76,8 @@ SCM_API SCM scm_c_with_fluid (SCM fluid, SCM val,
SCM (*cproc)(void *), void *cdata);
SCM_API SCM scm_with_fluids (SCM fluids, SCM vals, SCM thunk);
+SCM_API void scm_frame_fluid (SCM fluid, SCM value);
+
SCM_API SCM scm_i_make_initial_fluids (void);
SCM_API void scm_i_copy_fluids (scm_root_state *);
SCM_API void scm_i_swap_fluids (SCM fluids, SCM vals);