Вывод типов в локальной функции и match по вариантам (баг?)
От: Дьяченко Александр Россия  
Дата: 23.09.07 09:50
Оценка: 6 (1)
Вывод типов в локальной функции и match по вариантам (баг?)

Не компилируется следующее:
public variant Variant
{
    | Option1
    | Option2
}

class Class1
{
    public Method(variants: list[Variant]): void
    {
        def loop(variants)
        {
            | Option1 :: [] => ()
            | _ => ()
        }
        
        loop(variants)
    }
}

Выдает следующие ошибки:
Error    1    unbound type name Option1    C:\Users\Александр\Documents\Visual Studio 2005\Projects\Test\NemerleWinApp\NemerleWinApp\Class1.n    21    8    NemerleWinApp
Error    2    in argument #1 (variants) of loop, needed a list.Cons[System.Object+], got list[NemerleWinApp.Variant]: Nemerle.Core.list is not a subtype of Nemerle.Core.list.Cons [simple require]    C:\Users\Александр\Documents\Visual Studio 2005\Projects\Test\NemerleWinApp\NemerleWinApp\Class1.n    25    5    NemerleWinApp

Исходя из 2 ошибки понятно что по match выводится что в параметре variants не может быть пустого списка, хотя это наверно не правильно, ведь в последний образец подходит и пустой список. Изменяем исходник следующим образом (см. выделенное):
public variant Variant
{
    | Option1
    | Option2
}

class Class1
{
    public Method(variants: list[Variant]): void
    {
        def loop(variants)
        {
            | Option1 :: [] => ()
            | [] => ()
            | _ => ()
        }
        
        loop(variants)
    }
}

Но и так тоже не компилируется. Ошибка:
Error    1    unbound type name Option1    C:\Users\Александр\Documents\Visual Studio 2005\Projects\Test\NemerleWinApp\NemerleWinApp\Class1.n    21    8    NemerleWinApp

Если же первый кусок изменить следующим образом (см. выделенное):
public variant Variant
{
    | Option1
    | Option2
}

class Class1
{
    public Method(variants: list[Variant]): void
    {
        def loop(variants: list[Variant])
        {
            | Option1 :: [] => ()
            | _ => ()
        }
        
        loop(variants)
    }
}

То все нормально компилируется.
Если match не в локальной функции, то тоже компилируется.
Так же компилируется если в первом куске Option1 заменить на Variants.Option1 (см. выделенное):
public variant Variant
{
    | Option1
    | Option2
}

class Class1
{
    public Method(variants: list[Variant]): void
    {
        def loop(variants)
        {
            | Variants.Option1 :: [] => ()
            | _ => ()
        }
        
        loop(variants)
    }
}

Это баг или я чего-то не понял?

ЗЫ. Моя версия что Option1 не считается variant option и из за этого в выводе типов что-то не срабатывает.
... << RSDN@Home 1.2.0 alpha rev. 761>>
Re: Вывод типов в локальной функции и match по вариантам (ба
От: Иванков Дмитрий Россия  
Дата: 23.09.07 12:08
Оценка: 12 (1)
Здравствуйте, Дьяченко Александр, Вы писали:

ДА>Вывод типов в локальной функции и match по вариантам (баг?)

[skipped]
ДА>ЗЫ. Моя версия что Option1 не считается variant option и из за этого в выводе типов что-то не срабатывает.

Неполное имя variant-а не дает информации для вывода типа, ограничения вида "у типа есть метод/вложенный класс/вариант с таким-то именем /и сигнатурой" не используются в выводе типов.
Как именно происходит вывод в данном случае и как поправить — надо смотреть.
К уже предложенным способам есть еще один — можно написать using Variant (эффект как при написании в матче Variant.Option1).
Re[2]: Вывод типов в локальной функции и match по вариантам
От: Дьяченко Александр Россия  
Дата: 23.09.07 13:09
Оценка:
Здравствуйте, Иванков Дмитрий, Вы писали:

ДА>>Вывод типов в локальной функции и match по вариантам (баг?)

ИД>[skipped]
ДА>>ЗЫ. Моя версия что Option1 не считается variant option и из за этого в выводе типов что-то не срабатывает.

ИД>Неполное имя variant-а не дает информации для вывода типа, ограничения вида "у типа есть метод/вложенный класс/вариант с таким-то именем /и сигнатурой" не используются в выводе типов.

ИД>Как именно происходит вывод в данном случае и как поправить — надо смотреть.

Почему тогда кусок №1 не компилируется с сообщением "unbound type name Option1", а кусок №2 компилируется, хотя тип локальной функции в куске №1 выводится правильно (вроде бы) и соответствует типу в куске №2.

Кусок №1:
public variant Variant
{
    | Option1
    | Option2
}

class Class1
{
    public Method(variants: list[Variant]): void
    {
        def loop(variants)
        {
            | Option1 :: [] => ()
            | [] => ()
            | _ => ()
        }
        
        loop(variants)
    }
}

Кусок №2:
public variant Variant
{
    | Option1
    | Option2
}

class Class1
{
    public Method(variants: list[Variant]): void
    {
        def loop(variants: list[Variant])
        {
            | Option1 :: [] => ()
            | _ => ()
        }
        
        loop(variants)
    }
}
... << RSDN@Home 1.2.0 alpha rev. 761>>
Re[3]: Вывод типов в локальной функции и match по вариантам
От: Иванков Дмитрий Россия  
Дата: 23.09.07 18:51
Оценка: 14 (1)
Здравствуйте, Дьяченко Александр, Вы писали:

ДА>Почему тогда кусок №1 не компилируется с сообщением "unbound type name Option1", а кусок №2 компилируется, хотя тип локальной функции в куске №1 выводится правильно (вроде бы) и соответствует типу в куске №2.


О, в багтрекере уже есть соответствующая запись #773, пока что статус фича, если кто починит — станет пофиксенным багом

Сейчас значит правило простое — если тип сразу задан или сделан using, то можно писать Option1, иначе — Variant.Option1.
Re[4]: Вывод типов в локальной функции и match по вариантам
От: VladD2 Российская Империя www.nemerle.org
Дата: 24.09.07 08:52
Оценка:
Здравствуйте, Иванков Дмитрий, Вы писали:

ДА>>Почему тогда кусок №1 не компилируется с сообщением "unbound type name Option1", а кусок №2 компилируется, хотя тип локальной функции в куске №1 выводится правильно (вроде бы) и соответствует типу в куске №2.


ИД>О, в багтрекере уже есть соответствующая запись #773, пока что статус фича, если кто починит — станет пофиксенным багом


ИД>Сейчас значит правило простое — если тип сразу задан или сделан using, то можно писать Option1, иначе — Variant.Option1.


Если не ошибаюсь это уже обсуждалось. Это недоработка вывода типов, т.е. это не баг, просто неудобное поведение. Авторы вроде как знают, но не считают проблему серьезной. Можете их еще раз токнуть. Может они исправят это дело.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.