/// <summary>
 /// Defines a default-constructible <see cref="IMacro"/> in the given <see cref="IPreProcessor"/>.
 /// </summary>
 /// <typeparam name="TMacro">The type of the <see cref="IMacro"/> to define.</typeparam>
 /// <param name="preProcessor">The <see cref="IPreProcessor"/> to define the macro in.</param>
 /// <returns>The <see cref="IPreProcessor"/> to be able to chain calls.</returns>
 public static IPreProcessor Define <TMacro>(this IPreProcessor preProcessor)
     where TMacro : IMacro, new() => preProcessor.Define(_ => new TMacro());
 /// <summary>
 /// Defines the __COUNTER__ macro extension.
 /// </summary>
 /// <param name="preProcessor">The <see cref="IPreProcessor"/> to define the macro in.</param>
 /// <returns>The <see cref="IPreProcessor"/> to be able to chain calls.</returns>
 public static IPreProcessor DefineCounter(this IPreProcessor preProcessor) =>
 preProcessor.Define <CounterMacro>();
 /// <summary>
 /// Defines a new <see cref="IMacro"/> with a factory function in the given <see cref="IPreProcessor"/>.
 /// </summary>
 /// <param name="preProcessor">The <see cref="IPreProcessor"/> to define the macro in.</param>
 /// <param name="makeMacro">The factory function that constructs the <see cref="IMacro"/>.</param>
 /// <returns>The <see cref="IPreProcessor"/> to be able to chain calls.</returns>
 public static IPreProcessor Define(this IPreProcessor preProcessor, Func <IPreProcessor, IMacro> makeMacro)
 {
     preProcessor.Define(makeMacro(preProcessor));
     return(preProcessor);
 }