Здравствуйте, VladD2, Вы писали:
VD>Здравствуйте, hardcase, Вы писали:
H>>Я правильно понимаю, что тут catch секция пустая?
VD>В шарпе try — это стэйтмент. Он всегда должен возвращать void.
Ну что значит нужен? Код ниже — релаьно компилирующийся C# код. Такой код генерируется утилитой slice из пакета ICE компании http://www.zeroc.com/. И такого кода там полно. Каждый раз исправлять сгенерированный код неприкольно. А если у нас вдруг изменились данные из которых код генерирется — опять исправлять?
1. Не подхватывается префик global:: при определении синнонимов нэймспэйсов.
using _System=global::System;
2.Если при компиляции файла возникают ошибки, я эти ошибки исправляю и запускаю компиляцию заново, то сообщения об исправленных ошибках по-прежнему остаются в окне Error list.
3. Не знаю баг это или нет, но наверно можно улучшить. Ругается на функции типа:
Здравствуйте, Ka3a4oK, Вы писали:
KK>1. Не подхватывается префик global:: при определении синнонимов нэймспэйсов.
KK>
KK>using _System=global::System;
KK>
Компилятор Nemerle не умеет синонимов, так что global сейчас просто игнорируется.
KK>3. Не знаю баг это или нет, но наверно можно улучшить. Ругается на функции типа:
KK>
Здравствуйте, 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>>
Здравствуйте, Ka3a4oK, Вы писали:
KK>Ну что значит нужен? Код ниже — релаьно компилирующийся C# код. Такой код генерируется утилитой slice из пакета ICE компании http://www.zeroc.com/. И такого кода там полно. Каждый раз исправлять сгенерированный код неприкольно. А если у нас вдруг изменились данные из которых код генерирется — опять исправлять?
Согласен — это баг. Просто я в начале не понял сути проблемы.
Вопрос в том насколько сложно будет его исправить. Тут семантика немерла и шарпа сильно расходятся.
Надо спросить у Хардкейса.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, hardcase, Вы писали:
H>Такой код писали настоящие индейцы H>Я подумаю, что можно сделать.
Думаю что если ты сматчишь while(true), do/while(true), for(...;true;...) и for(...;;...) это покроет все сценарии.
Хотя конечно нужно заглянуть в стандарт и посмотреть что там сказано по поводу свертки константных выражений в данном случае.
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Здравствуйте, WolfHound, Вы писали:
WH>Хотя конечно нужно заглянуть в стандарт и посмотреть что там сказано по поводу свертки константных выражений в данном случае.
+1
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Хотел сделать что-то подобное на Nemerle с использованием именованных блоков, но следующий код тоже не прокатывает:
private SomeMethod(): int {
return:
{
while (true)
try {
return(1)
}
catch {
| ex is Exception => {}
}
}
}
Тут проблема видимо в том, что while раскрывается в локальную функцию, результат которой приводится к void, и этот тип выводится в качестве типа блока return.
Здравствуйте, 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() }
}
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
I>>Тут проблема видимо в том, что while раскрывается в локальную функцию, результат которой приводится к void, и этот тип выводится в качестве типа блока return.
100% — нет. В локальных функциях вроде while не обявляется блока для return. Тут дело не в этом. Думаю правильным ответом является этот
Здравствуйте, VladD2, Вы писали:
VD>Здравствуйте, VladD2, Вы писали:
I>>>Тут проблема видимо в том, что while раскрывается в локальную функцию, результат которой приводится к void, и этот тип выводится в качестве типа блока return.
VD>100% — нет. В локальных функциях вроде while не обявляется блока для return. Тут дело не в этом. Думаю правильным ответом является этот
Да, в локальной функции 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?
Да, так достаточно лаконично, но если требуется по разному обрабатывать разные типы исключений как в примере у топикстартера, то понадобится делать внутри catch вложенный match:
Здравствуйте, i1yich, Вы писали:
I>Да, так достаточно лаконично, но если требуется по разному обрабатывать разные типы исключений как в примере у топикстартера, то понадобится делать внутри catch вложенный match:
Здравствуйте, i1yich, Вы писали:
VD>>100% — нет. В локальных функциях вроде while не обявляется блока для return. Тут дело не в этом. Думаю правильным ответом является этот
.
I>Вот и вопрос в том, что меняется от того, что я добавляю недостижимый throw?
Если прочесть внимательно мое сообщение по ссылке, то можно заметить, что я сказал о том, что это ошибка в коде выявления недостижимого кода, т.е. ошибка в компиляторе.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Вообще, если рассуждать в стиле nemerle, то что локальная функция, что while(true) — суть эвфемизмы того, что хочет выразить разработчик этим блоком. А наиболее выразительным был бы гипотетический макрос retry, который бы переписывал подобный try-блок