  function(uri_params_serialize )
    function(uri_params_serialize_value)

      set(path ${path})
      list_pop_front(path)
      ans(first)


      set(res "${first}")
      foreach(part ${path})
        uri_encode("${part}")
        ans(part)
        set(res "${res}[${part}]")
      endforeach()

      uri_encode("${node}")
      ans(node)
      set(res "${res}=${node}")
      map_append(${context} assignments ${res})
    endfunction()
   map()
    kv(value uri_params_serialize_value)
   end()
  ans(callbacks)
  function_import_table(${callbacks} uri_params_serialize_callback)

  # function definition
  function(uri_params_serialize obj )
    obj("${obj}")
    ans(obj)  
    map_new()
    ans(context)
    dfs_callback(uri_params_serialize_callback ${obj})
    map_tryget(${context} assignments)
    ans(assignments)
    string_combine("&" ${assignments})
    return_ans()  
  endfunction()
  #delegate
  uri_params_serialize(${ARGN})
  return_ans()
  endfunction()