anchor.diff:        (concatStringsSep ", " (map attrNameToConfigList (attrNames attrs))) +
         " ]";
   
  -  valueToConfig = name: value: 
  +  valueToConfig = nvpair: let name = nvpair.name; value = nvpair.value; in
       if (isAttrs value) && ((!(value ? __type)) || value.__type == "repeated")
         then ''
           ${name} {
  
positive.code:       if isFloat expr then expr.value else
        if isList expr then listToConfig expr else
        if isHash expr then hashToConfig expr.value else
        if isRepeatedAttrs expr then repeatedAttrsToConfig expr.names expr.values
        else attrsToConfig expr;
  
    mergeConfigs = configs:
  
negative.code:           and names are strings that can be repeated. name-value pairs with no
            repeats are represented by attr sets. name-value pairs with repeats
            are represented by an attrset with attr "__type" = "repeated" and
            attr "values" as a list of {name; value;} attrsets.
            bools, strings, ints, and arrays are mapped directly. Floats are
            represented as an attrset with attr "__type" = "float" and attr value
            set to the string representation of the float. Hashes are represented
  