странно. так и должно быть?
foreach(c when (c < 'J') in ['A' .. 'Z']) {
WriteLine(c);
}
I Unhandled exception. Nemerle.Core.MatchFailureException: Exception of type 'Nemerle.Core.MatchFailureException' was thrown. at main.Main()
а так не комплируется
foreach(e in [1 .. 10] with i) { // <= typing fails on finding the operator ..(int, int)
WriteLine(i + " " + e);
}
Здравствуйте, vaa, Вы писали:
vaa>странно. так и должно быть?
Unhandled exception. Nemerle.Core.MatchFailureException: Exception of type 'Nemerle.Core.MatchFailureException' was thrown.
Думаю, это ошибка оптимизации цикла с генератором.
Данный код раскрывается в:
Используй внешний:
foreach(c in $['A' .. 'Z'])
when (c < 'J')
WriteLine(c);
или замени $['A' .. 'Z'] на Enumerable.Range('A', 'Z')
Откровенно говоря подобное баловство только при играх с языком можно встретить. По этому никогда не проверялось.
vaa>а так не комплируется
vaa>vaa>foreach(e in [1 .. 10] with i) { // <= typing fails on finding the operator ..(int, int)
vaa> WriteLine(i + " " + e);
vaa>}
vaa>
Добавь $ перед [
foreach(e in $[1 .. 10] with i)
WriteLine(i + " " + e);
А еще лучше не пользуйся этим баловством.
Здравствуйте, vaa, Вы писали:
vaa>странно. так и должно быть?
vaa>vaa>foreach(c when (c < 'J') in ['A' .. 'Z']) {
vaa> WriteLine(c);
vaa>}
vaa>
vaa>vaa>I Unhandled exception. Nemerle.Core.MatchFailureException: Exception of type 'Nemerle.Core.MatchFailureException' was thrown. at main.Main()
Баг вот здесь:
https://github.com/rsdn/nemerle/blob/db4bc9078f1b6238da32df1519c1957e74b6834a/macros/ExpandListComprehension.n#L115
| <[ $pat in $[$first .. $last] ]>
| <[ $pat in [$first .. $last] ]> =>
Some (<[
mutable i = $first;
def last = $last;
mutable cond = i <= last;
mutable pre_last = last;
unchecked (pre_last--); // can't use (last - 1) since 1 might change/widen type
def overflowed = pre_last > last;
while (cond) {
def $pat = i;
if (overflowed)
cond = i >= pre_last;
else
cond = i <= pre_last;
unchecked (i++);
$acc;
}
]>)
Автор не предусмотрел случая с гуардом.
ListComprehensionHelper.ExpandRange() используется в макре foreach для оптимизации работы с компрехеншонами переписывая их в цикл.
https://github.com/rsdn/nemerle/blob/db4bc9078f1b6238da32df1519c1957e74b6834a/macros/core.n#L521
macro @foreach (inexpr, body)
syntax ("foreach", "(", inexpr, ")", body)
{
when (ListComprehensionHelper.ExpandRange(inexpr, body) is Some(expr))
return expr;
def (iter, collection, index) = ForeachModule.ParseInExpr(inexpr);