+ if (Unpure_pure_container *upc = unsmob<Unpure_pure_container> (unpure))
+ {
+ SCM pure = upc->pure_part ();
+
+ if (Simple_closure *sc = unsmob<Simple_closure> (pure))
+ {
+ SCM expr = sc->expression ();
+ return evaluate_with_simple_closure (scm_car (args), expr, true, start, end);
+ }
+
+ if (ly_is_procedure (pure))
+ return scm_apply_0 (pure,
+ scm_append (scm_list_2 (scm_list_3 (scm_car (args),
+ scm_from_int (start),
+ scm_from_int (end)),
+ scm_cdr (args))));
+
+ return pure;
+ }
+
+ if (Simple_closure *sc = unsmob<Simple_closure> (unpure))
+ {
+ SCM expr = sc->expression ();
+ return evaluate_with_simple_closure (scm_car (args), expr, true, start, end);
+ }
+
+ if (!ly_is_procedure (unpure))
+ return unpure;