Edit : use list __@()__ as parameters

body common control
{
      bundlesequence => {
                          "test_vars",
                          test("$(test_vars.params)"),
                        };
}

bundle common test_vars
{

  vars:

   # declare
   "conflist"
     slist  => { "show", "action" };
   "paramlist"
     slist  => maplist("$(this.bundle).$(this)", "conflist");
   "params"
     string => join(",", "paramlist");

   # define
   "$(conflist)[version]"
     string => "$(conflist)_0.1";
   "show[other]"
     string => "other_value";
}

bundle agent test(params)
{

  vars:

   "str"
     string => "$(params)";
   "paramlist"
     slist  => splitstring("$(str)",",", "10");
   "bundle[$(paramlist)]"
     string => lastnode("$(paramlist)", "\.");

  services:

    "function_$(bundle[$(paramlist)])"
      service_policy => "start",
      service_method => bundle_handler("$(paramlist)");
}
body service_method bundle_handler(s)
{
    service_bundle            => $(this.promiser)("$(s)");
}

bundle agent function_show(a)
{

  vars:

    "index"
      slist => getindices("$(a)");

  reports:

    cfengine_3::
      "$(this.bundle) :: $(index) = $($(a)[$(index)])";
}

bundle agent function_action(a)
{

  reports:

    cfengine_3::
      "$(this.bundle) :: version = $($(a)[version])";
}

In this example, the bundle test_vars declare and define test parameters and test bundle use services promise type to call function bundle with the function specific parameters

# cf-agent -f ./test_dynparam.cf
R: function_show :: other = other_value
R: function_show :: version = show_0.1
R: function_action :: version = action_0.1