Nemerle: баг матчинга
От: PhantomIvan  
Дата: 20.09.06 10:47
Оценка:
такой код приводит к ошибке match failure exception

        [Accessor]
        mutable menus: list[char * string];
        
        PrintMenus(): void
        {
            def z = Menus.ToString();
            WriteLine(z);
            //Menus.Iter((c, s) => WriteLine($" $c - $s"));
        }


что-то он листом из туплов подавился
проверьте, если не в лом

запостите в багтрекер, у кого имеется доступ к оному
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>

30.01.07 18:16: Перенесено модератором из 'Декларативное программирование' — IT
Re: Nemerle: баг матчинга
От: PhantomIvan  
Дата: 20.09.06 11:18
Оценка:
ну, понял, в чем дело
я сам допустил ошибку

PI>
PI>        [Accessor]
PI>        mutable menus: list[char * string] = [];
PI>


вот так надо было, в конце концов, список это reference
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re: Nemerle: баг матчинга
От: Denis K.  
Дата: 20.09.06 11:23
Оценка:
Здравствуйте, PhantomIvan, Вы писали:

Сразу скажу, что я только начинаю изучать Nemerle, однако в последнем билде такое работает:


using System.Console;

class Test
{
        mutable menus: list[char * string];
        
        public PrintMenus(): void
        {
            menus = ('a', "some a") :: [];
            menus = menus.Append([('b', "some b")]);
            def z = menus.ToString();
            WriteLine(z);
            menus.Iter((c, s) => WriteLine($" $c - $s"));
        }
}

def t = Test();
t.PrintMenus ();
Re[2]: Nemerle: баг матчинга
От: VladD2 Российская Империя www.nemerle.org
Дата: 20.09.06 13:59
Оценка:
Здравствуйте, PhantomIvan, Вы писали:

PI>вот так надо было, в конце концов, список это reference


Ага. Но сообщение об ошибке конечно не фантан. Я даже видел код его вызвающий... Надо бы все же запостить. А то я тут один раз тоже долго не мог понять что происходит хот всего лишь в переменной был null.

Отладчик, гад, тоже информацию показывает не очень корректно. В сумме получаются проблемы на ровном месте.

ЗЫ

Кстати, только что попробовал твой код и он все же выдал System.NullReferenceException(). Так что или баг поправлен, или он возникает в более сложном случае.

Не мог бы ты привести полный пример выдающий ошибку о "Матчинге"?
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[3]: Nemerle: баг матчинга
От: PhantomIvan  
Дата: 21.09.06 07:00
Оценка:
VD>Отладчик, гад, тоже информацию показывает не очень корректно. В сумме получаются проблемы на ровном месте.
да, он во всем виновать!
теперь доверия к нему нет никакого почти

VD>Кстати, только что попробовал твой код и он все же выдал System.NullReferenceException(). Так что или баг поправлен, или он возникает в более сложном случае.

в более "сложном" случае, я ведь сначала добавлял пару элементов в список
и он, гад, по-тихому их добавлял к null-referenced списку (!!)
могу поклясться (не взорвется ), что он их таки добавлял
обратно привести код к исходному лень, но текущий выкладываю

VD>Не мог бы ты привести полный пример выдающий ошибку о "Матчинге"?

тута простой консоль-меню-ротатор, если кому понадобиться, буду тока рад
внимание! в коде ошибка "найди сам", которая и приводит к match exception
(что-то это фраза мне напоминает )

using System;
using System.Collections.Generic;
using System.Text;
using System.Console;
using Nemerle.Utility;

namespace KoLXo3
{
    class ConsoleMenuRotator
    {
        [Accessor]
        programName: string;
        
        public this(programName: string)
        {
            this.programName = programName;
        }
        
        [Accessor]
        mutable menus: list[char * string * (void -> void)];// = [];
        
        public Add(key: char, menu: string, handler: void -> void): void
        {
            menus += [(key, menu, handler)];
        }
        
        public Clear(): void
        {
            menus = [];
        }
        
        PrintMenus(): void
        {
            Menus.Iter((key, menu, _) => WriteLine($" $key - $menu"));
        }
        
        public Start(): void
        {
            WriteLine(programName);
            
            def rotate()
            {
                WriteLine("\nProgram menu:");
                PrintMenus();
                Write("Your choice [Enter - exit]: ");
                def s = ReadLine();
                when (s.Length > 0)
                {
                    WriteLine();
                    def pressed = s[0];
                    def choice = Menus.Find((key, _, _) => pressed == key);
                    match (choice)
                    {
                        | Some((_, name, handler)) =>
                            WriteLine($"Starting handler '$name'...");
                            handler();
                        | _ => ()
                    }
                    rotate();
                }
            }
            
            rotate();
        }
    }
}


как использовать ротатор
using System;
using System.Console;
using Nemerle.Utility;

namespace KoLXo3
{
    module Program
    {
        Main() : void
        {
            def manager = DownloadList();
            def rotator = ConsoleMenuRotator("KoLXo3 files downloader");
            rotator.Add('1', "Download index file", manager.DownloadIndex);
            rotator.Start();
        }
    }
}

тут уже отредактируете по вашему усмотрению

p.s. как найти ошибку
идете в строчку
        mutable menus: list[char * string * (void -> void)];// = [];

и меняете ее на
        mutable menus: list[char * string * (void -> void)] = [];
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[2]: Nemerle: баг матчинга
От: PhantomIvan  
Дата: 21.09.06 07:19
Оценка:
Здравствуйте, Denis K., Вы писали:

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


DK>Сразу скажу, что я только начинаю изучать Nemerle, однако в последнем билде такое работает:



DK>
DK>using System.Console;

DK>class Test
DK>{
DK>        mutable menus: list[char * string];
        
DK>        public PrintMenus(): void
DK>        {
DK>            menus = ('a', "some a") :: [];
DK>            menus = menus.Append([('b', "some b")]);
DK>            def z = menus.ToString();
DK>            WriteLine(z);
DK>            menus.Iter((c, s) => WriteLine($" $c - $s"));
DK>        }
DK>}

DK>def t = Test();
DK>t.PrintMenus ();
DK>


в том-то и дело, что Append работает
зато
::=
+=
не работают (т.к. используют матчинг)

зы. у тебя последний билд из свн-а или просто 9.3.0?
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[3]: Nemerle: баг матчинга
От: Denis K.  
Дата: 21.09.06 11:08
Оценка:
Здравствуйте, PhantomIvan, Вы писали:

PI>зы. у тебя последний билд из свн-а или просто 9.3.0?


у меня последний из svn:



class Test
{
        mutable menus: list[char * string];
        mutable menus2: list[char * string];
        mutable menus3: list[char * string];
     
        public PrintMenus(): void
        {
            menus = ('a', "some a") :: [];
            menus.Iter((c, s) => WriteLine($" $c - $s"));

            menus2 ::= ('a', "some a");
            menus2.Iter((c, s) => WriteLine($" $c - $s"));
 
            menus3 += [('a', "some a")];
            menus3.Iter((c, s) => WriteLine($" $c - $s"));
        }
}

def t = Test();
t.PrintMenus ();


результаты:

 a - some a
 a - some a

Unhandled Exception: Nemerle.Core.MatchFailureException: Exception of type 'Nemerle.Core.MatchFailureException' was thrown.
   at Nemerle.Collections.List.Iter['a](list`1 l, FunctionVoid`1 f)
   at Nemerle.Core.list`1.Iter(FunctionVoid`1 f)
   at Test.PrintMenus()
   at _N_AutoModule.Main()
Re[4]: Nemerle: баг матчинга
От: VladD2 Российская Империя www.nemerle.org
Дата: 21.09.06 13:30
Оценка:
Здравствуйте, PhantomIvan, Вы писали:

DownloadList не определен.

А нельзя пример попроще воспроизводящий эту ошибку? А то у меня что-то не получается его воспроизвести.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[4]: Nemerle: баг матчинга
От: VladD2 Российская Империя www.nemerle.org
Дата: 21.09.06 13:30
Оценка:
Здравствуйте, PhantomIvan, Вы писали:

VD>>Кстати, только что попробовал твой код и он все же выдал System.NullReferenceException(). Так что или баг поправлен, или он возникает в более сложном случае.

PI>в более "сложном" случае, я ведь сначала добавлял пару элементов в список
PI>и он, гад, по-тихому их добавлял к null-referenced списку (!!)
PI>могу поклясться (не взорвется ), что он их таки добавлял
PI>обратно привести код к исходному лень, но текущий выкладываю

А надо. Ведь если неясно как воспроизвести баг, то и исправить его не удатстя.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[4]: Nemerle: баг матчинга
От: VladD2 Российская Империя www.nemerle.org
Дата: 21.09.06 13:30
Оценка:
Здравствуйте, Denis K., Вы писали:

DK>у меня последний из svn:

DK>
DK>class Test
DK>{
DK>        mutable menus: list[char * string];
DK>        mutable menus2: list[char * string];
DK>        mutable menus3: list[char * string];
     
DK>        public PrintMenus(): void
DK>        {
DK>            menus = ('a', "some a") :: [];
DK>            menus.Iter((c, s) => WriteLine($" $c - $s"));

DK>            menus2 ::= ('a', "some a");
DK>            menus2.Iter((c, s) => WriteLine($" $c - $s"));
 
DK>            menus3 += [('a', "some a")];
DK>            menus3.Iter((c, s) => WriteLine($" $c - $s"));
DK>        }
DK>}

DK>def t = Test();
DK>t.PrintMenus ();
DK>


DK>результаты:


DK>
DK> a - some a
DK> a - some a

DK>Unhandled Exception: Nemerle.Core.MatchFailureException: Exception of type 'Nemerle.Core.MatchFailureException' was thrown.
DK>   at Nemerle.Collections.List.Iter['a](list`1 l, FunctionVoid`1 f)
DK>   at Nemerle.Core.list`1.Iter(FunctionVoid`1 f)
DK>   at Test.PrintMenus()
DK>   at _N_AutoModule.Main()
DK>


Хм. Странно. У меня из СВН-а (свежак) выдает MatchFailureException уже на ::=. Но все равно спасибо, за короткий пример демонстриующий ошибку.

Я добавил ее в багтрэкер. Так же я добавил запрос новой фичи — инициализацию (по умолчанию ) списоков значением [].
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[5]: Nemerle: баг матчинга
От: PhantomIvan  
Дата: 21.09.06 15:15
Оценка:
VD>А нельзя пример попроще воспроизводящий эту ошибку? А то у меня что-то не получается его воспроизвести.

это был пример не бага, а скорее меню ротатора
ну да неважно, сейчас приведу код в соседней ветке
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[5]: Nemerle: баг матчинга
От: PhantomIvan  
Дата: 21.09.06 15:15
Оценка:
VD>А надо. Ведь если неясно как воспроизвести баг, то и исправить его не удатстя.
самый простой вариант
using System;
using System.Console;

module Program
{
  Main() : void
  {
    def rotator = ConsoleMenuRotator();
    rotator.Add('1', "asdf");
    rotator.PrintMenus();
  }
}

    class ConsoleMenuRotator
    {
        mutable menus: list[char * string];// = [];
        
        public Add(key: char, menu: string): void
        {
            menus ::= (key, menu);
            //menus += [(key, menu)];
        }
        
        public PrintMenus(): void
        {
            menus.Iter((key, menu) => WriteLine($" $key - $menu"));
        }        
    }


этот мегакод добавляет к списку, представляющему из себя null элементы!
реально добавляет, потому что PrintMenus отрабатывает, выводит на экран " 1 asdf", и потом уже ломается
match exception
наверно надо warning типа use of unitialized variable
да и в рантайме не позволять добавлять элементы непонятно куда
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[6]: Nemerle: баг матчинга
От: VladD2 Российская Империя www.nemerle.org
Дата: 21.09.06 18:10
Оценка:
Здравствуйте, PhantomIvan, Вы писали:

PI>это был пример не бага, а скорее меню ротатора

PI>ну да неважно, сейчас приведу код в соседней ветке

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