Hello
apply is quite a handy simple mechanism for destructuring lists, but: if the list doesn't match the function prototype, an exception is thrown. Sometimes I don't want to get an exception but instead try to apply another function (more generally: to back-track).
So I'm looking for an alternative apply function which takes an alternative continuation as a third argument (instead of the implicit consing mechanism offered by standard apply when giving it multiple arguments):
(cond-apply fn1 lis (lambda () (cond-apply fn2 lis (lambda () (error "no match:" lis)))))
or
(or (cond-apply fn1 lis) (cond-apply fn2 lis) (error "no match:" lis))
call-with-exception-* don't do any good since it's relatively slow and, worse, would leave the handler in place while the called function is running.
I'm remembering a lowlevel function to get the arity of a function (returning a positive fixnum for a fixed number of arguments, and a negative fixnum if the function is taking a rest argument). Strangely, I cannot find it again now. What is it called? (Or did I see it in Chicken, not Gambit?) If that function is efficient, I could write cond-apply in a fairly efficient way.
Thanks Christian.