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)
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()
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)
Now you can store multiple Stores in a Seq or whatever you need. This comes with 2 limitations:
let s = Store(command: proc(): int = 5)
echo cast[proc(): int {.nimcall.}](s.command)()
There are other solutions as well depending on your need, but those tend to dive into metaprogramming, so macros and templates.