Paste: rvalue/lvalue overloading

Author: kssreeram
Mode: factor
Date: Thu, 17 Jun 2010 03:12:31
Plain Text |
// 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]]
}

New Annotation

Summary:
Author:
Mode:
Body: