anchor.diff:      unquote | path | uris | tokens | map() | list() |
       fun((atom(), term(), [{atom(), term()}]) -> 
               ok | {ok, term()} | {ok, term(), term()} |
  -            {opts, [{atom(), term()}]} | error | {error, term()}).
  -
  --type parse_opt() ::
  -    opt() | {list|slist|ulist, opt()} | 
  -    {update, map|list, MapOrList::atom(), Key::atom(), opt()}.
  -
  --type parse_spec() :: #{ atom() => parse_opt()}.
  +            {new_ok, [{atom(), term()}]} | error | {error, term()}).
  +
  +-type syntax_opt() ::
  +    syntax_subopt() | {list|slist|ulist, syntax_subopt()} | 
  +    {update, map|list, MapOrList::atom(), Key::atom(), syntax_subopt()}.
  +
  +-type syntax() :: #{ atom() => syntax_opt()}.
  +
  +-type parse_opts() ::
  +    #{
  +        return => map|list,     % Default is list
  +        context => term()       % Returned in errors
  +    }.
   
   
   
  
positive.code:     {ok, [{field11, <<"b">>}], []} = parse_config([{field11, b}], Spec),
  
      {error, {invalid_key, field12}} = parse_config([{field12, a}], Spec),
      {error, {invalid_atom, 1}} = parse_config([{field12, [{field12_a, 1}]}], Spec),
      % Field 12c is ignored
      {ok, [{field12, [{field12_a, ok},{field12_b, 1}]}],[]} = Sub1 = 
          parse_config(
  
negative.code:     end;
  
  do_parse_config({enum, List}, Val) ->
      Atom = to_existing_atom(Val),
      case lists:member(Atom, List) of
          true -> {ok, Atom};
          false -> error
  