as/is
От: nikov США http://www.linkedin.com/in/nikov
Дата: 19.02.07 13:38
Оценка:
В чем разница между паттернами:
| int as x => ...
и
| x is int => ...
?
Re: as/is
От: nikov США http://www.linkedin.com/in/nikov
Дата: 19.02.07 13:55
Оценка:
Здравствуйте, nikov, Вы писали:

N>В чем разница между паттернами:


Кажется, я разобрался. В таком виде первый паттерн вообще делает не то, что ожидается. int здесь толкуется как имя переменной.
А вот если поставить вместо int опцию варианта, то, видимо, оба паттерна работают одинаково. Я прав?
Re[2]: as/is
От: Vermicious Knid  
Дата: 19.02.07 14:12
Оценка: 6 (1)
Здравствуйте, nikov, Вы писали:

N>Кажется, я разобрался. В таком виде первый паттерн вообще делает не то, что ожидается. int здесь толкуется как имя переменной.

Да.
N>А вот если поставить вместо int опцию варианта, то, видимо, оба паттерна работают одинаково. Я прав?
Нет.
// ok
| Some.Variant(2 as n) as something => ...
// error, Some.Variant(n) is not a legal type expression
| x is Some.Variant(n) => ...
Re[3]: as/is
От: nikov США http://www.linkedin.com/in/nikov
Дата: 19.02.07 14:36
Оценка: +1
Здравствуйте, Vermicious Knid, Вы писали:

VK>Нет.


Ага, понял.

variant V {
    | A
    | B { N : object }

    Foo(x : V) : void {
        | V.A as a => ...
        | V.B(s is string) as b => ...
    }
}


В последней строке is нельзя переписать через as, а as нельзя переписать через is. Верно?
Re: as/is
От: VladD2 Российская Империя www.nemerle.org
Дата: 19.02.07 15:37
Оценка: 1 (1) +2
Здравствуйте, nikov, Вы писали:

N>В чем разница между паттернами:
| int as x => ...
и
| x is int => ...
?


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

is — это динамическая проверка типа.
as — это алис для паттерна. В дайнном случае паттерн это просто переменная. С ней сопоставляется всеп что угодно. Например, следующий код:
def a = "Вать машу!";
match (a)
{
    | int as x => WriteLine(x);
    | _ => ()
}

выведет в консоль "Вать машу!".

Я уже задолбался объяснять Кмилу что это грабли. Михаль в свое время согласился со мной что это грабли, но уже видимо забыл.

Короче надо дожимать ребят и или вообще запрещать создавать перменные с именами пересекающимися с типами (по-моему, лучший выход) или хотя бы запрещать это в алиасах вводимых через as. Любой C#-программист без проблем воспримит конструкцию "х as y" за приведение типов в стиле C#. Так что это серьезнешие грабли!

Наличие варнингов "a value bound in pattern int was never used" и "this match clause is unused" не может быть оправданием, так как они только введут в заблуждение неподготовленного программиста.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: as/is
От: nikov США http://www.linkedin.com/in/nikov
Дата: 19.02.07 16:31
Оценка: +1
Здравствуйте, VladD2, Вы писали:

VD>Короче надо дожимать ребят и или вообще запрещать создавать перменные с именами пересекающимися с типами (по-моему, лучший выход) или хотя бы запрещать это в алиасах вводимых через as. Любой C#-программист без проблем воспримит конструкцию "х as y" за приведение типов в стиле C#. Так что это серьезнешие грабли!


Я согласен, что это — проблема, и ее надо как-то решать.
Как минимум, желательно объявить алиасы простых типов (int, string) ключевыми словами, и запретить использовать их в качестве идентификаторов без префикса @. Тем более, что void уже себя так ведет.
Мне кажется, близкая тема (о завязанности семантики на регистр идентификаторов) поднята в http://nemerle.org/bugs/view.php?id=827.
Re[3]: as/is
От: VladD2 Российская Империя www.nemerle.org
Дата: 19.02.07 19:00
Оценка:
Здравствуйте, nikov, Вы писали:

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


VD>>Короче надо дожимать ребят и или вообще запрещать создавать перменные с именами пересекающимися с типами (по-моему, лучший выход) или хотя бы запрещать это в алиасах вводимых через as. Любой C#-программист без проблем воспримит конструкцию "х as y" за приведение типов в стиле C#. Так что это серьезнешие грабли!


N>Я согласен, что это — проблема, и ее надо как-то решать.

N>Как минимум, желательно объявить алиасы простых типов (int, string) ключевыми словами, и запретить использовать их в качестве идентификаторов без префикса @. Тем более, что void уже себя так ведет.

Согласен. Вот толко Камила надо в этом убедить. А мой английский не позволяет это следать. Я просто перенапрягаюсь и бросаю что либо доказывать (слишком много времени у меня занимает писать по англицки).

N>Мне кажется, близкая тема (о завязанности семантики на регистр идентификаторов) поднята в http://nemerle.org/bugs/view.php?id=827.


В данном случае это вроде как не напрягает. Лично я не сделал подобных ошибок не разу. Но возможно я довольно много писал на С++ и привык не допускать подобных ошибк.

Тогда уж хорошо бы подумать и о полно запрете на переопределение идентификаторов. Или введении для этого специльаного ключевого слова вроде redef или reuse. Ведь явное переопределение — это не страшно. Важно, что бы человек по ошибке этого не делел.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[4]: as/is
От: nikov США http://www.linkedin.com/in/nikov
Дата: 20.02.07 10:13
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Согласен. Вот толко Камила надо в этом убедить. А мой английский не позволяет это следать. Я просто перенапрягаюсь и бросаю что либо доказывать (слишком много времени у меня занимает писать по англицки).


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