> Compiler extensions / module-range macros
I think Nim is almost there. One thing left is to implement pragma push for
templates/macros.
import myModuleThatChangesEverything
{.push myPragmaThatChangesEverything.}
# rest of the code
{.pop.} # is it needed?
> Type invariant inheritance
I would be really glad for type ct callbacks, that evaluate upon type use.
type MyMagicType = ref object of RootObj
macro `=onInherit`(t: typedesc[MyMagicType], n: untyped): untyped
{.compileTime.} =
# do smth with n
result = n
macro `=onUsedAsArgument`(t: typedesc[MyMagicType], n: untyped): untyped
{.compileTime.} =
# do smth with n
result = n
# Further usage
type MyInheritedType = ref object of MyMagicType
a: int
# This actually gets rewritten to:
# `=onInherit`(MyMagicType):
# type MyInheritedType = ref object of MyMagicType
# a: int
# Some routine:
proc someProcThatUsesMyType(a: int, v: MyMagicType) =
discard
# This actually gets rewritten to:
# `= onUsedAsArgument `(MyMagicType):
# proc someProcThatUsesMyType(a: int, v: MyMagicType) =
# discard
Further on the `onUsedAsArgument` can insert invariant calls to the proc. The
`onInherit` can implement some code for the inherited type, or register it in a
factory or whatever.