anchor.diff:        }
       ) (builtins.attrNames defs));
   
  -  mergeDefaultOption = name: list:
  +  mergeDefaultOption = list:
       if list != [] && tail list == [] then head list
       else if all __isFunction list then x: mergeDefaultOption (map (f: f x) list)
       else if all __isList list then concatLists list
  
positive.code:     (x: if builtins ? isString then builtins.isString x else x + "")
      concatStrings;
  
    mergeOneOption = name: list:
      if list == [] then abort "This case should never happens."
      else if tail list != [] then throw "Multiple definitions. Only one is allowed for this option."
      else head list;
  
negative.code:   # function of each option to get the result.
    mergeOptionSets = noOption: newMergeOptionSets; # ignore argument
    newMergeOptionSets =
      let
        # handle merge functions with & without name argument.
        mergeWrapper = merge: name: values:
          let
            newMerge = merge values;
            oldMerge = builtins.trace
              "obsolete: Merge function of ${name} option has name argument."
              (merge name values);
          in
            if __isFunction newMerge then oldMerge else newMerge;
      in
      handleOptionSets {
        export = opt: values:
          opt.apply (
            if values == [] then
              if opt ? default then opt.default
              else throw "Not defined."
            else mergeWrapper opt.merge opt.name values
          );
        notHandle = throw "Used without option declaration.";
      };
  