Здравствуйте, AndrewVK, Вы писали:
AVK>Здравствуйте, Kluev, Вы писали:
K>>А нафига такие танцы с бубном? tuple удобен когда из функции надо вернуть несколько значений одновременно, юзать их для чего-то другого я смысла не нашел.
AVK>Плохо искал. Типичный пример — некий временный контейнер с результатами каких либо расчетов.
Давай конкретнее, а то фраза какие либо расчеты, это про сферического коня в вакууме.
Результаты расчетов и по ссылкам из функции можно вернуть. Конкретный пример — поиск ближайшего сегмента поли-линии:
// idx - номер сегмента
// t - в какую точку на сегменте проецируется pt [0, 1]
// dist- растояние от pt к сегменту. void closest_segment(const Point3d &pt, int &idx, double &t, double &dist);
Недостатки в том, что при вызове приходится передавать все параметры, даже если они не нужны.
Можно заюзать указатели и NULL, но тогда добавится оверхед на проверку параметров.
Третий вариант заюзать кортеж и сразу распаковать в локальные переменные:
// к примеру нужен только индекс и расстояниеint idx;
double dst;
tie(idx, _, dst) = pline.closest_segment(pt_from); // t пропускаем
Однако и сдесь нет совершенства т.к. прийдется помнить что куда возвращается. Когда передается по ссылкам, то intellisense напоминает порядок аргументов. Кстати пришла идея использовать класс unused для игнора ненужных параметров:
closest_segment(pt_from, idx, unused, dist);
Re[11]: Как думаете что мне больше всего нехватает в C# из N
Здравствуйте, Kluev, Вы писали:
K>Результаты расчетов и по ссылкам из функции можно вернуть. Конкретный пример — поиск ближайшего сегмента поли-линии:
K>
K>// idx - номер сегмента
K>// t - в какую точку на сегменте проецируется pt [0, 1]
K>// dist- растояние от pt к сегменту.
K>void closest_segment(const Point3d &pt, int &idx, double &t, double &dist);
K>
K>Недостатки в том, что при вызове приходится передавать все параметры, даже если они не нужны.
На самом деле этот подход мне больше нравится и я его использую. Но проблема с ним в том, что он не поддерживает безопасность исключений. Если исключение возникнет после присваивания значения какому-то параметру ссылке, то откатить это изменение уже не просто. Правда, в большинстве случаев и не нужно.
K>Можно заюзать указатели и NULL, но тогда добавится оверхед на проверку параметров.
Этот оверхед настолько минимален (один if на каждый опциональный параметр), что про него можно и не говорить. Вполне себе нормальное решение с нулевыми указателями.
SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re: Как думаете что мне больше всего нехватает в C# из Nemer
Здравствуйте, Kluev, Вы писали:
K>Однако и сдесь нет совершенства т.к. прийдется помнить что куда возвращается. Когда передается по ссылкам, то intellisense напоминает порядок аргументов. Кстати пришла идея использовать класс unused для игнора ненужных параметров: K>
closest_segment(pt_from, idx, unused, dist);
Точно! Ф топку tuples, юзайте unused
struct Unused
{
template <class T>
operator T& ()
{
static T dummy;
return dummy;
}
};
extern Unused unused;
//=================================================void foo(int &x, double &y, string &s);
void test()
{
int x;
double y;
string s;
foo(x, y, s); // беру все
foo(unused, y, s); // почти все
foo(unused, unused, s); // мне много не надо
}
Re[12]: Как думаете что мне больше всего нехватает в C# из N
Здравствуйте, Kluev, Вы писали:
K>Точно! Ф топку tuples,
+1
K> юзайте unused
Однако, для того-же std::string передача указателя вместо ссыки с последующей проверкой на NULL будет дешевле.
Да и могут быть классы, которые в многопоточной программе могут привести к проблемам из-за наличия:
K>[c] K> template <class T> K> operator T& () K> { K> static T dummy; K> return dummy; K> } K>};
SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[11]: Как думаете что мне больше всего нехватает в C# из N
Здравствуйте, Павел Кузнецов, Вы писали:
ПК>Ну, это уже на любителя... В любых мало-мальски нетривиальных случаях мне больше нравится explicit typing: ПК>
ПК>int i;
ПК>tie(i, ignore) = t;
ПК>
ПК>хотя в некоторых случаях было бы, безусловно, удобно.
Явная типизация в большинстве случаев только ухудшает читабельность. Но если она нужна, то ее можно задать по месту:
using Nemerle.IO;
def t : double * string = (1.0, "aaa");
print("$t\n");
Но по жизни это не требуется.
>> Это: >>
>> i = t.get<0>(); // ok
>>
>> вообще не должно компилироваться.
ПК>Гм... Не вижу причин, почему,
Потому-что не должно быть 20 вариантов.
ПК> за исключением того, что должно быть так: ПК>
ПК>i = get<0>( t );
ПК>
ПК>У этого синтаксиса есть очень существенное преимущество по сравнению с (i, _): возможность итерации по значениям t в compile-time цикле.
Паш, какие нафиг комайл-тайм циклы в языке не имеющем специальных средств для этого?
А извращения могут быть любыми. Уж извини, но С++ с Нэемерлом в компайлтайме не тягаться.
В немерле есть синтаксис индексации кортежа:
t[0]
но применяется он не часто, так как нафиг не нужно. Делать же циклы по нему бессмысленно так как у него могут быть разные типы.
Что касается комайлатайма, то с ним все ОК. Работа ведется на уровне выражений. Вот, например, код макроса преобразовывающего содержимое произвольного кортежа в строку:
Здравствуйте, AndrewVK, Вы писали:
AVK>Сравни с C# 3 AVK>
AVK>var t = new (IntValue = 1, DoubleValue = 12.75, AValue = new A());
AVK>var t2 = new (2, 17.75, new A("A"));
AVK>int i = t.IntValue;
AVK>double d = t.DoubleValue;
AVK>A a = t2.AValue;
AVK>t2 = t1;
AVK>
Вот только есть две проблемы.
1. Это не кортэжи. У t и t2 динамический тип недоступный из кода. Так что из функции их не вернут.
2. Нет совместимости между анонимными типами объявленными в разных строках. Так что их не скопировать нельзя, ни стравнить.
К тому же в Нэмереле есть красивая модель. Как я уже говорил кортеж и список параметров фукнций возаимозаменимы. Это очень красивое решение резко упрощающее трактование языка и даже кодогенерацию (для формирования списка параметров достаточно сформировать кортеж).
В общем, взяли отличную идею и изуродывали как бог черепаху.
Надеюсь, что знающие люди им пальцем ткнут и к релизу они таки реализуют полноценные кортежи.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[4]: Как думаете что мне больше всего нехватает в C# из Ne
Здравствуйте, igna, Вы писали:
VD>>Кто бы мог подумать год назад, что я буду задумываться над тем, что неплохо было бы, чтобы МС выгнал к чертям Хейгельбергов и Саттеров и набрал поляков-студентов.
I>А без этого нельзя использовать Nemerle? Прямо сейчас.
Можно. Но вот рефакторинг и полноценный комплит-вод при этом ждать прийдется очень долго. К тому же МС отшлифовала бы язык и компилятор как следует.
В общем, хорошая подержка и коммерческий вид очень важная вещь. А ведь новые продукты еще нужно пиарить. Хотя... хорошая вещь все равно дорогу себе пробьет.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: Как думаете что мне больше всего нехватает в C# из Ne
Здравствуйте, ie, Вы писали:
ie>Так насколько я понимаю, разработка Nemerle идет на майкрософтовский гранд, так что можно считать MS уже набрал этих самых студентов
Это разные вещи. Они могут позаимствовать идеи, а могут и вообще сделать вид, что не заметили ничего.
А внутренняя команда выдает реальный продукт.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: Как думаете что мне больше всего нехватает в C# из Ne
Здравствуйте, eao197, Вы писали:
E>Здравствуйте, Kluev, Вы писали:
K>>Точно! Ф топку tuples,
E>+1
E>)
K>> юзайте unused
E>Однако, для того-же std::string передача указателя вместо ссыки с последующей проверкой на NULL будет дешевле. E>Да и могут быть классы, которые в многопоточной программе могут привести к проблемам из-за наличия:
K>>
K>> template <class T>
K>> operator T& ()
K>> {
K>> static T dummy;
K>> return dummy;
K>> }
K>>};
В многопоточной программе проблеммы можно порешить юзая
template <class T>
operator T& ()
{
return Static<T>::value; // юзаем не локальную стaику, а глобальную
}
[/c]
Re[7]: Как думаете что мне больше всего нехватает в C# из Ne
Здравствуйте, VladD2, Вы писали:
VD>1. Это не кортэжи. У t и t2 динамический тип недоступный из кода. Так что из функции их не вернут.
Я в курсе. Это был просто пример.
VD>2. Нет совместимости между анонимными типами объявленными в разных строках. Так что их не скопировать нельзя, ни стравнить.
Из спецификации:
Within the same program, two anonymous object initializers that specify a sequence of properties of the same names and types in the same order will produce instances of the same anonymous type.
Здравствуйте, AndrewVK, Вы писали:
AVK>Здравствуйте, Kluev, Вы писали:
K>>Давай конкретнее, а то фраза какие либо расчеты, это про сферического коня в вакууме.
AVK>Давай. AVK>
Ну и в чем смысл? кортеж используется как локальный тип данных внутри функции. Для этого написать
struct elemTuple
{
int i;
list<int> list;
int[] array;
}
писаниниы не намного больше, а по удобству лучше, человеческие названия у полей. А вот если бы такой кортеж возвращался бы из функции...
Полей правдо маловато, штук 20 было бы удобнее
Ф топку такие кортежи, мы лучше будем struct и unused пользовать
Re[8]: Как думаете что мне больше всего нехватает в C# из Ne
AVK>После этого можно будет написать t.IntProperty? Правильный ответ: нельзя. Проблема именно в этом.
Честно говоря, не понимаю, зачем нужно t.IntProperty в tuples... Нужно IntProperty — заводим соответствующую структуру. Нужно несколько значений — tuples. Нет?
AVK>Извини, наврал мальца. Правильно так: AVK>
AVK>var t = new {IntValue = 1, DoubleValue = 12.75, AValue = new A()};
AVK>int IntValue = 2; double DoubleValue = 12.75; A AValue = new A("A");
AVK>var t2 = new {IntValue, DoubleValue, AValue};
AVK>
А зачем мне локально оборачивать именованные значения в tuple, через который я затем с ними же буду работать как с именованными значениями?..
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен