В ревизиях 9018 и 9019 появились новые макросы foreach / else, while / else.
Эти конструкции создают неоднозначность с if / else, что приводит к ломающим изменениям и заставляет писать лишние скобки.
Уверен, что конструкция:
if (x)
foreach (y in ys)
z(y);
else
someElse();
применяется чаше чем:
foreach (y in ys)
z(y);
else
someElse();
Может быть лучше сделать синтаксис другим? Например, можно сделать так:
foreach (y in ys)
z(y);
loop else
someElse();
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
VD>В ревизиях 9018 и 9019 появились новые макросы foreach / else, while / else. VD>Эти конструкции создают неоднозначность с if / else, что приводит к ломающим изменениям и заставляет писать лишние скобки.
Здравствуйте, VladD2, Вы писали:
VD>Здравствуйте, _nn_, Вы писали:
__>>Если otherwise нигде не занято, можно взять его.
VD>Оно используется в assertions.n, но по идее конфликтов быть не должно. Или они будут настолько редки, что этим можно пренебречь.
А если не секрет как можно создать там конфликт ?
У меня никак for/while/foreach не удается вписать в блок require.
Здравствуйте, VladD2, Вы писали:
VD>Здравствуйте, Mystic, Вы писали:
M>>
M>>foreach (y in ys)
M>> z(y);
M>>fiasco
M>> someElse();
M>>
VD>Это как из кроссворда: Слово из шести букв, вторая буква "и", означающее "крушение всех надежд". VD>
Ну да. Вообще-то я искал английский аналог для нашего родного "облом". Чтобы было с юмором (а это всегда лучше запоминается и лучше акцентируется). Плюс слово достаточно редкое, вряд ли я припомню хотя бы один идентификатор с таким именем. otherwise более официально.
Здравствуйте, VladD2, Вы писали:
VD>Здравствуйте, _nn_, Вы писали:
__>>А если не секрет как можно создать там конфликт ?
VD>Х.з. когда создастся, то сам увидишь .
__>>У меня никак for/while/foreach не удается вписать в блок require.
VD>А что этому мешает? Он не принимает void-выражения?
Да.
class A
{
public F(i : int) : int
requires ()
{
i
}
}
Error: expected bool, got void in matched value: the types void and bool are not compatible [simple unify]
А блок тоже нельзя вставить:
class A
{
public F(i : int) : int
requires { i > 1 }
{
i
}
}
Error: parse error near '{...}' group: expecting type declaration
Здравствуйте, VladD2, Вы писали:
VD>Здравствуйте, catbert, Вы писали:
C>>А что они делают и для чего понадобились?
VD>Мне кажется это ясно из подписи к комиту и прилагаемых тестов: VD>http://code.google.com/p/nemerle/source/detail?r=9018
то есть они делают совсем не то, что в питоне делают for-else (else-тело выполняется, если цикл не завершился break-ом) и while-else (выполняется, если цикл завершился по false == условие цикла), а выполняют else-тело, если основное тело не было вызвано ни разу. Все три варианта поведения мягко говоря не интуитивны. Как минимум, в документации должно быть отражено отличие от python.
Здравствуйте, Иванков Дмитрий, Вы писали:
ИД>Здравствуйте, VladD2, Вы писали:
VD>>Здравствуйте, catbert, Вы писали:
C>>>А что они делают и для чего понадобились?
VD>>Мне кажется это ясно из подписи к комиту и прилагаемых тестов: VD>>http://code.google.com/p/nemerle/source/detail?r=9018
ИД> то есть они делают совсем не то, что в питоне делают for-else (else-тело выполняется, если цикл не завершился break-ом) и while-else (выполняется, если цикл завершился по false == условие цикла), а выполняют else-тело, если основное тело не было вызвано ни разу. Все три варианта поведения мягко говоря не интуитивны. Как минимум, в документации должно быть отражено отличие от python.
Насчет break-ов действительно не подумал.
Доделать не сложно
Здравствуйте, _nn_, Вы писали:
__>Он прекрасно работает в коде и даже проходит тесты. __>Одна загвоздка в нем. Его нельзя использовать в макросах. __>Как всегда вопросы: кто виноват и что делать ?
Насколько мне известно в квази-цитатах используется все тот же парсер, так что по идее если код компилируется вне цитаты, то в цитате тоже должен. Так что надо смотреть под отладчиком что происходит.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, Иванков Дмитрий, Вы писали:
ИД> то есть они делают совсем не то, что в питоне делают for-else (else-тело выполняется, если цикл не завершился break-ом)
Э... а разве не в случае когда в коллекции нет элементов? Кстати, я бы еще хотел чтобы чтобы на null тоже else срабатывал.
ИД>и while-else (выполняется, если цикл завершился по false == условие цикла), а выполняют else-тело, если основное тело не было вызвано ни разу.
Тут я вообще ничего не понял. Мне казалось, то любой вид цикла должен вызвать else если основной цикл не сработал ни разу. Зачем еще какие-то "завершился по false == условие цикла"?
ИД>Все три варианта поведения мягко говоря не интуитивны. Как минимум, в документации должно быть отражено отличие от python.
В общем, я стал понимать еще меньше чем в начале. Можно объяснить все более подробно и доступно (для тех кто с Питоном не на "ты")?
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.