Re[8]: Как думаете что мне больше всего нехватает в C# из Ne
От: Vermicious Knid  
Дата: 13.03.06 18:57
Оценка: +1
Здравствуйте, VladD2, Вы писали:

ПК>>
ПК>>int i;
ПК>>tie(i, ignore) = t;
ПК>>


VD>Явная типизация в большинстве случаев только ухудшает читабельность. Но если она нужна, то ее можно задать по месту:


Если говорить об исходном примере можно еще так:
def (i : int, _) = t;

VD>Но по жизни это не требуется.

+1

VD> Вот, например, код макроса преобразовывающего содержимое произвольного кортежа в строку:


Вообще-то нет, хотя я сам так сначала подумал, глядя на название. На самом это макрос, определяющий для произвольного класса/структуры функцию ToString возвращающую строку в формате "кортежа"(типа вот этого — "(1, aha, 23.0)"). Для преобразования содержимого кортежа в строку слава богу метод ToString прекрасно работает.

В стандартной макро-библиотеке Nemerle на самом деле очень мало макросов для кортежей, а то что есть мягко говоря не очень полезное, на мой взгляд конечно. Но compile-time циклы по кортежам точно можно делать. Хотя справедливости ради стоит отметить, что там больше compiler-internals магии, чем собственно поддержки языка.

В принципе если бы мне например что-то такое понадобилось, я бы с легкостью написал, но честно говоря я сходу не могу придумать, где бы вообще могла пригодиться итерация по элементам кортежа во время компиляции(разве что генерация кода сериализации и ввода/вывода).
Re[5]: Как думаете что мне больше всего нехватает в C# из Ne
От: VladD2 Российская Империя www.nemerle.org
Дата: 13.03.06 18:58
Оценка:
Здравствуйте, srggal, Вы писали:

S>STL — стандартная библиотека С++. std::pair описан в стандарте языка. Спор об этом — это флейм, и Мы рискуем скатится к тому, что в С++ нет исключений, они есть в компиляторе.


Ну, так не флэйми. Есть язык, а есть его библиотеки. Не путай мягкое с теплым.

S>Я понял, о чём идет речь, но целью моего сообщения было напомнить С++ комьюнити, что передать два значения можно не только при помощи Тупла.


Да передать их можно кучей способов. Тот только есть простые и интуитивные, а есть неудобные и громоздкие. Только и всего.

Сделать "как в С++" в C# можно без особых проблем. Но это неудбно.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[10]: Как думаете что мне больше всего нехватает в C# из N
От: VladD2 Российская Империя www.nemerle.org
Дата: 13.03.06 18:58
Оценка:
Здравствуйте, WolfHound, Вы писали:

WH>

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
От: WolfHound  
Дата: 13.03.06 18:58
Оценка: +1
Здравствуйте, srggal, Вы писали:

S>Я понял, о чём идет речь, но целью моего сообщения было напомнить С++ комьюнити, что передать два значения можно не только при помощи Тупла.

Про этот костыль всем прекрасно извесно. И появился он исключительно из-за того что в С++ не нормальных кортежей.
... << RSDN@Home 1.1.4 beta 6a rev. 436>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[6]: Как думаете что мне больше всего нехватает в C# из Ne
От: srggal Украина  
Дата: 13.03.06 19:09
Оценка:
Здравствуйте, WolfHound, Вы писали:

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


WH>Про этот костыль всем прекрасно извесно.

Я Вам не скажй за всю Одессу,
но в этом флейме, в который, к сожалению, переросло обсуждение темы, никто про pair не вспомнил. ТОлько сразу про Тупл.

WH>И появился он исключительно из-за того что в С++ не нормальных кортежей.

Если не затруднит, на чем основывается такой вывод ? Здравый смысл или факты ?

Мне кажется, что сначала появился pair, и несколько позже начались исследования С++ на предмет Tuple.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[11]: Как думаете что мне больше всего нехватает в C# из N
От: VladD2 Российская Империя www.nemerle.org
Дата: 13.03.06 19:19
Оценка:
Здравствуйте, WolfHound, Вы писали:

WH>Их ребята из boost'а уже написали.


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

E>/С ехидной интонацией/ А в Ruby...


С добродушной интонацией: А руби не прошел ценза. Не катируются у нас тормозные скриптовые языки с кучей проблем в дизайне.

E>Зато сейчас... Nemerle, Nemerle...

E>От чего ты будешь фанатеть завтра?

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

S>Хуже/лучше чем с обезьяной ?


Обезьяна — теплокровное животное наделенная мозгом. А...

S>Дженерики в C# разве не имеют ничего общего с рантайм ?


Применительно к данному случае они ничем от шаблонов не отличаются.

Шаблоны С++ воплощаются компилятором. А дженерики джит-компилятором.

VD>>Владу вообще не нравятся эмуляции и извращения. Он любит простые и чистые решения. Чем проще и чище, тем лучше.

S>Отчего же Влад так любит работать на виртуальном байт-коде, который не имеет ничего общего с реальным и который потом какой-то приблудой компилируется в конретный машинный ?

Не уловил связи.
Что касается байткодов, то я с ними не работаю. Их читают разные джит-компиляторы. Я максимум что делаю — это смотрю их через Рефлектор (декомпилятор). А при отладке я вижу такой же гнусный ассемблер.

S>Это я к тому, что ИМХО не стоит быть таким категоричным.


Не будь.

S>ЗЫ Я на Вашей стороне — пользоваться Туплами одинаково неудобно и на С№ и на С++. Просто на Шареп пишут менее терпимые и более разнеженные, а С++ серам, суровым парням, лишних пару байт набить на клавиатуре, либо распознгать и интерпретировать при промотре исходникоф — не в западло


Понимаш ли в чем дело? Разница между нашими подходами в том, что ты думашь сколько ты набьешь кода, а я о том насколько понятным будет мой код. Только и всего.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[15]: Как думаете что мне больше всего нехватает в C# из N
От: Kluev  
Дата: 13.03.06 19:30
Оценка:
Здравствуйте, eao197, Вы писали:

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


E>Ты уверен?

E>Имхо, использование функций:
E>
E>std::string & first()
E>  {
E>    static std::string s;
E>    return s;
E>  }

E>std::string global;
E>std::string & second()
E>  {
E>    return global;
E>  }
E>

E>в многопоточных программах с одинаковой вероятностью приведет к проблемам. Даже с std::string. Не говоря о том, что могут быть и более сложные классы.

Такие случаи — редкость. В основном в игнор просятся простые вещи типа Point3d да инты с даблами. И программер должен знать, что он делает и чем он пользуется. Поэтому я не юзаю std::string и STL из-за непредсказуемости реализации (и убогости STL велосипедов).
Re[7]: Как думаете что мне больше всего нехватает в C# из Ne
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 13.03.06 19:36
Оценка: +1
Здравствуйте, VladD2, Вы писали:

VD>С добродушной интонацией: А руби не прошел ценза. Не катируются у нас тормозные скриптовые языки с кучей проблем в дизайне.


Вай, вай! А где в Янусе нужна высокая скорость работы?
В Web-приложениях, например, Ruby спокойно конкурирует с Java.


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[7]: Как думаете что мне больше всего нехватает в C# из Ne
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 13.03.06 19:39
Оценка:
Здравствуйте, VladD2, Вы писали:


VD>... скриптовые языки с кучей проблем в дизайне.


Про проблемы в дизайне Ruby можно подробнее?


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[7]: Как думаете что мне больше всего нехватает в C# из Ne
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 13.03.06 19:44
Оценка:
Здравствуйте, VladD2, Вы писали:

E>>От чего ты будешь фанатеть завтра?


VD>Увидим.


А вот теперь посмотри: год назад, ты уверял меня, что C# -- это круто, что нужно бросать C++ и писать на C#. Послушал бы я тебя тогда, к сегодняшнему моменту чего-нибудь успел бы сделать на C#. Но чу! C# то не так крут, есть и круче. Значит, нужно бросать C# и писать на Nemerle. С такими же перспективами через 1.5 года перебраться под OCaml/NET (к примеру).

Так что получается, что на массированную рекламу лучше не поддаваться, никуда не перепрыгивать. Время покажет, на какую платформу имеет смысл переходить. Может и правда это будет Nemerle. Если так, то я ничуть не огорчусь, что C# прошел мимо меня.


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[7]: Как думаете что мне больше всего нехватает в C# из Ne
От: VladGalkin Украина  
Дата: 13.03.06 20:00
Оценка:
Здравствуйте, srggal, Вы писали:

S>>Я Вам не скажй за всю Одессу,

S>>но в этом флейме, в который, к сожалению, переросло обсуждение темы, никто про pair не вспомнил. ТОлько сразу про Тупл.

ИМХО: pair это очень конкретный и специальный случай кортежа, и вспоминать о нём не к лицу. Даже суть его вынесена в название (парочка ) и появился он, скорее всего, (а скорее всего так и есть) именно для использования в контейнерах для пар ключ/значение, а не для поддержки идеи кортежей, в том виде, в каком я хочу быть свободным использовать её.
ДЭ!
Re[12]: Как думаете что мне больше всего нехватает в C# из N
От: WolfHound  
Дата: 13.03.06 20:26
Оценка:
Здравствуйте, VladD2, Вы писали:

WH>>Их ребята из boost'а уже написали.

VD>А для всех типов?
Что? tie? Да для всех...
// Tie function templates -------------------------------------------------
template<class T1>
inline tuple<T1&> tie(T1& t1) {
  return tuple<T1&> (t1);
}

template<class T1, class T2>
inline tuple<T1&, T2&> tie(T1& t1, T2& t2) {
  return tuple<T1&, T2&> (t1, t2);
}

template<class T1, class T2, class T3>
inline tuple<T1&, T2&, T3&> tie(T1& t1, T2& t2, T3& t3) {
  return tuple<T1&, T2&, T3&> (t1, t2, t3);
}
...
... << RSDN@Home 1.1.4 beta 6a rev. 436>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[7]: Как думаете что мне больше всего нехватает в C# из Ne
От: WolfHound  
Дата: 13.03.06 20:26
Оценка: 47 (2) +3 -1 :))
Здравствуйте, 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
От: Павел Кузнецов  
Дата: 13.03.06 21:39
Оценка:
Здравствуйте, 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
От: Павел Кузнецов  
Дата: 13.03.06 21:42
Оценка: +1 -1
Здравствуйте, VladD2, Вы писали:

VD> в Янусе 2.5 метра кода. И просто так его переписывать никто не будет.


Неужели? А как же столь расхвалявшиеся
Автор: VladD2
Дата: 06.02.06
преимущества как можно более быстрого перехода на новые перспективные технологии?
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[10]: Как думаете что мне больше всего нехватает в C# из N
От: Павел Кузнецов  
Дата: 13.03.06 21:52
Оценка:
Здравствуйте, 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
От: Павел Кузнецов  
Дата: 13.03.06 21:57
Оценка: -1
Здравствуйте, VladD2, Вы писали:

VD>Сделать "как в С++" в C# можно без особых проблем. Но это неудбно.


Не получится: там для этого язык менять придется, т.к. t[0] будет возвращать какой-нибудь Object и т.п.
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[9]: Как думаете что мне больше всего нехватает в C# из Ne
От: Vermicious Knid  
Дата: 14.03.06 01:23
Оценка: 23 (1)
Здравствуйте, Павел Кузнецов, Вы писали:

ПК>-1


Вопрос: зачем комитет 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);


Я надеюсь само собой понятно, что расширение функциональности для генерации кода на базе вышеприведенного кода не представляет особой сложности:
using Nemerle.Compiler;

macro DumpTuple(tuple, action)
{
    def getTupleArgs(tupleExpr)
    {
        match (tupleExpr.Type.Fix())
        {
            | MType.Tuple(args) => args
            | _ => Message.FatalError($"expected expression of tuple type, got $(tupleExpr.Type)")
        }
    }
    
    def tupleArgs = getTupleArgs(Nemerle.Macros.ImplicitCTX().TypeExpr(tuple));
    mutable (i, code) = (0, []);
    for(;i < tupleArgs.Length; i++)
        code = <[ $action($tuple[$(i : int)]) ]> :: code;
    <[ { .. $(code.Reverse()) }]>
}


Пример использования:
using System.Console;

module Test
{
    public Print(n : int) : void
    {
        WriteLine("int: {0}", n);
    }
    public Print(str : string) : void
    {
        WriteLine("string: \"{0}\"", str);
    }
    public Print(str : System.Text.StringBuilder) : void
    {
        WriteLine("StringBuilder: \"{0}\"", str);
    }
    public Print(n : double) : void
    {
        WriteLine("double: {0}", n);
    }
    public Print(n : char) : void
    {
        WriteLine("char: '{0}'", n);
    }
    public Print[A,B](obj : A * B) : void
    {
        WriteLine("tuple2[{0},{1}]: {2}", typeof(A), typeof(B), obj);
    }
    public Print[A,B,C](obj : A * B * C) : void
    {
        WriteLine("tuple3[{0},{1},{2}]: {3}", typeof(A), typeof(B), typeof(C), obj);
    }
    public Print(obj : object) : void
    {
        WriteLine("uknown object: {0}", obj);
    }
}

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);

DumpTuple(x, Test.Print);
DumpTuple(y, Test.Print);
DumpTuple(z, Test.Print);
DumpTuple(xyz, Test.Print);


А вот что получится на выходе:

int: 1
string: "abc"
int: 1
int: 2
int: 3
int: 4
int: 5
int: 6
int: 7
int: 8
int: 9
StringBuilder: ""
double: 2
char: 'a'
tuple2[System.Int32,System.String]: (1, abc)
uknown object: (1, 2, 3, 4, 5, 6, 7, 8, 9)
tuple3[System.Text.StringBuilder,System.Double,System.Char]: (, 2, a)


ПК>Кстати, какого типа выражение t[0] в Nemerle?


Я надеюсь вышеприведенный пример ответил на данный вопрос.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.