Здравствуйте, nikov, Вы писали:
N>См. здесь внизу страницы.
def x = tup[1];
Вот с моей точки зрения это весьма ухудшает читаемость кода, бо все эти числовые константы при беглом взгляде ни о чем не говорят. Вон для шарпа тоже можно налепить комплект Tuple<T1..Tn>, только это не очень хорошее решение ИМХО.
Здравствуйте, IT, Вы писали:
AVK>>Я там не увидел ситуации когда мне нужно обратится к единственному полю, не объявляя промежуточных переменных.
IT>Ты о C# или о Немерле? Честно говоря не совсем понимаю проблему.
О немерле. Проблема в появлении всяких tuple[6].
AVK>>P.S. Вчера весь вечер пытались до тебя достучаться — ты в MSN бываешь?
IT>Бывают, но мой вечер наступает в твои 3 часа ночи.
А пораньше никак? Нужно уже обговорить план мероприятий.
Здравствуйте, AndrewVK, Вы писали:
AVK>Ну да. Но когда кортеж является частью публичного контракта, делать этого в любом случае не стоит.
Почему не стоит? Потому что в C# нельзя, что ли?
AVK> Остаются приватные, и, возможно, internal методы. Но в таком раскладе править рантайм нет нужды.
Вообще-то в дотнете в метаданные экспортируются все описания вне зависимости от того являются ли они публичными или нет. Возможно это не правильно, но...
VD>> А описать отдельный класс это геборой. Да и не будут совместимы иэти типы (анонимный и такой же, но явный).
AVK>А зачем нужен анонимный, если уже есть явный?
Чтобы ради результата запроса не вводить новый класс.
Это точно так же как намного удобнее определить параметр функционального типа по месту:
Find[T](predicate : T -> bool) : IEnumerable[T];
а не описывать левый делегат, и потом использовать его в качестве параметра:
Хотя все же делегат ведь довольно компактная, не то что тип.
AVK>>> Для публичных контрактов вполне можно кортеж и явно описать.
VD>>Дык нельзя. Нет такой возможности. Можно только классы описывать.
AVK>А линковский кортеж это и есть банальный класс и ничто иное.
Не. ЛИНКовский анонимный тип — это урод кастрированный. Его не описать не использовать публично нельзя. Да и кортежем он не является. По крайней мере он явно не тянет на то что понимается под кортежами в ФЯ. В общем, это нечто странное. Некий сахар для упрощения синтаксиса запросов в ЛИНКе.
AVK> И в этом, кстати, одно из его полезных свойств, потому что другие реализации кортежей порождают код вроде x = tuple(0) или x = tuple.First вместо линковского x = tuple.X.
Серьезно? А я все по старинке декомпозицией пользуюсь.
def (a,b,c) = tuple;
Понимаеш ли, в чем дело... Если бы в МС взяли за основу нормальные кортежи, то им вообще изобретать велосипед не пришлось бы. Ведь их запросы просто кортежи и возвращали бы. Все было бы прозрачно.
В прочем я могу понять выбор именованных полей вместо позиционного доступа. Но я не могут понять почему я не погу описать тип типа. Это извините лажа и бред. И это им еще не раз аукнется. Булшит про нежелание менять рантайм пусть тоже своему начальству рассказвают. У них несколько лет было чтобы его изменить.
Единственное что они могут сделать, так это исправить эту лажу в одной из следующих версий С# введя таки возможность описывать эти типы.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
AVK>>Ну да. Но когда кортеж является частью публичного контракта, делать этого в любом случае не стоит.
VD>Почему не стоит? Потому что в C# нельзя, что ли?
Потому что контракт должен быть отделен от реализации, а по хорошему должен допускать множественные реализации одного котракта. А не как у МС — вот есть одна реализация XmlDocument, к примеру, и нифига ты с этим не поделаешь. Можно написать новую, но при этом все алгоритмы, рассчитаные на XmlDocument шатный идут лесом. Они сами на этом обожглись по полной программе с XLInQ.
AVK>> Остаются приватные, и, возможно, internal методы. Но в таком раскладе править рантайм нет нужды.
VD>Вообще-то в дотнете в метаданные экспортируются все описания вне зависимости от того являются ли они публичными или нет.
Да это заради бога. Совместимости при этом кортежей между сборками все равно не нужно. Анонимные методы, вон, тоже в метаданные попадают, однако это не означает что их можно статически использовать снаружи.
AVK>>А зачем нужен анонимный, если уже есть явный?
VD>Чтобы ради результата запроса не вводить новый класс.
Так он уже введен, зачем еще один вводить?
AVK>>А линковский кортеж это и есть банальный класс и ничто иное.
VD>Не. ЛИНКовский анонимный тип — это урод кастрированный. Его не описать не использовать публично нельзя.
Он для другого сделан.
VD> Да и кортежем он не является.
Он не является кортежом в том смысле, который ты ему присвоил. А вобще термин кортеж появился очень давно. Вектор-строка это тоже кортеж, и запись в таблице БД это тоже кортеж. И анонимный тип в шарпе это тоже кортеж, поскольку является как раз той сущностью, которая соответствует кортежу в источнике данных. Так что давай не будем переходить на спор о терминах.
VD> По крайней мере он явно не тянет на то что понимается под кортежами в ФЯ.
Разумеется. А этого никто и не утверждал.
VD> В общем, это нечто странное. Некий сахар для упрощения синтаксиса запросов в ЛИНКе.
Именно он и есть. То, что хочешь ты с текущей идеологией шарпа несовместимо. При разрешении анонимных типов нужно прежде всего разрешать вывод типов по последующему использованию и разрешение вывода в декларациях класса, а не только внутри метода. А это, в свою очередь, уже совершенно другой дизайн, нежели предложенный в новом шарпе. Ты конечно можешь сколько угодно осуждать авторов за дизайн целиком, но выдергивать одну фичу и думать, что ее можно было сделать совсем по другому, это не очень конструктивно.
Теперь что касается изменений фреймворка. Я тебе это уже говорил, но повторю — все не так просто, как ты думаешь. Это прежде всего промышленное программирование со своими заскоками. Есть ряд причин, по которым нельзя менять рантайм (и не все из них я могу публично озвучить). И не может команда C# по своему усмотрению вот так просто это решение отменить.
AVK>> И в этом, кстати, одно из его полезных свойств, потому что другие реализации кортежей порождают код вроде x = tuple(0) или x = tuple.First вместо линковского x = tuple.X.
VD>Серьезно? А я все по старинке декомпозицией пользуюсь.
Поздравляю. Только проблемы это не отменяет. Один черт ты эти abc каждый раз по новой объявляешь.
VD>Единственное что они могут сделать, так это исправить эту лажу в одной из следующих версий С# введя таки возможность описывать эти типы.
Насколько я в курсе, таких планов нет. Впрочем, я могу в очередной раз попинать товарищей из соответствующего тима. Но вряд ли от этого будет толк.
Здравствуйте, AndrewVK, Вы писали:
VD>>Почему не стоит? Потому что в C# нельзя, что ли?
AVK>Потому что контракт должен быть отделен от реализации, а по хорошему должен допускать множественные реализации одного котракта.
А, ну, это многое обясняет. Я уже понял, что если слышишь слово "контракт" то сейчас начнут обосновывать что-то страшеное.
Если серьезно, то я не понял причем тут реализация? Мы говорим о введении в язык типа данных который невозможнона этом языке описать (выразить). То есть компилятор этот тип может вывести из использования, но программист его поисать не в силах. Если же этот программист попробует получить описание с помощью рефлексии, то получит кучу деталей реализации — грязи то бишь.
AVK> А не как у МС — вот есть одна реализация XmlDocument, к примеру, и нифига ты с этим не поделаешь. Можно написать новую, но при этом все алгоритмы, рассчитаные на XmlDocument шатный идут лесом. Они сами на этом обожглись по полной программе с XLInQ.
Опять не понял причем тут кривое проектрование кокретной библиотеки. Вроде бы речь то шла о кривом проктировнии (точнее недоделанности) языка. Не уж то анонимные типы помогли бы XmlDocument спроектирвать лучше?
VD>>Чтобы ради результата запроса не вводить новый класс.
AVK>Так он уже введен, зачем еще один вводить?
Где это они введены? У меня каждый запрос может порождать отдельный класс. Точнее конечно кортеж. Или я буду вынужден делать классы заведомо избыточные и все время проверять заполненность полей. Или я вынжден клепать тонну левых классов (как компилятор). Что глупо.
VD>>Не. ЛИНКовский анонимный тип — это урод кастрированный. Его не описать не использовать публично нельзя.
AVK>Он для другого сделан.
Я в курсе. Еще мама учила не делать уродов ради частных случаев, а пытаться делать гормоничный дизайн. Вот этого я и не вижу. Причем не вижу причины зачем так делать.
VD>> Да и кортежем он не является.
AVK>Он не является кортежом в том смысле, который ты ему присвоил.
Точнее будет сказать в том смысле в ктором его принято употреблять в сообществе функциоальных программистов.
AVK> А вобще термин кортеж появился очень давно.
Он вообще-то из математики (реаляционной алгебры). Вот только там он имеет тип и его можно описать. Даже в БД записи можно описать (хотя и не всегда чисто). А тут получается тип есть, а описать его нельзя. Тлько вывести из использования. Не красыво как-то.
AVK>Вектор-строка это тоже кортеж,
Нет конечно. Не придумывай.
AVK> и запись в таблице БД это тоже кортеж.
Вот это да. Но ее таки мы может описать и создать без вывода типов.
AVK> И анонимный тип в шарпе это тоже кортеж, поскольку является как раз той сущностью, которая соответствует кортежу в источнике данных.
Не совсем. Точнее кострированный. Его нельзя создать и его нельзя описать. Ну, да я уже повтояюсь.
AVK> Так что давай не будем переходить на спор о терминах.
Давай. В МС назвали это анонимным типом. Это сооветствует этому делу и по сути, и по реализации. И перепутать с кортежами нельзя. Вот и давай придерживаться этой терминлогии. А когда они добавят возомжность описать этот анонимный тип, то можно будет обсудить его эфвивалентность кортежам из других ЯП.
AVK>Именно он и есть. То, что хочешь ты с текущей идеологией шарпа несовместимо.
Обоснуй.
AVK> При разрешении анонимных типов нужно прежде всего разрешать вывод типов по последующему использованию и разрешение вывода в декларациях класса, а не только внутри метода.
С кагого боку? Нужна возможность описать тип, а так же чтобы рантайм считал все типы с одинаковым описанием одинаковыми. И все! Никаких ограничений на вывод типо ненужно. Более того тогда появится возможность ипользовать их в языках где вобще нет вывода типов.
AVK>Ты конечно можешь сколько угодно осуждать авторов за дизайн целиком, но выдергивать одну фичу и думать, что ее можно было сделать совсем по другому, это не очень конструктивно.
Весьма странный и не обоснованный вывод.
AVK>Теперь что касается изменений фреймворка. Я тебе это уже говорил, но повторю — все не так просто, как ты думаешь.
На что я тебе отвечал, что справился бы за неделю сам лично.
AVK> Это прежде всего промышленное программирование со своими заскоками.
О! Оставл эти магические базворды для кого-то с более обвисшими ушами.
Меня больше интересуют доводы и файты.
AVK> Есть ряд причин, по которым нельзя менять рантайм (и не все из них я могу публично озвучить).
Это смешно. Ей богу.
AVK>И не может команда C# по своему усмотрению вот так просто это решение отменить.
Как я понял LINQ — это не просто проект команды C#. Да и средства ФП в Шарпе и Васике появляются точно не только для LINQ. Так что уж могли бы они как-нибудь между собой договориться. А если у них там есть капризные менеджеры которые как взбалмошные барашни заявляют "неть! не дадим кромсать рантайм", то это уже их личные проблемы. Кривизну половинчатого решения это не изменяет.
VD>>Серьезно? А я все по старинке декомпозицией пользуюсь.
AVK>Поздравляю. Только проблемы это не отменяет. Один черт ты эти abc каждый раз по новой объявляешь.
Хм. Дык в запросе это просто перечесление имен полей кторые я возращаю. Синтаксический сахар вроде LINQ-а может их сам задавать выводя из имен полей или из конструкций вроде SQL-ых "as".
VD>>Единственное что они могут сделать, так это исправить эту лажу в одной из следующих версий С# введя таки возможность описывать эти типы.
AVK>Насколько я в курсе, таких планов нет.
Тем хуже для них. Хотя судя по многозначительным словам из приведенной тут статьи "сумашедшего ученого" — "это остается предметом для дальнейших исследований" — похоже ребата из МС и сами все это понимают, и просто еще не нашли полностью подходящего решения. Возможно просто спорят.
AVK>Впрочем, я могу в очередной раз попинать товарищей из соответствующего тима. Но вряд ли от этого будет толк.
На самом деле, если все действительно так плохо, то пинать надо. Причем пинать обязательно и беспощадно. Ведь если есть шанс повлиять на плохое решение, то его обязательно надо использовать. Уверен, что мы не одни кто понимает, что такая половинчатасть — это плохо. Так что даже слабенький пинок может привести к сдвижке решения в правильную сторону.
Так что я лично бы пинал бы как только мог бы.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, nikov, Вы писали:
AVK>>О немерле. Проблема в появлении всяких tuple[6].
N>Да, сейчас можно только или через промежуточную переменную, или по индексу.
Еще как вариант кортеж можно передать методу с соотвествующим списком параметров что список полей кортежа.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
AVK>Вот с моей точки зрения это весьма ухудшает читаемость кода, бо все эти числовые константы при беглом взгляде ни о чем не говорят. Вон для шарпа тоже можно налепить комплект Tuple<T1..Tn>, только это не очень хорошее решение ИМХО.
Не очень хорошее решение — это на каждый чих создавать новый класс или использовать out/ref параметры. Сбаиндить тупл с локальными переменными не так смертельно.
... << RSDN@Home 1.2.0 alpha rev. 0>>
Если нам не помогут, то мы тоже никого не пощадим.
Здравствуйте, VladD2, Вы писали:
VD>А, ну, это многое обясняет. Я уже понял, что если слышишь слово "контракт" то сейчас начнут обосновывать что-то страшеное.
Демагогия.
VD>Если серьезно, то я не понял причем тут реализация? Мы говорим о введении в язык типа данных который невозможнона этом языке описать (выразить).
Анонимный тип это не новый тип данных, этосинтаксический сахар для создания класса.
VD> То есть компилятор этот тип может вывести из использования, но программист его поисать не в силах.
В случае, когда контракт отделен от реализации, мы не можем его вывести, потому что вывести можно только из реализации.
VD>Опять не понял причем тут кривое проектрование кокретной библиотеки.
См. выше.
AVK>>Так он уже введен, зачем еще один вводить?
VD>Где это они введены?
Еще раз. Если у нас уже есть явный класс, вводить еще один или описывать другой анонимный уже не нужно. Вот и вся мысль.
VD> У меня каждый запрос может порождать отдельный класс.
А может и не порождать. Если запрос выдается наружу, и контракт этой наружи уже описан, то кортежи не нужны. А вот вопрос генерации кортежа по контракту и генерации контракта по реализации это уже совсем другой вопрос.
Тут, в принципе, у меня есть две точки зрения. Первая, это мое мнение как, ну, скажем, практикующего архитекта. С этой стороны, как мне кажется, никакая зависимость контракта от реализации (а именно к такой зависимости приведет вывод типа кортежа на основании внутренности метода) не является приемлемой.
Вторая, это моя оценка такой фичи с точки зрения абстрактной "тотально агрессии с Марса". При таком раскладе я, наверное, вижу полезность кортежей вне внутренности метода. Но надо понимать, что, при сохранении собственно LInQ в языке, такие кортежи обязательно приведут к существенной ломке рантайма, прежде всего к появлению first class сущности. Решение вроде Nemerle ввиде заранее объявленных в библиотеке компиляторов набора туплов не прокатывает, потому что LInQ нормально жить без именованных элементов кортежа не может. Вопрос же изменения рантайма лежит за рамками компетенции создателей языка и обсуждать его надо именно в маркетологическом ракурсе.
VD> Точнее конечно кортеж. Или я буду вынужден делать классы заведомо избыточные
Насчет избыточности тоже не все так просто. К примеру, разметка для контракта сервисов WCF требует (при использовании родного для WCF форматтера) наличия на типах данных контракта атрибутов DataContract/DataMember. Будем вносить в синтаксис анонимных типов атрибутивную разметку?
AVK>>Он для другого сделан.
VD>Я в курсе. Еще мама учила не делать уродов ради частных случаев, а пытаться делать гормоничный дизайн. Вот этого я и не вижу. Причем не вижу причины зачем так делать.
То, что ты не видишь, еще не значит что их нет.
AVK>>Он не является кортежом в том смысле, который ты ему присвоил.
VD>Точнее будет сказать в том смысле в ктором его принято употреблять в сообществе функциоальных программистов.
У нас здесь не сообщество функциональных программистов.
VD>Он вообще-то из математики (реаляционной алгебры).
Совершенно верно.
VD> Вот только там он имеет тип и его можно описать. Даже в БД записи можно описать (хотя и не всегда чисто). А тут получается тип есть, а описать его нельзя.
Что такое в твоем понимании "описать"? И, кстати, в SQL DML кортеж можно только вывести. Частичное исключение составляет только CTE, да и то, типы элементов кортежа там указать нельзя, можно только имена.
AVK>> И анонимный тип в шарпе это тоже кортеж, поскольку является как раз той сущностью, которая соответствует кортежу в источнике данных.
VD>Не совсем.
Совсем.
VD> Точнее кострированный.
Нет такого понятия в математике.
AVK>>Именно он и есть. То, что хочешь ты с текущей идеологией шарпа несовместимо.
В следующем предложении обосновано. Ты для начала хотя бы абзац прочитывай целиком, а потом уж отвечай.
AVK>> При разрешении анонимных типов нужно прежде всего разрешать вывод типов по последующему использованию и разрешение вывода в декларациях класса, а не только внутри метода.
VD>С кагого боку?
А как ты выведешь типы?
VD> Нужна возможность описать тип, а так же чтобы рантайм считал все типы с одинаковым описанием одинаковыми. И все!
Такая возможность уже есть. Класс называется. Если ты скажешь, что его описание довольно избыточно, то я с тобой соглашусь. Но вопрос введения краткого синтаксиса (но с указанием типов!) описания класса это совсем другой вопрос. Вопрос совместимости разных описаний ввиде duck typing это третий вопрос.
AVK>>Теперь что касается изменений фреймворка. Я тебе это уже говорил, но повторю — все не так просто, как ты думаешь.
VD>На что я тебе отвечал, что справился бы за неделю сам лично.
А, ну ну. Значит МС не умеет софт писать.
AVK>> Это прежде всего промышленное программирование со своими заскоками.
VD>О! Оставл эти магические базворды для кого-то с более обвисшими ушами. VD>Меня больше интересуют доводы и файты.
Ну а ты сам включи голову и подумай. Факты такие:
1) О LInQ было публично объявлено в сентябре 2005. При этом на тот момент полагалось, что он выйдет летом 2006 ввиде отдельного продукта, не завязанного ни на рантайм, ни на студию.
2) Framework 3.0 вышел со старым рантаймом. Но при этом маркетологи вынуждены обозвать его именно 3.0, а не WinFX, как планировалось ранее.
3) Рантайм 2.0 интегрирован в Висту.
4) Летом 2006 было объявлено о привязке линка к Оркасу.
5) Оркас на тот момент планировался к выходу сразу после висты, т.е. в конце 2006 года.
6) В настоящий момент дата предполагаемого релиза Оркаса — конец 2007.
7) Дизайн C# 3.0 был зафиксирован в середине апреля 2006 (надеюсь, сей факт под NDA не попадает)
8) CLR team ничего не анонсировал с момента выпуска 2.0, но его никто не распускал
Свои логические рассуждения на базе этих фактов я приводить не буду. Из принципа.
VD>Как я понял LINQ — это не просто проект команды C#.
Неверно ты понял. Это личная инициатива Хейлсберга и Коробкина.
VD> Да и средства ФП в Шарпе и Васике появляются точно не только для LINQ.
Но как побочный продукт LInQ. Конечной целью был именно он. Об этом говорил в том числе и Хейлсберг.
VD> Так что уж могли бы они как-нибудь между собой договориться.
Видимо не могли. Видимо маркетинг важнее.
VD> А если у них там есть капризные менеджеры которые как взбалмошные барашни заявляют "неть! не дадим кромсать рантайм", то это уже их личные проблемы.
Так никто их проблемы тебе и не навязывает.
AVK>>Поздравляю. Только проблемы это не отменяет. Один черт ты эти abc каждый раз по новой объявляешь.
VD>Хм. Дык в запросе это просто перечесление имен полей кторые я возращаю.
Имена каждый раз нужно переобъявлять. Т.е., по сути, информация из семантики определения функции (имена элементов кортежей) перекочевывает в место использования этой функции. Вот простой пример из SQL:
SELECT * FROM MyTable
Здесь, в запросе, я нигде не указал количество, типы и имена элементов, но при этом результирующий рекордсет будет иметь вполне осмысленные имена колонок. ИМХО, это более естественно, чем вариант немерле.
VD> Синтаксический сахар вроде LINQ-а может их сам задавать выводя из имен полей или из конструкций вроде SQL-ых "as".
Здесь я обсуждал вариант Nemerle, а не гипотетический LInQ. То, что можно сделать лучше вообще, я как бы и не спорю.
VD>Тем хуже для них.
Ну да.
VD>Хотя судя по многозначительным словам из приведенной тут статьи "сумашедшего ученого" — "это остается предметом для дальнейших исследований"
Боюсь, слова этого "сумашедшего ученого" имеют исключительно рекомендательный характер. Те ребята, которые собственно решения принимают, говорят несколько иное. Хотя конечно все течет, все изменяется, и что будет через несколько лет вряд ли кто предскажет.
VD> Ведь если есть шанс повлиять на плохое решение, то его обязательно надо использовать.
Есть ли он в ситуации, когда дизайн языка утвержден? Может и есть, если вспомнить про nullable типы.
VD> Уверен, что мы не одни кто понимает, что такая половинчатасть — это плохо.
Здравствуйте, IT, Вы писали:
IT>Не очень хорошее решение — это на каждый чих создавать новый класс или использовать out/ref параметры. Сбаиндить тупл с локальными переменными не так смертельно.
Ну, скажем так, тут я с тобой не соглашусь. Но это уже отчасти вопрос вкусов и приоритетов.
Hi IT AVK>>def x = tup[1];
AVK>>Вот с моей точки зрения это весьма ухудшает читаемость кода, бо все эти числовые константы при беглом взгляде ни о чем не говорят. Вон для шарпа тоже можно налепить комплект Tuple<T1..Tn>, только это не очень хорошее решение ИМХО.
IT>Не очень хорошее решение — это на каждый чих создавать новый класс или использовать out/ref параметры. Сбаиндить тупл с локальными переменными не так смертельно.
В этом отношении мне нравиться как сделано в Питоне
(a,b)=Fun()
где a,b — локальные переменные. И перебор не надо.
Здравствуйте, ambel-vlad, Вы писали:
AV>В этом отношении мне нравиться как сделано в Питоне AV>
AV>(a,b)=Fun()
AV>
AV>где a,b — локальные переменные. И перебор не надо.
В Nemerle тоже можно так. Более того, с левой стороны можно использовать любой образец (pattern). Например, если на этапе компиляции известно, что второй элемент кортежа — список, то можно написать так:
Здравствуйте, AndrewVK, Вы писали:
AVK>Но надо понимать, что, при сохранении собственно LInQ в языке, такие кортежи обязательно приведут к существенной ломке рантайма, прежде всего к появлению first class сущности.
А в чём проблема создать внутренний паблик класс и выставить наружу его? Нужно только подумать о наименовании.
... << RSDN@Home 1.2.0 alpha rev. 0>>
Если нам не помогут, то мы тоже никого не пощадим.