Re[10]: Как думаете что мне больше всего нехватает в C# из N
От: Kluev  
Дата: 13.03.06 15:50
Оценка:
Здравствуйте, 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
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 13.03.06 15:58
Оценка:
Здравствуйте, 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
От: Юнусов Булат Россия  
Дата: 13.03.06 16:01
Оценка: 18 (1) +1
Здравствуйте, VladD2, Вы писали:

VD>плюнул и создал специализированную пару... На четверки уже не решился.


Ecma C# and Common Language Infrastructure Standards
там ближе к низу сурсы CommonGenerics
Re[11]: Как думаете что мне больше всего нехватает в C# из N
От: Kluev  
Дата: 13.03.06 16:07
Оценка:
Здравствуйте, 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
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 13.03.06 16:11
Оценка: 14 (1)
Здравствуйте, 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
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 13.03.06 16:13
Оценка:
Здравствуйте, Kluev, Вы писали:

K>Давай конкретнее, а то фраза какие либо расчеты, это про сферического коня в вакууме.


Давай.
using ElemTuple = Tuple<int, List<int>, int[]>;

...

private void ReadContent(ReadContext context)
{
    Stack<ElemTuple> elemsStack = new Stack<ElemTuple>();
    XmlReader rdr = context.Reader;
    while (rdr.Read())
        switch (rdr.NodeType)
        {
            case XmlNodeType.Element :
                int en = context.AddString(rdr.Name);
                int[] attrs = ReadAttrs(context);
                if (rdr.IsEmptyElement)
                {
                    int eei = context.AddElement(new ElementStruct(this, en, EmptyInts, attrs));
                    if (elemsStack.Count > 0)
                        elemsStack.Peek().V2.Add(eei);
                }
                else
                    elemsStack.Push(new ElemTuple(en, new List<int>(), attrs));
                break;
                
            case XmlNodeType.EndElement :
                ElemTuple t = elemsStack.Pop();
                int ei = context.AddElement(new ElementStruct(this, t.V1, t.V2.ToArray(), t.V3));
                if (elemsStack.Count > 0)
                    elemsStack.Peek().V2.Add(ei);
                break;
        }
}


K>Результаты расчетов и по ссылкам из функции можно вернуть. Конкретный пример — поиск ближайшего сегмента поли-линии:


Спасибо. Для чего кортеж нужно возвращать из функции я и сам могу придумать.
... << RSDN@Home 1.2.0 alpha rev. 642>>
AVK Blog
Re[2]: Как думаете что мне больше всего нехватает в C# из Ne
От: Oyster Украина https://github.com/devoyster
Дата: 13.03.06 16:15
Оценка:
Здравствуйте, Юнусов Булат, Вы писали:

ЮБ>там ближе к низу сурсы CommonGenerics


Знакомые все лица
Re[2]: Как думаете что мне больше всего нехватает в C# из Ne
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 13.03.06 16:23
Оценка:
Здравствуйте, Юнусов Булат, Вы писали:

ЮБ>Ecma C# and Common Language Infrastructure Standards

ЮБ>там ближе к низу сурсы CommonGenerics

Баян. Влад же эту ссылку в свое время и постил.
... << RSDN@Home 1.2.0 alpha rev. 642>>
AVK Blog
Re[3]: Как думаете что мне больше всего нехватает в C# из Ne
От: Юнусов Булат Россия  
Дата: 13.03.06 16:29
Оценка:
Здравствуйте, AndrewVK, Вы писали:

ЮБ>>Ecma C# and Common Language Infrastructure Standards

ЮБ>>там ближе к низу сурсы CommonGenerics

AVK>Баян. Влад же эту ссылку в свое время и постил.


Значит кто то из нас что то забыл, бывает
Re[7]: Как думаете что мне больше всего нехватает в C# из Ne
От: VladD2 Российская Империя www.nemerle.org
Дата: 13.03.06 16:38
Оценка:
Здравствуйте, Павел Кузнецов, Вы писали:

ПК>Ну, это уже на любителя... В любых мало-мальски нетривиальных случаях мне больше нравится 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]

но применяется он не часто, так как нафиг не нужно. Делать же циклы по нему бессмысленно так как у него могут быть разные типы.
Что касается комайлатайма, то с ним все ОК. Работа ведется на уровне выражений. Вот, например, код макроса преобразовывающего содержимое произвольного кортежа в строку:
[Nemerle.MacroUsage (Nemerle.MacroPhase.WithTypedMembers,
                                         Nemerle.MacroTargets.Class,
                                         Inherited = false, AllowMultiple = false)]
macro TupleToString (t : TypeBuilder)
{
    def flds = t.GetFields (BindingFlags.Public %| BindingFlags.NonPublic %|          
                                                    BindingFlags.Instance %| BindingFlags.DeclaredOnly);
    def appends = List.RevMap (flds, fun (x : IField)
        { 
            <[ ignore (str.Append ($(x.Name : usesite).ToString ())); ]>
        });
    def body_seq = List.FoldLeft (List.Tail (appends), List.Head (appends) ::
                                     [<[ ignore (str.Append (")")); str.ToString () ]>], fun (x, acc)
        {
            x :: <[ ignore (str.Append (", ")) ]> :: acc
        });
        
    def body_seq = <[ def str = System.Text.StringBuilder ("(") ]> :: body_seq;

    t.Define (<[ decl:
        public override ToString () : string { ..$body_seq }
    ]>);
}


>> А создание долно выглядеть так:

>>
>> (1, "ss")
>>

>> и чтобы никаких лишних фигней.

ПК>Ну, от make_tuple(1, "ss") отличие, имхо, не очень большое.


1. Довольно значительное.
2. Что такое make_tuple?
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[6]: Как думаете что мне больше всего нехватает в C# из Ne
От: VladD2 Российская Империя www.nemerle.org
Дата: 13.03.06 16:38
Оценка:
Здравствуйте, 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
От: VladD2 Российская Империя www.nemerle.org
Дата: 13.03.06 16:38
Оценка:
Здравствуйте, eao197, Вы писали:

VD>>Вот это я называю отличным дизайном!


E>Это временно.


Я сам временно... на этой планете. Так что это меня не смущает.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: Как думаете что мне больше всего нехватает в C# из Ne
От: VladD2 Российская Империя www.nemerle.org
Дата: 13.03.06 16:38
Оценка:
Здравствуйте, igna, Вы писали:

VD>>Кто бы мог подумать год назад, что я буду задумываться над тем, что неплохо было бы, чтобы МС выгнал к чертям Хейгельбергов и Саттеров и набрал поляков-студентов.


I>А без этого нельзя использовать Nemerle? Прямо сейчас.


Можно. Но вот рефакторинг и полноценный комплит-вод при этом ждать прийдется очень долго. К тому же МС отшлифовала бы язык и компилятор как следует.

В общем, хорошая подержка и коммерческий вид очень важная вещь. А ведь новые продукты еще нужно пиарить. Хотя... хорошая вещь все равно дорогу себе пробьет.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: Как думаете что мне больше всего нехватает в C# из Ne
От: VladD2 Российская Империя www.nemerle.org
Дата: 13.03.06 16:38
Оценка:
Здравствуйте, ie, Вы писали:

ie>Так насколько я понимаю, разработка Nemerle идет на майкрософтовский гранд, так что можно считать MS уже набрал этих самых студентов


Это разные вещи. Они могут позаимствовать идеи, а могут и вообще сделать вид, что не заметили ничего.

А внутренняя команда выдает реальный продукт.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: Как думаете что мне больше всего нехватает в C# из Ne
От: VladD2 Российская Империя www.nemerle.org
Дата: 13.03.06 16:38
Оценка:
Здравствуйте, srggal, Вы писали:

S>ГМ, а отчего бы, раз Немерле решает кучу проблем — не переписать под него Янус ж)

S>

От того, что в Янусе 2.5 метра кода. И просто так его переписывать никто не будет.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[13]: Как думаете что мне больше всего нехватает в C# из N
От: Kluev  
Дата: 13.03.06 17:10
Оценка:
Здравствуйте, 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
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 13.03.06 17:20
Оценка: +1
Здравствуйте, 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.

... << RSDN@Home 1.2.0 alpha rev. 642>>
AVK Blog
Re[5]: Как думаете что мне больше всего нехватает в C# из Ne
От: xbit Россия  
Дата: 13.03.06 17:31
Оценка: :))) :)
Здравствуйте, VladD2, Вы писали:

E>>Это временно.


VD>Я сам временно... на этой планете. Так что это меня не смущает.


Во! Я так и знал, что он с другой планеты
Нас не догонят!
Re[12]: Как думаете что мне больше всего нехватает в C# из N
От: Kluev  
Дата: 13.03.06 17:46
Оценка:
Здравствуйте, AndrewVK, Вы писали:

AVK>Здравствуйте, Kluev, Вы писали:


K>>Давай конкретнее, а то фраза какие либо расчеты, это про сферического коня в вакууме.


AVK>Давай.

AVK>
AVK>using ElemTuple = Tuple<int, List<int>, int[]>;

AVK>


Ну и в чем смысл? кортеж используется как локальный тип данных внутри функции. Для этого написать

struct elemTuple
{
int i;
list<int> list;
int[] array;
}

писаниниы не намного больше, а по удобству лучше, человеческие названия у полей. А вот если бы такой кортеж возвращался бы из функции...
Полей правдо маловато, штук 20 было бы удобнее

Ф топку такие кортежи, мы лучше будем struct и unused пользовать
Re[8]: Как думаете что мне больше всего нехватает в C# из Ne
От: Павел Кузнецов  
Дата: 13.03.06 17:47
Оценка: +1
Здравствуйте, AndrewVK, Вы писали:

ПК>>
ПК>>auto t  = make_tuple(1, 12.75, A());
ПК>>auto t2 = make_tuple(2, 17.75, A("A"));
ПК>>


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, через который я затем с ними же буду работать как с именованными значениями?..
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.