What you're looking for (I think) is some sort of composite data structure - a way to group data together into a single entity. There are three main ways in Quest to accomplish that: objects, lists, and dictionaries. I'll give examples of all three for this specific case.
(In the examples that follow, though I'm speaking of passing values to a function, the general usage of these things to hold aggregate data can be applied even outside of function calls.)
Using Objects to Pass ValuesAn object can be passed as a parameter to a function, to allow all of its attributes to be available as once. If you have an object named "Params", and a function that looks like this:
<function name="ObjFunction" parameters="params">
msg("ObjFunction: arg1 = " + params.arg1)
msg("ObjFunction: arg2 = " + params.arg2)
</function>
then you can call the function (for example) like this:
Params.arg1 = "parameter 1"
Params.arg2 = 314
ObjFunction(Params)
Note that this uses a pre-existing object. You can also create objects on the fly, but it's more complicated and probably not worth the effort, given that you can achieve more or less the same effect with dictionaries below.
Using Lists to Pass ValuesA generic list in Quest (not a "string list", "object list", etc unless you want all values to be of that type) can be used to pass a set of values to a function, accessed by an index. If you have a function like this, which takes a list:
<function name="ListFunction" parameters="params">
msg("ListFunction: arg1 = " + params[0])
msg("ListFunction: arg2 = " + params[1])
</function>
then you can call it with something like:
player.plist = NewList()
list add (player.plist, "list parameter 1")
list add (player.plist, 628)
ListFunction(player.plist)
Note that you don't need to set it into an object attribute. I'm just doing that since you wished it to be so. You could use a local variable if desired. And you don't have to call the function in the same code block where you set up the attribute. (I hope that's clear.) You can set up the attribute in one place and then call the function using it from some other part of your code.
This works ok, but the indices are a bit opaque. What does "0" mean? How horrible is it to renumber everything if I need to get rid of one of the values later? The dictionary solves those two problems nicely.
Using Dictionaries to Pass ValuesFinally, you can use dictionaries to create aggregate structures. Assuming a function like this:
<function name="DictFunction" parameters="params">
msg("DictFunction: arg1 = " + params["arg1"])
msg("DictFunction: arg2 = " + params["arg2"])
</function>
you can call it with:
player.pdict = NewDictionary()
dictionary add (player.pdict, "arg1", "dictionary parameter 1")
dictionary add (player.pdict, "arg2", 666)
DictFunction(player.pdict)
Again, you can separate out the dictionary creation from its use in the function call - and you can overwrite the attribute as you wish.
In summary, I would generally go with a dictionary to hold aggregate values. The downside to dictionaries (everything has one in Quest, sadly) is that it's a pain to *update* a value in a dictionary - you have to first delete an existing value before adding a new one. In that way objects are easier to use.
It all comes down to what your use case is. If you could be more specific about how you will be doing things, then I could offer more targetted guidance.
I've attached a sample project which contains the above code (the script is in the game start script) if you wish to see it in the GUI view.