Re[12]: [Nemerle] The null coalescing operator
От: IT Россия linq2db.com
Дата: 02.10.06 15:48
Оценка:
Здравствуйте, ie, Вы писали:

IT>>Конечно, лучше выдавать вменяемые ошибки.

ie>+100, а то эти невменяемые отмазки компилятора уже напрягают.

Ну так займись Там поле не паханное. Всё равно с такой диагностикой ошибок как сейчас в релиз пускать компилятор рановато.

IT>>А ещё лучше, сделать самому приведение, если это возможно.

ie>Хмм. Какими правилами руководствоваться? Implicit и UpCast?

Я бы начал с рассмотрения частных случаев. Преобразование 5 к int? логично? Значит надо преобразовывать. И т.д.
Если нам не помогут, то мы тоже никого не пощадим.
Re[5]: [Nemerle] The null coalescing operator
От: VladD2 Российская Империя www.nemerle.org
Дата: 02.10.06 15:58
Оценка:
Здравствуйте, IT, Вы писали:

ie>>Ок.


IT>Теперь пора заняться '??='


Я бы не стал такое чудо вводить. Это только путать будет.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[7]: [Nemerle] The null coalescing operator
От: VladD2 Российская Империя www.nemerle.org
Дата: 02.10.06 15:58
Оценка:
Здравствуйте, IT, Вы писали:

IT>Нормальные задачи, например, отложенная инициализация свойст недефолтными значениями.


Это у тебя что свойство будет на ходу тип менять?

Единственное применение это:
def x : int? = null;
def x ::= 2;

что по-моему совершенно не очевидно и даже нелепо. В общем, я против такого.

Так:
def x : int? = null;
def x = x ?? 2;

понятнее, очевиднее и разницы практически никакой.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[7]: [Nemerle] The null coalescing operator
От: VladD2 Российская Империя www.nemerle.org
Дата: 02.10.06 15:58
Оценка:
Здравствуйте, IT, Вы писали:

IT>Если выражать через ??, то поведение должно быть примерно такое:


IT>
IT>mutable a;
IT>def b = a ?? { a = c; a };
IT>


Ты хоть сам то понял что написал? Я — нет.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[6]: [Nemerle] The null coalescing operator
От: VladD2 Российская Империя www.nemerle.org
Дата: 02.10.06 16:21
Оценка: +1
Здравствуйте, ie, Вы писали:

ie>Ну BaseType то есть, а значит как минимум IsSubclassOf или IsAssignableFrom достаточно просто реализуемы.


Реализуемо все. Но это надо реализовывать. Ладно видимо надо заняться.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[6]: [Nemerle] The null coalescing operator
От: VladD2 Российская Империя www.nemerle.org
Дата: 02.10.06 16:21
Оценка:
Здравствуйте, ie, Вы писали:

ie>Однока, спецификация C# так не считает, и в этом я с ней солидарен.

ie>
ie>int? p = null;
ie>int? q = null;
ie>if (p ?? q == 0); // тут мне 0 нафиг не нужен
ie>


Я незнаю что тебе "тут" не нужно. Но такой оператор не нужен никому. В нем просто нет смысла.


А вот где в спецификации C# такое написано мне было бы интересно поглядеть. Тыкни, плиз пальцем. Или процитируй.

А пока вот простенький тестик на C# 2.0:
using System;

class Program
{
    static void Main(string[] args)
    {
        int? a1 = null;
        int a2 = a1 ?? 2;
        Console.WriteLine(a2);
        Console.WriteLine((a1 ?? 2) == 2);
        Console.WriteLine((a1 ?? 2).GetType().FullName);
        a1 = 4;
        Console.WriteLine((a1 ?? 2) == 2);
        Console.WriteLine((a1 ?? 2).GetType().FullName);
    }
}

А вот его вывод:
2
True
System.Int32
False
System.Int32

Что-то мне не веритися, что в МС реализовали эту фичу не по спецификации.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[7]: [Nemerle] The null coalescing operator
От: ie Россия http://ziez.blogspot.com/
Дата: 02.10.06 16:35
Оценка:
Здравствуйте, VladD2, Вы писали:

ie>>
ie>>int? p = null;
ie>>int? q = null;
ie>>if (p ?? q == 0); // тут мне 0 нафиг не нужен
ie>>

VD>Я незнаю что тебе "тут" не нужно. Но такой оператор не нужен никому. В нем просто нет смысла.

Смысл можно найти во всем, но то что такой случай редкость, спорить не буду.

VD>А вот где в спецификации C# такое написано мне было бы интересно поглядеть. Тыкни, плиз пальцем. Или процитируй.


The type of the expression a ?? b depends on which implicit conversions are available between the types
of the operands. In order of preference, the type of a ?? b is A0, A, or B, where A is the type of a, B is the
type of b, and A0 is the type that results from removing the trailing ? modifier, if any, from A.
Specifically,
a ?? b is processed as follows:
• If A is not a nullable type or a reference type, a compile-time error occurs.
• If A is a nullable type and an implicit conversion exists from b to A0, the result type is A0. At run-time, a
is first evaluated. If a is not null, a is unwrapped to type A0, and this becomes the result. Otherwise, b is
evaluated and converted to type A0, and this becomes the result.
• Otherwise, if an implicit conversion exists from b to A, the result type is A. At run-time, a is first
evaluated. If a is not null, a becomes the result. Otherwise, b is evaluated and converted to type A, and
this becomes the result.

• Otherwise, if an implicit conversion exists from A0 to B, the result type is B. At run-time, a is first
evaluated. If a is not null, a is unwrapped to type A0 (unless A and A0 are the same type) and converted
to type B, and this becomes the result. Otherwise, b is evaluated and becomes the result.
Otherwise, a and b are incompatible, and a compile-time error occurs.


Т.е. если оператор применяется к 2-м nullable, то результатом всегда будет nullable.

VD>А пока вот простенький тестик на C# 2.0:

VD>
VD>        int? a1 = null;
VD>        int a2 = a1 ?? 2;
VD>        Console.WriteLine(a2);
VD>        Console.WriteLine((a1 ?? 2) == 2);
VD>        Console.WriteLine((a1 ?? 2).GetType().FullName);
VD>        a1 = 4;
VD>        Console.WriteLine((a1 ?? 2) == 2);
VD>        Console.WriteLine((a1 ?? 2).GetType().FullName);
VD>}
VD>

VD>А вот его вывод:
VD>
VD>2
VD>True
VD>System.Int32
VD>False
VD>System.Int32
VD>


Дык, тут как раз попадаем под 2-ой пункт, где B приводимо к A0, т.к. A == int?, A0 == int, B == int.

VD>Что-то мне не веритися, что в МС реализовали эту фичу не по спецификации.


Да нет, сам проверял, все по спецификации.
... << RSDN@Home 1.2.0 alpha rev. 655>>
Превратим окружающую нас среду в воскресенье.
Re[6]: [Nemerle] The null coalescing operator
От: IT Россия linq2db.com
Дата: 02.10.06 17:02
Оценка:
Здравствуйте, VladD2, Вы писали:

IT>>Теперь пора заняться '??='


VD>Я бы не стал такое чудо вводить. Это только путать будет.


А ?? не путает? Боюсь, что не путает только потому, что это уже есть в C#.
Если нам не помогут, то мы тоже никого не пощадим.
Re[8]: [Nemerle] The null coalescing operator
От: IT Россия linq2db.com
Дата: 02.10.06 17:05
Оценка:
Здравствуйте, VladD2, Вы писали:

IT>>Нормальные задачи, например, отложенная инициализация свойст недефолтными значениями.


VD>Это у тебя что свойство будет на ходу тип менять?


Это как У нас же статически типизированный язык. Недефолтное значит, что string может равняться не string.Empty, а "something else".

VD>Единственное применение это:

VD>
VD>def x : int? = null;
VD>def x ::= 2;
VD>

VD>что по-моему совершенно не очевидно и даже нелепо. В общем, я против такого.

Против такого я тоже против
Если нам не помогут, то мы тоже никого не пощадим.
Re[8]: [Nemerle] The null coalescing operator
От: IT Россия linq2db.com
Дата: 02.10.06 17:17
Оценка: +2
Здравствуйте, VladD2, Вы писали:

IT>>Если выражать через ??, то поведение должно быть примерно такое:


IT>>
IT>>mutable a;
IT>>def b = a ?? { a = c; a };
IT>>


VD>Ты хоть сам то понял что написал? Я — нет.


Все поняли, а он нет Ладно, специально для особо непонятливых примеры из жизни:

Nemerle.VsIntegration -> SourceTextManager, line 37-46:

private NemerleSource _source;
public  NemerleSource  Source
{
    get
    {
        if (_source == null)
            _source = (NemerleSource)_service.GetSource(TextLines);
        return _source;
    }
}

Или вот, например, NemerleProjectNode, line 137-145:

protected internal VSLangProj.VSProject VSProject
{
    get
    {
        if (_vsProject == null)
            _vsProject = new OAVSProject(this);
        return _vsProject;
    }
}

Пока я рефакторил C# проект таких мест было обнаружено вагон и маленькая тележка. Заменить это всё можно было на такое:

private NemerleSource _source;
public  NemerleSource  Source
{
    get { return _source ??= (NemerleSource)_service.GetSource(TextLines); }
}

Или вот, например, NemerleProjectNode, line 137-145:

protected internal VSLangProj.VSProject VSProject
{
    get { _vsProject ??= new OAVSProject(this); }
}

По-моему, более чем понятно что здесь происходит.
Если нам не помогут, то мы тоже никого не пощадим.
Re[9]: [Nemerle] The null coalescing operator
От: VladD2 Российская Империя www.nemerle.org
Дата: 02.10.06 22:19
Оценка:
Здравствуйте, IT, Вы писали:

VD>>Единственное применение это:

VD>>
VD>>def x : int? = null;
VD>>def x ::= 2;
VD>>

VD>>что по-моему совершенно не очевидно и даже нелепо. В общем, я против такого.

IT>Против такого я тоже против


Тут имелос в виду "def x ??= 2;"

Я решительно не понимаю что ты хочешь. По-моему идея оператора ??= — плохая идея.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[9]: [Nemerle] The null coalescing operator
От: VladD2 Российская Империя www.nemerle.org
Дата: 02.10.06 22:19
Оценка:
Здравствуйте, IT, Вы писали:
IT>
IT>private NemerleSource _source;
IT>public  NemerleSource  Source
IT>{
IT>    get { return _source ??= (NemerleSource)_service.GetSource(TextLines); }
IT>}
IT>

IT>Или вот, например, NemerleProjectNode, line 137-145:

IT>
IT>protected internal VSLangProj.VSProject VSProject
IT>{
IT>    get { _vsProject ??= new OAVSProject(this); }
IT>}
IT>

IT>По-моему, более чем понятно что здесь происходит.

Мне это решительно не нравится. Такое "сокращение" резко усложнит понимание. Оно не интуитивно. И практически ничего не дает. Так как таких пест впрограмме не много. Если тебе уж хочется автоматизировать подобные вещи, то лучше создай просто фукнцию типа:
AutoInit[T](var : ref T, creator : void) : T
    where T: class
{
    when (var == null)
        var = creator();
    
    var;
}

тогда хотя бы будет понятно что присходит и не будет лишней сущьности.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[7]: [Nemerle] The null coalescing operator
От: VladD2 Российская Империя www.nemerle.org
Дата: 02.10.06 22:19
Оценка:
Здравствуйте, IT, Вы писали:

IT>А ?? не путает? Боюсь, что не путает только потому, что это уже есть в C#.


?? интуитивно понятен и не создает странного побочного эффекта. В общем, я все болше и больше против такого расширения. Это идея от избытка возможностей. Совершенно лишняя, по-моему.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[8]: [Nemerle] The null coalescing operator
От: VladD2 Российская Империя www.nemerle.org
Дата: 02.10.06 22:19
Оценка:
Здравствуйте, ie, Вы писали:

ie>Смысл можно найти во всем, но то что такой случай редкость, спорить не буду.


Ну, так поясни мне его. А то я его не вижу в упор. Если речь идет не о nullable-типах, а о ссылочных, то это другое дело. Ты все равно это как частный случай обрабатываешь.

ie>Да нет, сам проверял, все по спецификации.


С Some() у тебя точно ерунда выходит, так как из него точно никаких неявных приведений типов нет. Так что это по любому ошибка.

В отношении nullable-типов что-то я пока торможу. Может ты и прав. Надо не спросони еще раз проанализировать.

Так что по крайней мере разберись с Some(x)/None().
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[10]: [Nemerle] The null coalescing operator
От: IT Россия linq2db.com
Дата: 02.10.06 23:18
Оценка: +1
Здравствуйте, VladD2, Вы писали:

VD>Мне это решительно не нравится. Такое "сокращение" резко усложнит понимание. Оно не интуитивно. И практически ничего не дает.


А '??' тебе нравится? Такое сокращение не резко усложняет понимание? Оно интуитивно? Практически что-то делает?

Боюсь, что у этого сокращения есть только один плюс — оно уже в C#, поэтому включение аналога в N не вызывает такого негодования. Стоило предложить, все покивали головами и тут же побежали его делать. '??=' при наличии '??' — это уже не так страшно, поверь мне. Если понимать, что такое первые два '??', то '=' проблем уже не вызывает. Впрочем, мне всё равно, но на реакцию, основанную исключительно на личных предпочтениях, посмотреть было забавно

VD>Так как таких пест впрограмме не много.


Ты их все сосчитал? Только в своём коде? Осталось только добавить, что это вообще плохой паттерн, назвать его бредом и заклеймить всех, кто его использует
... << RSDN@Home 1.2.0 alpha rev. 0>>
Если нам не помогут, то мы тоже никого не пощадим.
Re[8]: [Nemerle] The null coalescing operator
От: IT Россия linq2db.com
Дата: 02.10.06 23:33
Оценка:
Здравствуйте, VladD2, Вы писали:

IT>>А ?? не путает? Боюсь, что не путает только потому, что это уже есть в C#.


VD>?? интуитивно понятен




Нифига он не понятен. Ставил эксперименты над несколькими людьми. Ни один человек сходу интуитивно не понял. Ни один!

VD>и не создает странного побочного эффекта.


Как насчёт: '::=', '&=', '|=' и даже '='? Они тоже создают странные побочные эффекты?

VD>В общем, я все болше и больше против такого расширения. Это идея от избытка возможностей. Совершенно лишняя, по-моему.


Да ради бога, я и не настаиваю. Смешно только смотреть, как странные фичи от MS воспринимаются с открытым ртом, а такие же по странности, но другие отвергаются с негодованием. Если уж на то пошло, то хотя я и предложил добавить '??' в N, но шедевром этот оператор не считаю. А уж в N без короткого if — ?:, он вовсе нелогичен и ему там вообще делать нечего.
... << RSDN@Home 1.2.0 alpha rev. 0>>
Если нам не помогут, то мы тоже никого не пощадим.
Re[9]: [Nemerle] The null coalescing operator
От: ie Россия http://ziez.blogspot.com/
Дата: 03.10.06 09:03
Оценка:
Здравствуйте, VladD2, Вы писали:

ie>>Смысл можно найти во всем, но то что такой случай редкость, спорить не буду.


VD>Ну, так поясни мне его. А то я его не вижу в упор. Если речь идет не о nullable-типах, а о ссылочных, то это другое дело. Ты все равно это как частный случай обрабатываешь.


Например такой:

def GetValue(p) : int?
{
    // возвращаем зависимое от p значение
}
...
...
foreach (i in $[1..20])
  res = res ?? GetValue(i); // мож сделать оператор '=??' в догонку к '??' и '??=' ?  :)))


Ситуация конечно надуманная, но я не исключаю возможности ее возникновения. Аналогично с option.

VD>С Some() у тебя точно ерунда выходит, так как из него точно никаких неявных приведений типов нет. Так что это по любому ошибка.


Дык, из nullable тоже нет никаких неявных приведений.

VD>Так что по крайней мере разберись с Some(x)/None().


Я бы разобрался, но тоже не могу понять как правильно то надо?

Не зависимо от того является ли второй операнд option, возвращать Value? — А что тогда делать если оба None?
... << RSDN@Home 1.2.0 alpha rev. 0>>
Превратим окружающую нас среду в воскресенье.
Re[9]: [Nemerle] The null coalescing operator
От: ie Россия http://ziez.blogspot.com/
Дата: 03.10.06 09:05
Оценка:
Здравствуйте, IT, Вы писали:

IT>>>А ?? не путает? Боюсь, что не путает только потому, что это уже есть в C#.

VD>>?? интуитивно понятен
IT>
IT>Нифига он не понятен. Ставил эксперименты над несколькими людьми. Ни один человек сходу интуитивно не понял. Ни один!

Какого плана экспиримент? Только что спросил джависта, то ли у них там в джаве что-то похожее есть, но со второй попытки угадал. (Первая была: "какой-то муд@к полез ставить && в русской раскладке" )

VD>>В общем, я все болше и больше против такого расширения. Это идея от избытка возможностей. Совершенно лишняя, по-моему.

IT>Да ради бога, я и не настаиваю. Смешно только смотреть, как странные фичи от MS воспринимаются с открытым ртом, а такие же по странности, но другие отвергаются с негодованием. Если уж на то пошло, то хотя я и предложил добавить '??' в N, но шедевром этот оператор не считаю. А уж в N без короткого if — ?:, он вовсе нелогичен и ему там вообще делать нечего.

Эээ, а причем тут кототкий if?
... << RSDN@Home 1.2.0 alpha rev. 0>>
Превратим окружающую нас среду в воскресенье.
Re[10]: [Nemerle] The null coalescing operator
От: IT Россия linq2db.com
Дата: 03.10.06 12:09
Оценка: +1
Здравствуйте, ie, Вы писали:

ie>Эээ, а причем тут кототкий if?


При том, что ?? — это расширение оператора ?:, которого в N нет, т.е. пропущен один шаг эволюции
... << RSDN@Home 1.2.0 alpha rev. 0>>
Если нам не помогут, то мы тоже никого не пощадим.
Re[11]: [Nemerle] The null coalescing operator
От: ie Россия http://ziez.blogspot.com/
Дата: 03.10.06 12:34
Оценка:
Здравствуйте, IT, Вы писали:

ie>>Эээ, а причем тут кототкий if?

IT>При том, что ?? — это расширение оператора ?:, которого в N нет, т.е. пропущен один шаг эволюции

Ну прям, скажешь тоже.
... << RSDN@Home 1.2.0 alpha rev. 0>>
Превратим окружающую нас среду в воскресенье.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.