My next experiment is to use tables with procs, which gives useful compiler warnings when our procs are not GC-safe. import tables # These three lines give GC-safe warnings when "gprocs[1] = ptest" runs. # var gprocs*: Table[int, proc (test: Test): bool] # gprocs = initTable[int, proc (test: Test): bool](initialSize = 16) # gprocs[1] = ptest # If we use "gcsafe" and "locks" pragmas, and remove the testSeq line # from ptest(), there aren't any GC-safe warnings. var gprocs: Table[int, proc (test: Test): bool{.gcsafe, locks: 0.}] gprocs = initTable[int, proc (test: Test): bool{.gcsafe, locks: 0.}](initialSize = 16) gprocs[1] = ptest echo "CALLING PTEST (GCSAFE): "; discard gprocs[1](testing123)
I get good compiler warnings when using tables, but as I'm doing this all within AST meta-programming, I'd like to keep things as simple as possible and keep using seq of tuples-of-procs. I am hoping the compiler warnings improve when using tuples-of-procs. Is there really no way to use meta-programming proc calls with non-GC-safe procs? I just need a way to make procs first-class citizens and pass them around easily, without the requirement that they're GC-safe.