This isn't fully general (or tested in detail), but how about this for a prototype
proc meshgrid(arrs : ?T ... ?nsize) where
isArray(T) && (nsize > 0)
{
const lo = arrs.indices.first;
// All elements have the same type T, so we only need to check that.
assert(arrs[lo].rank==1);
type retType = nsize*arrs[lo].eltType;
// Define the output domain
var tmp : nsize*range;
for ii in arrs.indices do (tmp(ii),) = arrs[ii].domain.dims();
var Dom = {(...tmp)};
var retval : [Dom] retType;
forall ijk in Dom {
for ii in lo.. #nsize do retval[ijk](ii) = arrs(ii)[ijk(ii)];
}
return retval;
}
Here's an example
var x = [1,2,5];
var y = [2,1];
writeln(meshgrid(x,y));
which yields
(1, 2) (1, 1)
(2, 2) (2, 1)
(5, 2) (5, 1)
I chose to save the indices as tuple elements, since that seemed most natural in terms of the ways I might use this (given Chapel promotion).