anchor.diff:      map() |                     % Allow for nested objects
       list() |                    % First matching option is used
       syntax_fun() |
  +    {syntax, syntax_opt()} |    % Nested syntax (i.e. {list, {syntax, Syntax}})
       '__defaults' |              % Defaults for this level
  -    '__mandatory'.              % Mandatory fields (only root level)
  +    '__mandatory'.              % Mandatory fields (full path for keys)
   
   -type syntax_fun() ::
       fun((Val::term()) -> syntax_fun_out()) |
  
positive.code:     case is_list(Val) of
          true -> {ok, Val};
          false -> error
      end;
  
  spec({List, Type}, Val) when List==list; List==slist; List==ulist ->
      case Val of
          [] ->
              {ok, []};
          [Head|_] when not is_integer(Head) ->
              do_parse_list(List, Val, Type, []);
          _ -> 
              do_parse_list(List, [Val], Type, [])
      end;
  
  spec(proc, Val) ->
  
negative.code:         _ -> error
      end;
  
  spec(_Type, _Val) ->
      unknown.
  
  
  %% @private
  do_parse_list(list, _SyntaxOp, _Key, [], _Parse, Acc) ->
      {ok, lists:reverse(Acc)};
  
  do_parse_list(slist, _SyntaxOp, _Key, [], _Parse, Acc) ->
      {ok, lists:sort(Acc)};
  
  do_parse_list(ulist, _SyntaxOp, _Key, [], _Parse, Acc) ->
      {ok, lists:usort(Acc)};
  
  do_parse_list(ListType, SyntaxOp, Key, [Term|Rest], Parse, Acc) ->
      case spec(SyntaxOp, Key, Term, Parse) of
          {ok, Val} ->
              do_parse_list(ListType, SyntaxOp, Key, Rest, Parse, [Val|Acc]);
          Other ->
              Other
      end;
  
  do_parse_list(_ListType, _Key, _Val, _Parse, _SyntaxOp, _Acc) ->
      error.
  
  %% @private
  