Do you just store the function call or do you also store the parameters
themselves? If so, why not store a closure instead?
proc doubleIt(x: int): int = x*2
let someInt = expensiveComputation()
proc myClosure(): int = myProc(someInt)
Run
Now you can execute `myClosure` wherever you want and it'll execute `myProc`
with the result from `expensiveComputation`.
You can also store this closure in an object if that's nicer for you:
type Store[T] = object
clos: proc(): T {.closure.}
let store = Store(clos: myClosure)
store.clos()
Run
However, this means that not all stores are interchangeable. You can't store a
closure that returns a string in a Store has the type `Store[int]`.
In those cases you _maybe_ can store the pointer, like so:
type Store = object
command: pointer
let s = Store(command: proc(): int = 5)
Run
Now you can store multiple Stores in a Seq or whatever you need. This comes
with 2 limitations:
* It is impossible to store closures, so you need to have the parameters
inside of `Store` in one way or another
* This absolutely **requires** you to know which type `command` will return
when you want to execute the proc, because that needs to look like so:
let s = Store(command: proc(): int = 5)
echo cast[proc(): int {.nimcall.}](s.command)()
Run
There are other solutions as well depending on your need, but those tend to
dive into metaprogramming, so macros and templates.