- SCM func = scm_car (expr);
- Input *loc = unsmob_input (scm_cadr (expr));
- SCM args = scm_cddr (expr);
- SCM sig = scm_object_property (func, ly_symbol2scm ("music-function-signature"));
-
- SCM type_check_proc = ly_lily_module_constant ("type-check-list");
+ SCM unwrap = SCM_UNDEFINED;
+ if (scm_is_true (scm_call_1 (pred, arg)))
+ return scm_cons (arg, args);
+ unwrap = try_unpack_lyrics (pred, arg);
+ if (!SCM_UNBNDP (unwrap))
+ return scm_cons (unwrap, args);
+ if (SCM_UNBNDP (fallback)) {
+ args = scm_cons (SCM_BOOL_F, args);
+ fallback = SCM_BOOL_F;
+ } else {
+ args = scm_cons (loc_on_music (loc, fallback), args);
+ fallback = SCM_CDR (scm_last_pair (args));
+ }
+ scm_set_cdr_x (scm_last_pair (args), SCM_EOL);
+ MAKE_SYNTAX ("argument-error", loc, scm_length (args), pred, arg);
+ scm_set_cdr_x (scm_last_pair (args), fallback);
+ return args;
+}