// the 'wrap' procedure takes multiple values as input // and returns an equal number of values. // for each argument, // the return value is a pointer to the argument if the argument is a lvalue // and a copy of the argument if the argument is a rvalue // // but it doesn't work because clay does not support // rvalue/lvalue overloading for varargs. // procedure wrap; overload wrap(rvalue first, ...rest) = first, ...wrap(...rest); overload wrap(lvalue first, ...rest) = &first, ...wrap(...rest); overload wrap() = ; main() { var x = 10; // call 'wrap' and put it's results in a tuple var a = (...wrap(10, x, 10, x)); println(Type(a)); // expected output: // Tuple[Int32, Pointer[Int32], Int32, Pointer[Int32]] // received output: // Tuple[Int32, Pointer[Int32], Pointer[Int32], Pointer[Int32]] }