match, всего лишь предупреждение??
От: artelk  
Дата: 16.09.13 23:01
Оценка:
variant FooBar
{
    | Foo
    | Bar
}

module Program
{
    Main() : void
    {
        def x : FooBar = FooBar.Foo();

        match(x) // <-- warning : matching is not exhaustive, example unmatched value: Foo
        {
            | Bar => WriteLine("Bar");
        }
        
        _ = ReadLine();
    }
}


Падает в рантайме.
Имхо, если Nemerle позиционируется, как строготипизированный язык, то тут должна быть ошибка.
Re: match, всего лишь предупреждение??
От: Don Reba Канада https://stackoverflow.com/users/49329/don-reba
Дата: 16.09.13 23:14
Оценка:
Здравствуйте, artelk, Вы писали:

A>Имхо, если Nemerle позиционируется, как строготипизированный язык, то тут должна быть ошибка.


Не вижу связи. Строгая типизация, это когда к объекту позволяют обращаться только через интерфейс соответствующий его типу. Питон и Руби, к примеру, строго типизированы.
Ce n'est que pour vous dire ce que je vous dis.
Re: match, всего лишь предупреждение??
От: hi_octane Беларусь  
Дата: 17.09.13 00:45
Оценка: +1
A>Падает в рантайме.
A>Имхо, если Nemerle позиционируется, как строготипизированный язык, то тут должна быть ошибка.

Тут аналогично случаю с, например, кодом в котором может случиться NullReferenceException при каких-то входных значениях. Если ты можешь гарантировать логикой выше, что в match FooBar.Foo никогда не придёт — то ничего не свалится. Если не можешь — внемли предупреждению и напиши обработчик и для ветки | Foo.
Re[2]: match, всего лишь предупреждение??
От: artelk  
Дата: 17.09.13 05:16
Оценка:
Здравствуйте, Don Reba, Вы писали:

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


A>>Имхо, если Nemerle позиционируется, как строготипизированный язык, то тут должна быть ошибка.


DR>Не вижу связи. Строгая типизация, это когда к объекту позволяют обращаться только через интерфейс соответствующий его типу. Питон и Руби, к примеру, строго типизированы.


Я имел ввиду статически типизирован. Т.е. чтоб ошибки, сделанные по невнимательности, выявлял на этапе компиляции. Думаю, паттерн-матчинг это случай, где лучше получить ошибку компиляции. Кому нужно пусть явно укажут _=>...
Re[2]: match, всего лишь предупреждение??
От: artelk  
Дата: 17.09.13 05:20
Оценка:
Здравствуйте, hi_octane, Вы писали:

_>Тут аналогично случаю с, например, кодом в котором может случиться NullReferenceException при каких-то входных значениях.

Именно. http://www.infoq.com/presentations/Null-References-The-Billion-Dollar-Mistake-Tony-Hoare
Re[3]: match, всего лишь предупреждение??
От: artelk  
Дата: 17.09.13 06:12
Оценка:
Здравствуйте, artelk, Вы писали:

A>Кому нужно пусть явно укажут _=>...


Плюс хотелось бы, чтоб поддерживался синтаксис "для ленивых":

match(x)
{
 | A => ...
 | B => ...
 | _ => throw //пусть компилятор сам сочинит текст сообщения
}
Re[3]: match, всего лишь предупреждение??
От: catbert  
Дата: 17.09.13 07:33
Оценка:
Здравствуйте, artelk, Вы писали:

A>Я имел ввиду статически типизирован. Т.е. чтоб ошибки, сделанные по невнимательности, выявлял на этапе компиляции. Думаю, паттерн-матчинг это случай, где лучше получить ошибку компиляции. Кому нужно пусть явно укажут _=>...


Он и выявил. А кто игнорирует варнинги, ССЗБ.

Имхо, компилятор должен падать с ошибкой только тогда, когда неясно какой код генерировать. А здесь все ясно.

Все известные мне языки с ПМ допускают неполный матчинг, генерят только ошибки.
Re[4]: match, всего лишь предупреждение??
От: catbert  
Дата: 17.09.13 07:35
Оценка:
Здравствуйте, catbert, Вы писали:

>ошибки.


варнинги, лол
Re[4]: match, всего лишь предупреждение??
От: Аноним  
Дата: 17.09.13 07:47
Оценка:
Здравствуйте, catbert, Вы писали:

C>Все известные мне языки с ПМ допускают неполный матчинг, генерят только ошибки.


Все доказательные языки генерят ошибку.
Re[5]: match, всего лишь предупреждение??
От: Аноним  
Дата: 17.09.13 08:11
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Все доказательные языки генерят ошибку.


Кстати из за этого они процентов на 10-20 быстрее и раз 5 многословнее.
Re: match, всего лишь предупреждение??
От: _NN_ www.nemerleweb.com
Дата: 17.09.13 08:28
Оценка:
Здравствуйте, artelk, Вы писали:

А здесь должна быть ошибка или нет ?

using System;
using System.Console;

variant FooBar
{
    | Foo
    | Bar
}

module Program
{
    F() : bool { true }

    Main() : void
    {
        def x : FooBar = FooBar.Foo();

        match(x)
        {
            | Foo when F() => WriteLine("Foo");
            | Foo when !F() => WriteLine("Foo");
            | Bar when F() => WriteLine("Bar");
            | Bar when !F() => WriteLine("Bar");
        }
        
        _ = ReadLine();
    }
}
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[2]: match, всего лишь предупреждение??
От: artelk  
Дата: 17.09.13 09:38
Оценка:
Здравствуйте, _NN_, Вы писали:

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


_NN>А здесь должна быть ошибка или нет ?


_NN>
_NN>    F() : bool { true }
_NN>


Отвечу "не должна" и ты поменяешь F(), чтобы возвращалось случайное значение, так?
Re[3]: match, всего лишь предупреждение??
От: Аноним  
Дата: 17.09.13 10:34
Оценка:
Здравствуйте, artelk, Вы писали:

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


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


_NN>>А здесь должна быть ошибка или нет ?


_NN>>
_NN>>    F() : bool { true }
_NN>>


A>Отвечу "не должна" и ты поменяешь F(), чтобы возвращалось случайное значение, так?


В агде замена на случайное не помогла бы.
Re[3]: match, всего лишь предупреждение??
От: _NN_ www.nemerleweb.com
Дата: 17.09.13 11:02
Оценка:
Здравствуйте, artelk, Вы писали:

A>Отвечу "не должна" и ты поменяешь F(), чтобы возвращалось случайное значение, так?

Предлагаете компилятору анализировать вызовы методов ?
Проще уж ошибку выдать, чтобы вставить "_" на всякий случай.
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[4]: match, всего лишь предупреждение??
От: artelk  
Дата: 17.09.13 11:54
Оценка:
Здравствуйте, _NN_, Вы писали:

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


A>>Отвечу "не должна" и ты поменяешь F(), чтобы возвращалось случайное значение, так?

_NN>Предлагаете компилятору анализировать вызовы методов ?
_NN>Проще уж ошибку выдать, чтобы вставить "_" на всякий случай.

Предлагаем использовать в when только чистые функции, дабы избежать взрыва мозга и, например, позволить компилятору соптимизировать так:
match(x)
{
 | Foo => if(F()) WriteLine("Foo") else WriteLine("Foo");
 | Bar => if(F()) WriteLine("Bar") else WriteLine("Bar");
}

Вроде оно сейчас так и оптимизируется, не?
Re: match, всего лишь предупреждение??
От: hardcase Пират http://nemerle.org
Дата: 17.09.13 15:42
Оценка:
Здравствуйте, artelk, Вы писали:

A>Имхо, если Nemerle позиционируется, как строготипизированный язык, то тут должна быть ошибка.


ncc -warnaserror+ ...
/* иЗвиНите зА неРовнЫй поЧерК */
Re[5]: match, всего лишь предупреждение??
От: hardcase Пират http://nemerle.org
Дата: 17.09.13 15:44
Оценка: +1
Здравствуйте, artelk, Вы писали:

A>Предлагаем использовать в when только чистые функции, дабы избежать взрыва мозга и, например, позволить компилятору соптимизировать так:


Конечно, теперь останется всего ничего — добавить анализ чистоты функции
/* иЗвиНите зА неРовнЫй поЧерК */
Re[6]: match, всего лишь предупреждение??
От: _NN_ www.nemerleweb.com
Дата: 17.09.13 16:29
Оценка:
Здравствуйте, hardcase, Вы писали:

H>Конечно, теперь останется всего ничего — добавить анализ чистоты функции


Посему проще требовать написать | _ => ...
Может все же не так плохо если в match требовать явно вариант "не подошло" в определенных случаях ?
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[4]: match, всего лишь предупреждение??
От: artelk  
Дата: 17.09.13 16:31
Оценка:
Здравствуйте, catbert, Вы писали:

C>Имхо, компилятор должен падать с ошибкой только тогда, когда неясно какой код генерировать. А здесь все ясно.


Не согласен. При доступе к приватным полям чужих классов тоже может быть понятно, какой код генерировать (в .NET через рефлексию, в C++ — вообще такой же код, как и при доступе к паблик полям).
Однако компиляторы выдают ошибку.
Re[6]: match, всего лишь предупреждение??
От: artelk  
Дата: 17.09.13 16:39
Оценка:
Здравствуйте, hardcase, Вы писали:

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


A>>Предлагаем использовать в when только чистые функции, дабы избежать взрыва мозга и, например, позволить компилятору соптимизировать так:


H>Конечно, теперь останется всего ничего — добавить анализ чистоты функции


100% гарантий не требуется. К приватным полям можно через рефлексию обратится, но это же не значит, что "все делаем public — один фиг гарантий нет".
Если кто будет делать побочные эффекты, то ССЗБ.

Вопрос к знатокам: делает ли сейчас компилятор оптимизацию, минимизирующую операции "is\as Foo" и выкидывающую лишний вызов F()?
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.