+
+LY_DEFINE (ly_pure_call, "ly:pure-call",
+ 4, 0, 1, (SCM data, SCM grob, SCM start, SCM end, SCM rest),
+ "Convert property @var{data} (unpure-pure container or procedure)"
+ " to value in a pure context defined by @var{grob},"
+ " @var{start}, @var{end}, and possibly @var{rest} arguments.")
+{
+ if (Unpure_pure_container *upc = unsmob<Unpure_pure_container> (data))
+ {
+ // Avoid gratuitous creation of an Unpure_pure_call
+ if (upc->is_unchanging ())
+ data = upc->unpure_part ();
+ else
+ {
+ data = upc->pure_part ();
+ if (ly_is_procedure (data))
+ return scm_apply_3 (data, grob, start, end, rest);
+ return data;
+ }
+ }
+ if (ly_is_procedure (data))
+ return scm_apply_1 (data, grob, rest);
+ return data;
+}
+
+LY_DEFINE (ly_unpure_call, "ly:unpure-call",
+ 2, 0, 1, (SCM data, SCM grob, SCM rest),
+ "Convert property @var{data} (unpure-pure container or procedure)"
+ " to value in an unpure context defined by @var{grob}"
+ " and possibly @var{rest} arguments.")
+{
+ if (Unpure_pure_container *upc = unsmob<Unpure_pure_container> (data))
+ data = upc->unpure_part ();
+ if (ly_is_procedure (data))
+ return scm_apply_1 (data, grob, rest);
+ return data;
+}