Пытаюсь построить идеальную модель кортежей в некотором языке программирования.
Кортеж — это просто некоторая группа объектов (переменных, констант), не имеющая собственного типа, а существующая на этапе компиляции просто для удобства.
Записывается просто как список объектов в круглых скобках через запятую.
Такие варианты использования выглядят наиболее логично и красиво:
1. возврат нескольких значений из функции
(int,char,float) Foo()
{
return (100,'a',3.14);
}
2. групповые операции
(i,j,k) = (1,2,3);
3. множественные операции
(i,j,k) = 100;
myobj.(i, c, f) = (100, 'q', 0.25);
sum += (i, j, k);
4. групповая и множественная индексация массивов (раскрытие массива в кортеж)
arr[2,4,8] = (10, 20, 30);
arr[10,20,30] = 0;
arr[indexes[0..size-1]] ++;
На простых примерах вроде все хорошо, но дальше начинаются противоречия и ужасы.
— поведение таких групп внутри сложных выражений ?
— простая, понятная и правильная логика обработки операций над двумя и более кортежами разных размеров ?
— передача кортежей в функции; по аналогии с возвращаемыми значениями, список аргументов функции тоже кортеж, но если возможен например инкремент сразу трех переменных, то что делать если программист хочет вызвать функцию сразу для трех переменных?
Foo((i,j,k)); //???
— соответственно, получение множественного возврата из обычных функций, в которые передали кортеж (по аналогии с операциями!)
(d1,d3,d3,d4) = sin(0.2, 0.4, 0.6, 0.8); // double sin(double x)
— ну и если рассматривать наложение ситуаций множественного возврата и множественных аргументов, то вообще бред получается.
Посмотрел в Питоне, там это просто структура данных. В Nemerle немного ближе (есть "раскрытие" кортежа в группу переменных) но "множестенных" операций и прочих наворотов нет.
Интересно было бы посмотреть, существует ли что-то похожее на эти идеи в других языках?