Here I collect thoughts about introspection. Introspection can be at compile-time as well as runtime, and can have quite a different role. In edlib/python I use the documentation string of class methods to indicate what 'key' they respond to. I cannot easily do that in C, but could if I have compile-time introspection. I could do it with a sed script that extracts an include file ... The language would need to allow for extra stuff to be parsed into an AST, then the introspection code would run over that AST before it was further analysed. This a bit like gcc pluggins, but is writting if the language being compiled, and compiled like any other code. This would be part of a larger feature that any code could run at compile time instead of later. Constant-folding is already a common practice and is an example of this. I would need a simple and stable AST ADT to be manipulated. Most uses would be relatively simple, like collection functions into an array, or pre-parsing some internal data structure, possibly sorting it. It could be as simple as allowing strings in lots of places, and expecting the introspection to parse them - along with various object names - and do stuff. Separately there is runtime introspection. This would be needed to handle anything not known at compile time. Mostly this is probably underspecified type. An 'sprintf' type function to be introspected and transformed at compile time providing the types of everything could be determined. And if the type isn't known... recording introspection info is probably not easier that recording the appropriate dispatch function. Then there is link-time information. Compile-time introspection needs to all be run at compile-time. If I load a foreign module at run time (or link time), it cannot ask questions that weren't already asked. Maybe a "standard" compile-time introspector could encode any info needed for link-time or runtime introspectors. Introspection could be used for: - preparsing data structures e.g. sorting, adding links, .. - annotating for run-time e.g. storing table of function, with names providing serialization, de-serialization - providing default values for missing args - transforming n-ary args to arrays - adding appropriate dispatch info when passing args to a function that expects objects - adding coverage tracking - adding performance tracking