В очередной раз чертыхнувшись решил поделиться причиной этого чертыхания с народом.
А чертыхнулся я по банальной причине...
Выдался свободный день и я сел за реструктуризатор БД для Януса. Код там в общем-то довольно простой, но объемный. Ну, то что нехватает метапрограммирования — это как бы само собой . Но вот то что, мне будет нехватать таких банальных вещей как кортежи (tuples), я даже подумать не мог!!!
А тем не мнее я раз двадцать уже чертыхнулся выбирая другие, и смею заметить, куда более не удобные и громоздкие решения вместо того, чтобы возвратить из функции кортеж! Причем иногда я плевал и создавал временные классы-пары. Думал сделать дженерик-класс Tuple<T1, T2>, но поглядев на читаемость, а вернее не читаемость, награмождений из:
плюнул и создал специализированную пару... На четверки уже не решился.
Причем самое противное, что анонимные типы из превью C# 3.0 меня не выручили бы. Мне нужно возвращать кортежи из функций, а этого то создатели C# 3.0 и не предусмотрели. И это при том, что драли идею они конечно же с функциональных языков.
В общем, понять это нельзя. Такое ощущение, что все кто претендует на криативность ходят "своими" путями просто из приципе.
ЗЫ
Кто бы мог подумать год назад, что я буду задумываться над тем, что неплохо было бы, чтобы МС выгнал к чертям Хейгельбергов и Саттеров и набрал поляков-студентов.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re: Как думаете что мне больше всего нехватает в C# из Nemer
VladD2,
> нехватать таких банальных вещей как кортежи (tuples), я даже подумать не мог!!! > > <...> > > Кто бы мог подумать год назад, что я буду задумываться над тем, что неплохо было бы, чтобы МС выгнал к чертям Хейгельбергов и Саттеров и набрал поляков-студентов.
А Саттер-то тут причем? Да и в C++ tuples вполне реализуются на уровне библиотек...
Posted via RSDN NNTP Server 2.0
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re: Как думаете что мне больше всего нехватает в C# из Nemer
Здравствуйте, VladD2, Вы писали:
VD>Кто бы мог подумать год назад, что я буду задумываться над тем, что неплохо было бы, чтобы МС выгнал к чертям Хейгельбергов и Саттеров и набрал поляков-студентов.
Спорим на ящик пива, через год-два ты будешь точно так же бухтеть на "поляков-студентов". Стоит не так, висит кривовато... Да ты, брат, эстэт, едрён-батон.
McSeem
Я жертва цепи несчастных случайностей. Как и все мы.
Re: Как думаете что мне больше всего нехватает в C# из Nemer
VD>Кто бы мог подумать год назад, что я буду задумываться над тем, что неплохо было бы, чтобы МС выгнал к чертям Хейгельбергов и Саттеров и набрал поляков-студентов.
Кто бы мог подумать? Думали многие читатели твоих фанатичных дифирамбов C#
Не со зла говорю, просто так оно и есть.
Re: Как думаете что мне больше всего нехватает в C# из Nemer
Здравствуйте, Павел Кузнецов, Вы писали:
ПК>А Саттер-то тут причем?
Инструкция для тех у кого плохо с юмором. Если сзади высказывания стоит смайлик, то это шутка.
Саттер попался под руку просто потому-что мужик с именем. Проблема в том, что даже ворох именитых людей не способны оградить МС от хождения по весьма странным путям.
ПК> Да и в C++ tuples вполне реализуются на уровне библиотек...
Паш, ты издевашся? Такую грязь я и на C# напишу за 5 минут!
Но поглядев на такое я лучше выбиру другие пути. А имей я в своем распоряжении кортежи как в Нэмерле я выбрал бы их. И код получился чистым, простым и удобным в поддержке.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: Как думаете что мне больше всего нехватает в C# из Ne
Здравствуйте, McSeem2, Вы писали:
MS>Спорим на ящик пива, через год-два ты будешь точно так же бухтеть на "поляков-студентов". Стоит не так, висит кривовато... Да ты, брат, эстэт, едрён-батон.
С удовольствием бы бухтел на поляков.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: Как думаете что мне больше всего нехватает в C# из Ne
VD>Паш, ты издевашся? Такую грязь я и на C# напишу за 5 минут!
Это как раз ерунда. Можно пережить. А вот это уже с трудом:
int i = get<0>(t); i = t.get<0>(); // okint j = get<0>(ct); // ok
get<0>(t) = 5; // ok
get<0>(ct) = 5; // error, can't assign to const
...
double e = get<1>(t); // ok
get<1>(t) = 3.14; // ok
get<2>(t) = A(); // error, can't assign to const
A aa = get<3>(t); // error: index out of bounds
... << RSDN@Home 1.2.0 alpha rev. 646 on Windows XP 5.1.2600.131072>>
Собственно, чтобы было понятно. Вот пример код на Nemerle:
// Формируем строку формата "str" и список аргуменов (выражений в них подсавляемых).
def (str, args, _) = exprs.FoldRight(("", [], 0), fun(expr, accumulator)
{
// Выделяем из кортежа отдельные значения
// str - формируемая строка форамата.
// args - формируемый список выражений параметров.
// i - счетчик количества параметров.
def (str, args, i) = accumulator;
def x = expr.ToString(); // Преобразуем текущее выражение в строку.
// Функция Unquot(s) убирает обрамляющие ковычки из строки.
def Unquot(s) { s.Substring(1).Substring(0, s.Length - 2) }
// AddTwiceBraces(s) удваиват знаки "{" и "}".
def AddTwiceBraces(s) { s.Replace("{", "{{").Replace("}", "}}") }
if (x.Length > 0)
{
// Если стока начинается с ", то это просто подстрока которую нужно
// обработать и добавить в строку формата.if (x[0] == '"')
(str + AddTwiceBraces(Unquot(x)), args, i)
// иначе это "встроеное" подвыражение выделенное из строки.
// Для каждого такого подвыражения нужно добавить с форматную строку
// тег вида {x} где x - это номер подвыражения, а так же добавить выражение
// в список выражений которые в посделствии будут формировать параметры.else
(str + "{" + i.ToString() + "}", expr :: args, i + 1)
}
else// Если строка пуста, то ничего не делаем.
accumulator
});
попробуй переписать его на С++ не заменяя рекурсию на цикл и ты поймешь насколько неудобна эмуляция кортежей.
Кстати, надо еще учитывать то, что кортеж в Нэмерле можно передавать в функцию вместо ее параметров. Так вызовы:
F(1, "text", 1.2);
и
def tuple1 = (1, "text", 1.2);
F(tuple1);
аналогичны.
Это позволяет описывать функции в терминах двух тюплов. Первый описывает возвращаемое значени, а второй параметры.
Таким образом можно рассматривать функцию как всегда принимающую один параметр и возвращающую одно значение. Это делает язык очень выразительным, а его концепции очень простыми.
Вот это я называю отличным дизайном!
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[4]: Как думаете что мне больше всего нехватает в C# из Ne
Здравствуйте, AndrewVK, Вы писали:
VD>>Паш, ты издевашся? Такую грязь я и на C# напишу за 5 минут!
AVK>Это как раз ерунда. Можно пережить.
Тебе может и ерунда. А я лично терпеть такую грязь в своем коде не намерян.
AVK>А вот это уже с трудом: AVK>
AVK>int i = get<0>(t); i = t.get<0>(); // ok
AVK>int j = get<0>(ct); // ok
AVK>get<0>(t) = 5; // ok
AVK>get<0>(ct) = 5; // error, can't assign to const
AVK> ...
AVK>double e = get<1>(t); // ok
AVK>get<1>(t) = 3.14; // ok
AVK>get<2>(t) = A(); // error, can't assign to const
AVK>A aa = get<3>(t); // error: index out of bounds
AVK>
+1
Без поддержки языка кортежи к сожалению выглядят неуклюже.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: Как думаете что мне больше всего нехватает в C# из Ne
> Это как раз ерунда. Можно пережить. А вот это уже с трудом: >
> int i = get<0>(t); i = t.get<0>(); // ok
> int j = get<0>(ct); // ok
> get<0>(t) = 5; // ok
> get<0>(ct) = 5; // error, can't assign to const
> ...
> double e = get<1>(t); // ok
> get<1>(t) = 3.14; // ok
> get<2>(t) = A(); // error, can't assign to const
> A aa = get<3>(t); // error: index out of bounds
>
А здесь что не так?
Posted via RSDN NNTP Server 2.0
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[3]: Как думаете что мне больше всего нехватает в C# из Ne
AndrewVK,
> ПК> в C++ tuples вполне реализуются на уровне библиотек... > > t.get<0> ничем не лучше t.Val1.
Лучше, конечно: в первом случае значения можно перебирать в цикле (времени компиляции). Впрочем, можно чуть более конкретно показать, как тебе больше нравится?
Posted via RSDN NNTP Server 2.0
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[4]: Как думаете что мне больше всего нехватает в C# из Ne
Здравствуйте, Павел Кузнецов, Вы писали:
>> Это как раз ерунда. Можно пережить. А вот это уже с трудом: >>
>> int i = get<0>(t); i = t.get<0>(); // ok
>> int j = get<0>(ct); // ok
>> get<0>(t) = 5; // ok
>> get<0>(ct) = 5; // error, can't assign to const
>> ...
>> double e = get<1>(t); // ok
>> get<1>(t) = 3.14; // ok
>> get<2>(t) = A(); // error, can't assign to const
>> A aa = get<3>(t); // error: index out of bounds
>>
ПК>А здесь что не так?
Вот это:
int i = get<0>(t);
по нормальному должно выглядеть так:
def (i, _) = t;
или так:
def (a, b, c, d) = t;
где a, b, c, d — это переменные тип тип и значения которых соотвествуют полям кортежа.
Это:
i = t.get<0>(); // ok
вообще не должно компилироваться.
А создание долно выглядеть так:
(1, "ss")
и чтобы никаких лишних фигней.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[3]: Как думаете что мне больше всего нехватает в C# из Ne
Здравствуйте, VladD2, Вы писали:
VD>Кто бы мог подумать год назад, что я буду задумываться над тем, что неплохо было бы, чтобы МС выгнал к чертям Хейгельбергов и Саттеров и набрал поляков-студентов.
А без этого нельзя использовать Nemerle? Прямо сейчас.
Re: Как думаете что мне больше всего нехватает в C# из Nemer
Здравствуйте, VladD2, Вы писали:
VD>Кто бы мог подумать год назад, что я буду задумываться над тем, что неплохо было бы, чтобы МС выгнал к чертям Хейгельбергов и Саттеров и набрал поляков-студентов.
Так насколько я понимаю, разработка Nemerle идет на майкрософтовский гранд, так что можно считать MS уже набрал этих самых студентов