Re[3]: Баги компиляции C# в проектах Nemerle
От: Ka3a4oK  
Дата: 19.05.11 20:19
Оценка: 51 (1)
Здравствуйте, VladD2, Вы писали:

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


H>>Я правильно понимаю, что тут catch секция пустая?


VD>В шарпе try — это стэйтмент. Он всегда должен возвращать void.


Покажу подробнее в чем разница:

На такой код С# ругается:

private int Foo()
{
  try
  {
    return 1;
  }
  catch
  {
  }
}


А такой пропускает:

private int Foo()
{
  while(true)
    try
    {
      return 1;
    }
    catch
    {
    }
}


Немерлу код не нравится в любом случае.
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Re[5]: Баги компиляции C# в проектах Nemerle
От: Ka3a4oK  
Дата: 20.05.11 14:03
Оценка: +1
VD>Думаю, что все же в конце должен быть ретон:
VD>
VD>private int Foo()
VD>{
VD>  while(true)
VD>    try
VD>    {
VD>      return 1;
VD>    }
VD>    catch
VD>    {
VD>    }
VD>  return 0;
VD>}
VD>


Ну что значит нужен? Код ниже — релаьно компилирующийся C# код. Такой код генерируется утилитой slice из пакета ICE компании http://www.zeroc.com/. И такого кода там полно. Каждый раз исправлять сгенерированный код неприкольно. А если у нас вдруг изменились данные из которых код генерирется — опять исправлять?

private int Foo()
{
  while(true)
    try
    {
      return 1;
    }
    catch
    {
    }
}
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Re[4]: Баги компиляции C# в проектах Nemerle
От: hardcase Пират http://nemerle.org
Дата: 23.05.11 18:04
Оценка: :)
Здравствуйте, Ka3a4oK, Вы писали:
KK>На такой код С# ругается:

KK>
KK>private int Foo()
KK>{
KK>  try
KK>  {
KK>    return 1;
KK>  }
KK>  catch
KK>  {
KK>  }
KK>}
KK>


KK>А такой пропускает:


KK>
KK>private int Foo()
KK>{
KK>  while(true)
KK>    try
KK>    {
KK>      return 1;
KK>    }
KK>    catch
KK>    {
KK>    }
KK>}
KK>


KK>Немерлу код не нравится в любом случае.


Такой код писали настоящие индейцы
Я подумаю, что можно сделать.
/* иЗвиНите зА неРовнЫй поЧерК */
Баги компиляции C# в проектах Nemerle
От: Ka3a4oK  
Дата: 18.05.11 19:10
Оценка:
1. Не подхватывается префик global:: при определении синнонимов нэймспэйсов.

using _System=global::System;


2.Если при компиляции файла возникают ошибки, я эти ошибки исправляю и запускаю компиляцию заново, то сообщения об исправленных ошибках по-прежнему остаются в окне Error list.

3. Не знаю баг это или нет, но наверно можно улучшить. Ругается на функции типа:

int Foo()
{
    try
    {
        ...
        return 1;
    }
    catch
    {
    }
    catch
    {
    }
}


Сообщение об ошибке:

Error: expected int, got void in function return value: void is not a subtype of int
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Re: Баги компиляции C# в проектах Nemerle
От: hardcase Пират http://nemerle.org
Дата: 18.05.11 19:24
Оценка:
Здравствуйте, Ka3a4oK, Вы писали:

KK>1. Не подхватывается префик global:: при определении синнонимов нэймспэйсов.


KK>
KK>using _System=global::System;
KK>


Компилятор Nemerle не умеет синонимов, так что global сейчас просто игнорируется.

KK>3. Не знаю баг это или нет, но наверно можно улучшить. Ругается на функции типа:


KK>
KK>int Foo()
KK>{
KK>    try
KK>    {
KK>        ...
KK>        return 1;
KK>    }
KK>    catch
KK>    {
KK>    }
KK>    catch
KK>    {
KK>    }
KK>}
KK>


KK>Сообщение об ошибке:


KK>
KK>Error: expected int, got void in function return value: void is not a subtype of int
KK>


Я правильно понимаю, что тут catch секция пустая?
/* иЗвиНите зА неРовнЫй поЧерК */
Re[2]: Баги компиляции C# в проектах Nemerle
От: Ka3a4oK  
Дата: 18.05.11 19:32
Оценка:
Здравствуйте, hardcase, Вы писали:

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


KK>>1. Не подхватывается префик global:: при определении синнонимов нэймспэйсов.


KK>>
KK>>using _System=global::System;
KK>>


H>Компилятор Nemerle не умеет синонимов, так что global сейчас просто игнорируется.

В смысле не умеет синнонимов? Если оставить using _System=System, без global, то все прекрасно работает. Насколько я понимаю global, это что-то типа C++ го :: перед std.

KK>>3. Не знаю баг это или нет, но наверно можно улучшить. Ругается на функции типа:


KK>>
KK>>int Foo()
KK>>{
KK>>    try
KK>>    {
KK>>        ...
KK>>        return 1;
KK>>    }
KK>>    catch
KK>>    {
KK>>    }
KK>>    catch
KK>>    {
KK>>    }
KK>>}
KK>>


KK>>Сообщение об ошибке:


KK>>
KK>>Error: expected int, got void in function return value: void is not a subtype of int
KK>>


H>Я правильно понимаю, что тут catch секция пустая?


Не совсем. Более подробный код:

int Foo()
{
while(true)
{
try
{
...
return res;
}
catch(...)
{
handleException(...);
}
}
}

Т.е. функция полюбому вернет что-то.
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Re[2]: Баги компиляции C# в проектах Nemerle
От: VladD2 Российская Империя www.nemerle.org
Дата: 19.05.11 19:59
Оценка:
Здравствуйте, hardcase, Вы писали:

H>Я правильно понимаю, что тут catch секция пустая?


В шарпе try — это стэйтмент. Он всегда должен возвращать void.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[4]: Баги компиляции C# в проектах Nemerle
От: VladD2 Российская Империя www.nemerle.org
Дата: 19.05.11 22:31
Оценка:
Здравствуйте, Ka3a4oK, Вы писали:

KK>А такой пропускает:


KK>
KK>private int Foo()
KK>{
KK>  while(true)
KK>    try
KK>    {
KK>      return 1;
KK>    }
KK>    catch
KK>    {
KK>    }
KK>}
KK>


KK>Немерлу код не нравится в любом случае.


Думаю, что все же в конце должен быть ретон:
private int Foo()
{
  while(true)
    try
    {
      return 1;
    }
    catch
    {
    }
  return 0;
}
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[6]: Баги компиляции C# в проектах Nemerle
От: VladD2 Российская Империя www.nemerle.org
Дата: 20.05.11 16:33
Оценка:
Здравствуйте, Ka3a4oK, Вы писали:

KK>Ну что значит нужен? Код ниже — релаьно компилирующийся C# код. Такой код генерируется утилитой slice из пакета ICE компании http://www.zeroc.com/. И такого кода там полно. Каждый раз исправлять сгенерированный код неприкольно. А если у нас вдруг изменились данные из которых код генерирется — опять исправлять?


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

Надо спросить у Хардкейса.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[5]: Баги компиляции C# в проектах Nemerle
От: WolfHound  
Дата: 23.05.11 18:18
Оценка:
Здравствуйте, hardcase, Вы писали:

H>Такой код писали настоящие индейцы

H>Я подумаю, что можно сделать.
Думаю что если ты сматчишь while(true), do/while(true), for(...;true;...) и for(...;;...) это покроет все сценарии.
Хотя конечно нужно заглянуть в стандарт и посмотреть что там сказано по поводу свертки константных выражений в данном случае.
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[6]: Баги компиляции C# в проектах Nemerle
От: VladD2 Российская Империя www.nemerle.org
Дата: 23.05.11 18:42
Оценка:
Здравствуйте, WolfHound, Вы писали:

WH>Хотя конечно нужно заглянуть в стандарт и посмотреть что там сказано по поводу свертки константных выражений в данном случае.


+1
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[5]: Баги компиляции C# в проектах Nemerle
От: Ka3a4oK  
Дата: 23.05.11 19:16
Оценка:
Вот более подробный код:

        private SomeResultType SomeFunction(.... // тут аргументы, bool explicitContext__)
        {
                        ... //Тут немного кода
            while(true)
            {
                Ice.ObjectDel_ delBase__ = null;
                try
                {
                                        ... //И еще чуть-чуть кода
                    return SomeFunction();
                }
                catch(IceInternal.LocalExceptionWrapper ex__)
                {
                    handleExceptionWrapper__(delBase__, ex__);
                }
                catch(Ice.LocalException ex__)
                {
                    handleException__(delBase__, ex__, true, ref cnt__);
                }
            }
        }


Это не рукописный код, а сгенерированный.
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Re[4]: Баги компиляции C# в проектах Nemerle
От: i1yich  
Дата: 25.05.11 10:37
Оценка:
Здравствуйте, Ka3a4oK, Вы писали:

KK>
KK>private int Foo()
KK>{
KK>  while(true)
KK>    try
KK>    {
KK>      return 1;
KK>    }
KK>    catch
KK>    {
KK>    }
KK>}
KK>


KK>Немерлу код не нравится в любом случае.


Хотел сделать что-то подобное на Nemerle с использованием именованных блоков, но следующий код тоже не прокатывает:
    private SomeMethod(): int {
        return: 
        {
          while (true) 
              try {
                  return(1)
              }
              catch {
                  | ex is Exception => {}
              }
        }
    }


Тут проблема видимо в том, что while раскрывается в локальную функцию, результат которой приводится к void, и этот тип выводится в качестве типа блока return.
Re[5]: Баги компиляции C# в проектах Nemerle
От: VladD2 Российская Империя www.nemerle.org
Дата: 25.05.11 15:44
Оценка:
Здравствуйте, i1yich, Вы писали:

I>Хотел сделать что-то подобное на Nemerle с использованием именованных блоков, но следующий код тоже не прокатывает:

I>
I>    private SomeMethod(): int {
I>        return: 
I>        {
I>          while (true) 
I>              try {
I>                  return(1)
I>              }
I>              catch {
I>                  | ex is Exception => {}
I>              }
I>        }
I>    }
I>


I>Тут проблема видимо в том, что while раскрывается в локальную функцию, результат которой приводится к void, и этот тип выводится в качестве типа блока return.


Рукописный вариант на Немерле будет выглядеть так:
def loop()
{
  try 
  {
    1
  }
  catch { _ => loop() }
}
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[5]: Баги компиляции C# в проектах Nemerle
От: VladD2 Российская Империя www.nemerle.org
Дата: 25.05.11 15:51
Оценка:
Здравствуйте, hardcase, Вы писали:

H>Такой код писали настоящие индейцы

H>Я подумаю, что можно сделать.

Аналог на Н будет таким:
def loop()
{
  try 
  {
    1
  }
  catch { _ => loop() }
}


Похоже, что тут где-то ошибка в коде определения недоступного кода, потому как, если переписать пример:
private int Foo()
{
  while (true)
    try
    {
      return 1;
    }
    catch { }
}

так:
private int Foo()
{
  while (true)
    try
    {
      return 1;
    }
    catch { }

  return 0;
}

то все работает.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[6]: Баги компиляции C# в проектах Nemerle
От: VladD2 Российская Империя www.nemerle.org
Дата: 25.05.11 15:52
Оценка:
Здравствуйте, VladD2, Вы писали:

I>>Тут проблема видимо в том, что while раскрывается в локальную функцию, результат которой приводится к void, и этот тип выводится в качестве типа блока return.


100% — нет. В локальных функциях вроде while не обявляется блока для return. Тут дело не в этом. Думаю правильным ответом является этот
Автор: VladD2
Дата: 25.05.11
.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[7]: Баги компиляции C# в проектах Nemerle
От: i1yich  
Дата: 25.05.11 16:55
Оценка:
Здравствуйте, VladD2, Вы писали:

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


I>>>Тут проблема видимо в том, что while раскрывается в локальную функцию, результат которой приводится к void, и этот тип выводится в качестве типа блока return.


VD>100% — нет. В локальных функциях вроде while не обявляется блока для return. Тут дело не в этом. Думаю правильным ответом является этот
Автор: VladD2
Дата: 25.05.11
.


Да, в локальной функции while этот блок не объявляется, но я то его объявил как раз вокруг while. return — это не из Nemerle.Imperative, а просто название блока. while раскрывается в функцию имеющую тип void, и этот тип принимается типом блока return, поэтому у меня и не получается вернуть int.
Вот если после while поставить throw или какое-нибудь выражение int, то все работает.

    private SomeMethod(): int {
        {
          namedBlock: {
            while (true) 
            {
                namedBlock(1);
            }
            throw InvalidOperationException("Should not be here");
          }
        }
    }


Вот и вопрос в том, что меняется от того, что я добавляю недостижимый throw?
Re[6]: Баги компиляции C# в проектах Nemerle
От: i1yich  
Дата: 25.05.11 17:08
Оценка:
Здравствуйте, VladD2, Вы писали:

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



VD>Рукописный вариант на Немерле будет выглядеть так:

VD>
VD>def loop()
VD>{
VD>  try 
VD>  {
VD>    1
VD>  }
VD>  catch { _ => loop() }
VD>}
VD>


Да, так достаточно лаконично, но если требуется по разному обрабатывать разные типы исключений как в примере у топикстартера, то понадобится делать внутри catch вложенный match:

    private SomeMethod(): int {
        
        def tryGetValue() {
              try {
                  1
              }
              catch {
                  | ex => match(ex) {
                    | _ is ArgumentException => { /* try handle */ }
                    | _  => { /* try handle */ } 
                  }
                  tryGetValue()
              }
        }
 
        tryGetValue()
    }
Re[7]: Баги компиляции C# в проектах Nemerle
От: VladD2 Российская Империя www.nemerle.org
Дата: 25.05.11 17:19
Оценка:
Здравствуйте, i1yich, Вы писали:

I>Да, так достаточно лаконично, но если требуется по разному обрабатывать разные типы исключений как в примере у топикстартера, то понадобится делать внутри catch вложенный match:

    private SomeMethod(): int
    {
        def tryGetValue()
        {
              try
              {
                  1
              }
              catch
              {
                  | _ is ArgumentException => { /* try handle */ } tryGetValue()
                  | _  => { /* try handle */ } tryGetValue()
              }
        }
 
        tryGetValue()
    }
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[8]: Баги компиляции C# в проектах Nemerle
От: VladD2 Российская Империя www.nemerle.org
Дата: 25.05.11 17:20
Оценка:
Здравствуйте, i1yich, Вы писали:

VD>>100% — нет. В локальных функциях вроде while не обявляется блока для return. Тут дело не в этом. Думаю правильным ответом является этот
Автор: VladD2
Дата: 25.05.11
.


I>Вот и вопрос в том, что меняется от того, что я добавляю недостижимый throw?


Если прочесть внимательно мое сообщение по ссылке, то можно заметить, что я сказал о том, что это ошибка в коде выявления недостижимого кода, т.е. ошибка в компиляторе.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[8]: Баги компиляции C# в проектах Nemerle
От: i1yich  
Дата: 25.05.11 17:48
Оценка:
Здравствуйте, VladD2, Вы писали:

Вообще, если рассуждать в стиле nemerle, то что локальная функция, что while(true) — суть эвфемизмы того, что хочет выразить разработчик этим блоком. А наиболее выразительным был бы гипотетический макрос retry, который бы переписывал подобный try-блок
    private SomeMethod(): int {
        try {
            1 
        }
        catch {
            | _ => retry
        }
    }


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