[Nemerle] yield глючит
От: WolfHound  
Дата: 27.09.06 16:07
Оценка: +1
Вот такой код вышибает коспилятор в Internal compiler error
using System.IO;
using System.Collections.Generic;
using System.Console;

[Record]
variant Token
{
    public pos : int;
    public len : int;
    
    | Identifier { name : string; }
    
    | Operator { name : string }

    | Semicolon     // ;
    | Colon         // :
    | Comma
    | BeginBrace    // {
    | EndBrace      // }
    | BeginRound    // (
    | EndRound      // )

    | End
}

class Lexer
{
    public GetTokens(text : string) : IEnumerable[Token]
    {
        mutable pos = 0;
        def substr(start, e)
        {
            text.Substring(start, start - e)
        }
        def end()
        {
            pos >= text.Length
        }
        def isSpace(c)
        {
            c == ' ' || c == '\t' || c == '\n'
        }
        def skipSpaces()
        {
            while (!end() && isSpace(text[pos]))
                ++pos;
        }
        yield Token.End(pos, 0);
    }
}

module Test
{
    Main() : void
    {
        def lexer = Lexer();
        using (def file = File.OpenText("test.pcd"))
        {
            foreach(token in lexer.GetTokens(file.ReadToEnd()))
            {
            | Identifier(name) =>
                WriteLine(name);
            | End => break;
            }
        }
    }
}

Компилю Bootstrap'ом ревизия 6642
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>

30.01.07 18:13: Перенесено модератором из 'Декларативное программирование' — IT
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re: [Nemerle] yield глючит
От: ie Россия http://ziez.blogspot.com/
Дата: 27.09.06 18:01
Оценка:
Здравствуйте, WolfHound, Вы писали:

Глянул стэктрэйс, вышибает на одном из замыканий. Выяснил, что вышибает на skipSpaces(). Переписал так:

WH>
WH>using System.IO;
WH>using System.Collections.Generic;
WH>using System.Console;

using Nemerle.Imperative;


WH>[Record]
WH>variant Token
WH>{
        ...
WH>}

WH>class Lexer
WH>{
WH>    public GetTokens(text : string) : IEnumerable[Token]
WH>    {
WH>        mutable pos = 0;
WH>        def substr(start, e)
WH>        {
WH>            text.Substring(start, start - e)
WH>        }
            def skipSpaces()
            {
                    def end()
                    {
                            pos >= text.Length
                    }
                    def isSpace(c)
                    {
                            c == ' ' || c == '\t' || c == '\n'
                    }
                    while (!end() && isSpace(text[pos]))
                            ++pos;
            }
WH>        yield Token.End(pos, 0);
WH>    }
WH>}

WH>module Test
WH>{
WH>    Main() : void
WH>    {
WH>        def lexer = Lexer();
WH>        using (def file = File.OpenText("test.pcd"))
WH>        {
WH>            foreach(token in lexer.GetTokens(file.ReadToEnd()))
WH>            {
WH>            | Identifier(name) =>
WH>                WriteLine(name);
WH>            | End => break;
WH>            }
WH>        }
WH>    }
WH>}
WH>


Но баг имеет место быть, надо репортить.

Кстати, что до императива, то я первое время тоже все так и рвался впихнуть куда-нибудь break или return, вроде проходит. Вместо break сделал бы так:
    ret : 
    {
        foreach(token in lexer.GetTokens(file.ReadToEnd()))
        {
        | Identifier(name) =>
                WriteLine(name);
        | End => ret();
        }
        ()
 }

Но это конечно на любителя и используется как правило, если нужно вернуть значение, например:
def val = ret : 
{
  foreach(p in $[1..10])
  {
    when (p == 4)
      ret(true);
  }
  false
}
WriteLine($"$val");

Хотя в твоем случае break, безусловно, наглядней.
... << RSDN@Home 1.2.0 alpha rev. 655>>
Превратим окружающую нас среду в воскресенье.
Re: [Nemerle] yield глючит
От: VladD2 Российская Империя www.nemerle.org
Дата: 27.09.06 21:59
Оценка:
Здравствуйте, WolfHound, Вы писали:

WH>Вот такой код вышибает коспилятор в Internal compiler error


Если это не разные баги, то я его отловил чуть ранее:
http://nemerle.org/bugs/view.php?id=756

и он уже исправлен. Твой код вроде бы нормально компилируется но будет ли он работать я не знаю.

Кстати, там не хватает:
using Nemerle.Imperative;


ЗЫ

А зачем тебе лексер?
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: [Nemerle] yield глючит
От: chudo19  
Дата: 28.09.06 10:00
Оценка:
Здравствуйте, ie, Вы писали:

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




ie>Кстати, что до императива, то я первое время тоже все так и рвался впихнуть куда-нибудь break или return, вроде проходит. Вместо break сделал бы так:

ie>
ie>    ret : 
ie>    {
ie>        foreach(token in lexer.GetTokens(file.ReadToEnd()))
ie>        {
ie>        | Identifier(name) =>
ie>                WriteLine(name);
ie>        | End => ret();
ie>        }
ie>        ()
ie> }
ie>

ie>Но это конечно на любителя и используется как правило, если нужно вернуть значение, например:
ie>
ie>def val = ret : 
ie>{
ie>  foreach(p in $[1..10])
ie>  {
ie>    when (p == 4)
ie>      ret(true);
ie>  }
ie>  false
ie>}
ie>WriteLine($"$val");
ie>

ie>Хотя в твоем случае break, безусловно, наглядней.

А можно подробней что это за синтаксис
Re[3]: [Nemerle] yield глючит
От: Klapaucius  
Дата: 28.09.06 12:14
Оценка: +1
Здравствуйте, chudo19, Вы писали:

ie>>Но это конечно на любителя и используется как правило, если нужно вернуть значение, например:

ie>>
ie>>def val = ret : 
ie>>{
ie>>  foreach(p in $[1..10])
ie>>  {
ie>>    when (p == 4)
ie>>      ret(true);
ie>>  }
ie>>  false
ie>>}
ie>>WriteLine($"$val");
ie>>

ie>>Хотя в твоем случае break, безусловно, наглядней.
C>А можно подробней что это за синтаксис

Можно.
... << RSDN@Home 1.2.0 alpha rev. 655>>
'You may call it "nonsense" if you like, but I'VE heard nonsense, compared with which that would be as sensible as a dictionary!' (c) Lewis Carroll
Re[4]: [Nemerle] yield глючит
От: chudo19  
Дата: 28.09.06 12:24
Оценка:
Здравствуйте, Klapaucius, Вы писали:

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


ie>>>Но это конечно на любителя и используется как правило, если нужно вернуть значение, например:

ie>>>
ie>>>def val = ret : 
ie>>>{
ie>>>  foreach(p in $[1..10])
ie>>>  {
ie>>>    when (p == 4)
ie>>>      ret(true);
ie>>>  }
ie>>>  false
ie>>>}
ie>>>WriteLine($"$val");
ie>>>

ie>>>Хотя в твоем случае break, безусловно, наглядней.
C>>А можно подробней что это за синтаксис

K>Можно.


Ах да , тенкс
Re[2]: [Nemerle] yield глючит
От: WolfHound  
Дата: 28.09.06 15:36
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>и он уже исправлен. Твой код вроде бы нормально компилируется но будет ли он работать я не знаю.

Я все ужу без yield переписал.
Я еще нарвался на другую особенность... попытался написать так
                | Identifier as id1 :: Dot :: Identifier as id2 :: tokens =>

и получил кучу ругони от компилятора.
Обошол так
                | Identifier as id1 :: Dot :: tokens =>
                    match (tokens)
                    {
                    | Identifier as id2 :: tokens =>

Но это криво.

VD>А зачем тебе лексер?

Потом раскажу если получится.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[3]: [Nemerle] yield глючит
От: Vermicious Knid  
Дата: 28.09.06 16:09
Оценка:
Здравствуйте, WolfHound, Вы писали:

WH>Я еще нарвался на другую особенность... попытался написать так

WH>
WH>                | Identifier as id1 :: Dot :: Identifier as id2 :: tokens =>
WH>

WH>и получил кучу ругони от компилятора.
Попробуй так:
| (Identifier as id1) :: Dot :: (Identifier as id2) :: tokens =>
Re[3]: [Nemerle] yield глючит
От: VladD2 Российская Империя www.nemerle.org
Дата: 28.09.06 16:57
Оценка:
Здравствуйте, chudo19, Вы писали:

C>А можно подробней что это за синтаксис


А можно так безбожно не овреквотить при таких вопросоах? Неужели нельзя ограничиться одним примером или даже его частью?
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[4]: [Nemerle] yield глючит
От: WolfHound  
Дата: 28.09.06 17:49
Оценка:
Здравствуйте, Vermicious Knid, Вы писали:

VK>Попробуй так:

VK>
VK>| (Identifier as id1) :: Dot :: (Identifier as id2) :: tokens =>
VK>

Так работает. Но всеравно на багу смахивает.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[3]: [Nemerle] yield глючит
От: VladD2 Российская Империя www.nemerle.org
Дата: 28.09.06 22:50
Оценка:
Здравствуйте, WolfHound, Вы писали:

WH>Обошол так

WH>
WH>                | Identifier as id1 :: Dot :: tokens =>
WH>                    match (tokens)
WH>                    {
WH>                    | Identifier as id2 :: tokens =>
WH>

WH>Но это криво.

Напиши в конфу или добавь баг-репорт.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[5]: [Nemerle] yield глючит
От: VladD2 Российская Империя www.nemerle.org
Дата: 28.09.06 22:50
Оценка:
Здравствуйте, WolfHound, Вы писали:

VK>>Попробуй так:

VK>>
VK>>| (Identifier as id1) :: Dot :: (Identifier as id2) :: tokens =>
VK>>

WH>Так работает. Но всеравно на багу смахивает.

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