VD>Явная типизация в большинстве случаев только ухудшает читабельность. Но если она нужна, то ее можно задать по месту:
Если говорить об исходном примере можно еще так:
def (i : int, _) = t;
VD>Но по жизни это не требуется.
+1
VD> Вот, например, код макроса преобразовывающего содержимое произвольного кортежа в строку:
Вообще-то нет, хотя я сам так сначала подумал, глядя на название. На самом это макрос, определяющий для произвольного класса/структуры функцию ToString возвращающую строку в формате "кортежа"(типа вот этого — "(1, aha, 23.0)"). Для преобразования содержимого кортежа в строку слава богу метод ToString прекрасно работает.
В стандартной макро-библиотеке Nemerle на самом деле очень мало макросов для кортежей, а то что есть мягко говоря не очень полезное, на мой взгляд конечно. Но compile-time циклы по кортежам точно можно делать. Хотя справедливости ради стоит отметить, что там больше compiler-internals магии, чем собственно поддержки языка.
В принципе если бы мне например что-то такое понадобилось, я бы с легкостью написал, но честно говоря я сходу не могу придумать, где бы вообще могла пригодиться итерация по элементам кортежа во время компиляции(разве что генерация кода сериализации и ввода/вывода).
Re[5]: Как думаете что мне больше всего нехватает в C# из Ne
Здравствуйте, srggal, Вы писали:
S>STL — стандартная библиотека С++. std::pair описан в стандарте языка. Спор об этом — это флейм, и Мы рискуем скатится к тому, что в С++ нет исключений, они есть в компиляторе.
Ну, так не флэйми. Есть язык, а есть его библиотеки. Не путай мягкое с теплым.
S>Я понял, о чём идет речь, но целью моего сообщения было напомнить С++ комьюнити, что передать два значения можно не только при помощи Тупла.
Да передать их можно кучей способов. Тот только есть простые и интуитивные, а есть неудобные и громоздкие. Только и всего.
Сделать "как в С++" в C# можно без особых проблем. Но это неудбно.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[10]: Как думаете что мне больше всего нехватает в C# из N
WH>Tuples
WH>def t = (1, "one");: a tuple is a set of values which no name to recognise them
WH>def fst = t[0];: use 0-based index to get the items
WH>Ы?
Кстати, несмотря на это пройтись в цикле по кортежу так не удастся. У полей ведь могут быть разные типы. Вместо этого кортеж можно представить как список выражений или как тип со списком полей.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[5]: Как думаете что мне больше всего нехватает в C# из Ne
Здравствуйте, srggal, Вы писали:
S>Я понял, о чём идет речь, но целью моего сообщения было напомнить С++ комьюнити, что передать два значения можно не только при помощи Тупла.
Про этот костыль всем прекрасно извесно. И появился он исключительно из-за того что в С++ не нормальных кортежей.
... << RSDN@Home 1.1.4 beta 6a rev. 436>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[6]: Как думаете что мне больше всего нехватает в C# из Ne
Здравствуйте, WolfHound, Вы писали:
WH>Здравствуйте, srggal, Вы писали:
WH>Про этот костыль всем прекрасно извесно.
Я Вам не скажй за всю Одессу,
но в этом флейме, в который, к сожалению, переросло обсуждение темы, никто про pair не вспомнил. ТОлько сразу про Тупл.
WH>И появился он исключительно из-за того что в С++ не нормальных кортежей.
Если не затруднит, на чем основывается такой вывод ? Здравый смысл или факты ?
Мне кажется, что сначала появился pair, и несколько позже начались исследования С++ на предмет Tuple.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[11]: Как думаете что мне больше всего нехватает в C# из N
Здравствуйте, eao197, Вы писали:
E>/С ехидной интонацией/ А в Ruby...
С добродушной интонацией: А руби не прошел ценза. Не катируются у нас тормозные скриптовые языки с кучей проблем в дизайне.
E>Зато сейчас... Nemerle, Nemerle... E>От чего ты будешь фанатеть завтра?
Увидим.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[7]: Как думаете что мне больше всего нехватает в C# из Ne
Здравствуйте, srggal, Вы писали:
S>Хуже/лучше чем с обезьяной ?
Обезьяна — теплокровное животное наделенная мозгом. А...
S>Дженерики в C# разве не имеют ничего общего с рантайм ?
Применительно к данному случае они ничем от шаблонов не отличаются.
Шаблоны С++ воплощаются компилятором. А дженерики джит-компилятором.
VD>>Владу вообще не нравятся эмуляции и извращения. Он любит простые и чистые решения. Чем проще и чище, тем лучше. S>Отчего же Влад так любит работать на виртуальном байт-коде, который не имеет ничего общего с реальным и который потом какой-то приблудой компилируется в конретный машинный ?
Не уловил связи.
Что касается байткодов, то я с ними не работаю. Их читают разные джит-компиляторы. Я максимум что делаю — это смотрю их через Рефлектор (декомпилятор). А при отладке я вижу такой же гнусный ассемблер.
S>Это я к тому, что ИМХО не стоит быть таким категоричным.
Не будь.
S>ЗЫ Я на Вашей стороне — пользоваться Туплами одинаково неудобно и на С№ и на С++. Просто на Шареп пишут менее терпимые и более разнеженные, а С++ серам, суровым парням, лишних пару байт набить на клавиатуре, либо распознгать и интерпретировать при промотре исходникоф — не в западло
Понимаш ли в чем дело? Разница между нашими подходами в том, что ты думашь сколько ты набьешь кода, а я о том насколько понятным будет мой код. Только и всего.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[15]: Как думаете что мне больше всего нехватает в C# из N
E>в многопоточных программах с одинаковой вероятностью приведет к проблемам. Даже с std::string. Не говоря о том, что могут быть и более сложные классы.
Такие случаи — редкость. В основном в игнор просятся простые вещи типа Point3d да инты с даблами. И программер должен знать, что он делает и чем он пользуется. Поэтому я не юзаю std::string и STL из-за непредсказуемости реализации (и убогости STL велосипедов).
Re[7]: Как думаете что мне больше всего нехватает в C# из Ne
Здравствуйте, VladD2, Вы писали:
VD>С добродушной интонацией: А руби не прошел ценза. Не катируются у нас тормозные скриптовые языки с кучей проблем в дизайне.
Вай, вай! А где в Янусе нужна высокая скорость работы?
В Web-приложениях, например, Ruby спокойно конкурирует с Java.
SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[7]: Как думаете что мне больше всего нехватает в C# из Ne
Здравствуйте, VladD2, Вы писали:
E>>От чего ты будешь фанатеть завтра?
VD>Увидим.
А вот теперь посмотри: год назад, ты уверял меня, что C# -- это круто, что нужно бросать C++ и писать на C#. Послушал бы я тебя тогда, к сегодняшнему моменту чего-нибудь успел бы сделать на C#. Но чу! C# то не так крут, есть и круче. Значит, нужно бросать C# и писать на Nemerle. С такими же перспективами через 1.5 года перебраться под OCaml/NET (к примеру).
Так что получается, что на массированную рекламу лучше не поддаваться, никуда не перепрыгивать. Время покажет, на какую платформу имеет смысл переходить. Может и правда это будет Nemerle. Если так, то я ничуть не огорчусь, что C# прошел мимо меня.
SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[7]: Как думаете что мне больше всего нехватает в C# из Ne
Здравствуйте, srggal, Вы писали:
S>>Я Вам не скажй за всю Одессу, S>>но в этом флейме, в который, к сожалению, переросло обсуждение темы, никто про pair не вспомнил. ТОлько сразу про Тупл.
ИМХО: pair это очень конкретный и специальный случай кортежа, и вспоминать о нём не к лицу. Даже суть его вынесена в название (парочка ) и появился он, скорее всего, (а скорее всего так и есть) именно для использования в контейнерах для пар ключ/значение, а не для поддержки идеи кортежей, в том виде, в каком я хочу быть свободным использовать её.
ДЭ!
Re[12]: Как думаете что мне больше всего нехватает в C# из N
Здравствуйте, srggal, Вы писали:
S>Я Вам не скажй за всю Одессу, но в этом флейме, в который, к сожалению, переросло обсуждение темы, никто про pair не вспомнил. ТОлько сразу про Тупл.
А толку то от этого недоделанного кортежа на 2 элемента? Такую штуку я могу и C#2 запросто навернуть. Вот только толку от этого нету.
WH>>И появился он исключительно из-за того что в С++ не нормальных кортежей. S>Если не затруднит, на чем основывается такой вывод ? Здравый смысл или факты ?
Здравый смысл разумеется. Если бы в языке были нормальные кортежи то никто в здравом уме не стал бы придумывать свой.
S>Мне кажется, что сначала появился pair, и несколько позже начались исследования С++ на предмет Tuple.
Если ты про boost::tuple то это тоже костыль. Как вобщемто большая часть буста.
Причем С++ чем дальше тем больше превращается в огромного жутика обвешанного всякой фигней... и это при том что комитетчики придерживаются принципа зачем вводить в язык то что реализуется библиотекой? Вот только что-то у них это не получается... За то получается у авторов Nemerle за что им большой респект. Там половина языка (а может и больше) в библиотеке... С++у такое и не снилось. И не приснится уже никгда... ибо этот титаник на глиняном айсберге рушится под собственным весом.
... << RSDN@Home 1.1.4 beta 6a rev. 436>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[8]: Как думаете что мне больше всего нехватает в C# из Ne
Здравствуйте, VladD2, Вы писали:
VD>Явная типизация в большинстве случаев только ухудшает читабельность.
-1
ПК>>У этого синтаксиса есть очень существенное преимущество по сравнению с (i, _): возможность итерации по значениям t в compile-time цикле.
VD>Паш, какие нафиг комайл-тайм циклы в языке не имеющем специальных средств для этого?
Функциональные, через рекурсию.
VD>А извращения могут быть любыми. Уж извини, но С++ с Нэемерлом в компайлтайме не тягаться.
Это я в данной теме не обсуждаю. Я только высказался относительно двух разных форм записи: (i, _) = t vs. i = get<0>(t).
VD>В немерле есть синтаксис индексации кортежа: VD>
VD>t[0]
VD>
VD>но применяется он не часто, так как нафиг не нужно. Делать же циклы по нему бессмысленно так как у него могут быть разные типы.
Именно из-за разных типов я и сказал о compile-time циклах. Это вполне осмысленно для любых утилит обобщенной обработки tuples. Кстати, какого типа выражение t[0] в Nemerle?
VD>2. Что такое make_tuple?
Перегруженный шаблон функции, создающей tuple.
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[3]: Как думаете что мне больше всего нехватает в C# из Ne
Здравствуйте, Vermicious Knid, Вы писали:
ПК>>Это-то тут причем? Речь не о языке, а о синтаксисе. Синтаксис (i, _) не позволяет выразить итерацию по значениям tuple, а синтаксис get<n>(t) — позволяет.
VK>В Nemerle абсолютно иной подход к compile-time, поэтому причем, а вот синтаксис как раз ни причем. Так что если бы был только синтаксис (i, _)(индексирование константами там тоже есть), он бы все равно позволял проитерироваться по значениям tuple в compile-time
Но с помощью другого синтаксиса. Это все, что я хотел сказать по этому поводу.
VK>Я не говорю, что подход C++ принципиально хуже подхода Nemerle. В ряде случаев он даже имеет свои преимущества. Но если речь идет именно о гибкости расширении языка и возможностях времени компиляции, то C++ однозначно проигрывает.
Нет, речь о том, что можно делать с помощью одного способа выражения доступа к значениям tuple, и чего нельзя делать с помощью другого способа выражения доступа к значениям tuple.
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[6]: Как думаете что мне больше всего нехватает в C# из Ne
Вопрос: зачем комитет C++ решил ввести в новый стандарт локальный вывод типов для переменных? Неужели чтобы ухудшить читабельность?
ПК>Именно из-за разных типов я и сказал о compile-time циклах. Это вполне осмысленно для любых утилит обобщенной обработки tuples.
В Nemerle для кортежей никаких костылей в принципе не нужно, это внутренний тип. Они реализуют Equals, GetHashCode, ToString, поддерживается сериализация.
Если этого недостаточно, то можно во-первых попытаться расширить классы внутренней библиотеки, которые отвечают за фактическую реализацию кортежей. А во-вторых есть макросы. Вот пример макроса, который во время компиляции генерирует и возвращает(прямо в AST) строку с описанием типа кортежа. Если ему задать в качестве второго параметра true, то он еще и выведет эту строку в консоль(тоже во время компиляции).
using Nemerle.Compiler;
using Nemerle.Macros;
macro TupleTypeToString(tuple, verbose : bool = false)
{
def getTupleArgs(tupleExpr)
{
match (tupleExpr.Type.Fix())
{
| MType.Tuple (args) => args
| _ => Message.FatalError($"expected expression of tuple type, got $(tupleExpr.Type)")
}
}
def tupleArgs = getTupleArgs(ImplicitCTX().TypeExpr(tuple));
def sb = System.Text.StringBuilder("(");
foreach(argType in tupleArgs)
sb.Append(argType.Fix().ToString()).Append(" ");
sb.Append(")");
when (verbose)
System.Console.WriteLine(sb);
<[ $(sb.ToString() : string) ]>
}
Вот пример использования:
using System;
def make_tuple[A,B](a : A, b : B) : A * B
{
(a, b)
}
def x = make_tuple(1, "abc");
def y = (1, 2, 3, 4, 5, 6, 7, 8, 9);
def z = (System.Text.StringBuilder(), 2.0, 'a');
def xyz = (x, y, z);
def xTypeStr = TupleTypeToString(x);
def yTypeStr = TupleTypeToString(y);
def zTypeStr = TupleTypeToString(z);
_ = TupleTypeToString(xyz, true);
Console.WriteLine(xTypeStr);
Console.WriteLine(yTypeStr);
Console.WriteLine(zTypeStr);
Вот что будет выведено в консоль во время компиляции:
((int * string) (int * int * int * int * int * int * int * int * int) (System.Text.StringBuilder * System.Double * char) )
А вот что показывает рефлектор:
// code skipped ...string text1 = "(int string )";
string text2 = "(int int int int int int int int int )";
string text3 = "(System.Text.StringBuilder System.Double char )";
Console.WriteLine(text1);
Console.WriteLine(text2);
Console.WriteLine(text3);
Я надеюсь само собой понятно, что расширение функциональности для генерации кода на базе вышеприведенного кода не представляет особой сложности: