Understanding @ Placement Variations: array@[] vs array[]@ vs array@[]@ in BGT/NVGT Code

Hello everyone, I'm struggling with understanding the usage of the @ symbol in array-related code snippets and would appreciate your help in clarifying this.
First question: I've noticed in documentation tutorials that the @ symbol sometimes appears on both sides of , like:
array@
Other times it's written as:
array@
And occasionally like:
array@@
Here are some code examples I copied from BGT and NVGT documentation:
BGT code example (using array@):
interface sound_sources {
void make_sound();
}

class Person : sound_sources {
void make_sound() {
alert("Message", "Person is speaking");
}
}

class Animal : sound_sources {
void make_sound() {
alert("Message", "Animal is making sounds");
}
}

void main() {
Person p;
Animal a;
sound_sources@ hSound = {p, a};
for(uint i=0; i<hSound.length(); i++) {
hSound[i].make_sound();
}
}
NVGT code example (using array@@):
string anyjoin(any@@ args, const string &in delimiter) {
if(@args == null) return "";
string args_as_string;
for(uint i=0; i<args.length() && args[i] != null; i++) {
int64 arg_int;
double arg_double;
string arg_string;
vector arg_vector;

    if(args[i].retrieve(arg_string)) {
        args_as_string.insert_last(arg_string);
    } else if(args[i].retrieve(arg_vector)) {
        args_as_string.insert_last("(%0, %1, %2)".format(arg_vector.x, arg_vector.y, arg_vector.z));
    } else if(args[i].retrieve(arg_double)) {
        args_as_string.insert_last(arg_double);
    } else if(args[i].retrieve(arg_int)) {
        args_as_string.insert_last(arg_int);
    } else {
        args_as_string.insert_last("<Unknown type>");
    }
}
return join(args_as_string, delimiter);

}

NVGT documentation example (using array@):
Could you please explain what these different syntaxes specifically mean? Apologies for any language barriers - I'm not very confident in my English and I'm sorry if anything is unclear. Please let me know if I need to clarify anything further.