foreach(retarget-compiler)
От: vaa  
Дата: 20.01.22 08:02
Оценка:
странно. так и должно быть?
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);
}
☭ ✊ В мире нет ничего, кроме движущейся материи.
Re: foreach(retarget-compiler)
От: VladD2 Российская Империя www.nemerle.org
Дата: 25.01.22 20:12
Оценка: 6 (1)
Здравствуйте, 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);


А еще лучше не пользуйся этим баловством.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re: foreach(retarget-compiler)
От: VladD2 Российская Империя www.nemerle.org
Дата: 25.01.22 20:24
Оценка: 6 (1)
Здравствуйте, 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);
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.