As you have observed, `provide` is a compile time construct and can't be used at runtime (where the list my-funs lives).
Since `provide` lives at compile time, the only solution is to use macros.
Define a macro, say, define-binary-function that can used as:
(define-binary-function *)
(define-binary-function +)
Given that, one can always define a define-binary-functions, that can be used as:
(define-binary-functions + *)
and expands into multiple instances of define-binary-function.
Now, what must define-binary-function do?
It must:
1) expands to a provide of the function name
2) add the function name to a list that holds names (symbols) of all binary functions.
You can accomplish 2) by having a global:
(define all-binary-functions '())
and let define-binary-function expand to both a provide and to
(set! all-binary-functions (cons 'id all-binary-functions))
where id is from the use (define-binary-function id).
In the definition of handle, you will then need to make use of all-binary-functions.
If you are familiar with macros, I hope the overview will give you a good start.
If not, the overview skipped a lot of details, so you will need to look at an
introduction to macros first.
If you are interested, I'll be happy to send you a work-in-progress macro tutorial
I am working. I am always looking for feedback to make it better.
/Jens Axel