anchor.diff:  
     applyIfFunction = f: arg@{ config, options, lib }: if isFunction f then
       let
  +      # Module arguments are resolved in a strict manner when attribute set
  +      # deconstruction is used.  As the arguments are now defined with the
  +      # config.__interanl.args option, the strictness used on the attribute
  +      # set argument would cause an infinite loop, if the result of the
  +      # option is given as argument.
  +      #
  +      # To work-around the strictness issue on the deconstruction of the
  +      # attributes set argument, we create a new attribute set which is
  +      # constructed to satisfy the expected set of attributes.  Thus calling
  +      # a module will resolve strictly the attributes used as argument but
  +      # not their values.  The values are forwarding the result of the
  +      # evaluation of the option.
         requiredArgs = builtins.attrNames (builtins.functionArgs f);
         extraArgs = builtins.listToAttrs (map (name: {
           inherit name;
  
positive.code:     in f (extraArgs // arg)
    else
      f;
  
    /* Merge a list of modules.  This will recurse over the option
       declarations in all modules, combining them into a single set.
  
negative.code:     let
        toClosureList = file: parentKey: imap (n: x:
          if isAttrs x || isFunction x then
            unifyModuleSyntax file "${parentKey}:anon-${toString n}" (unpackSubmodule applyIfFunction x args)
          else
            unifyModuleSyntax (toString x) (toString x) (applyIfFunction (import x) args));
      in
  