+ if (is_unpure_pure_container (unpure))
+ {
+ SCM pure = unpure_pure_container_pure_part (unpure);
+
+ if (is_simple_closure (pure))
+ {
+ SCM expr = simple_closure_expression (pure);
+ 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 (is_simple_closure (unpure))
+ {
+ SCM expr = simple_closure_expression (unpure);
+ return evaluate_with_simple_closure (scm_car (args), expr, true, start, end);
+ }
+
+ if (!ly_is_procedure (unpure))
+ return unpure;