Забавная ошибка компиляции
От: dsorokin Россия  
Дата: 20.04.10 11:46
Оценка:
Есть кусок кода, который приводит к ошибке компиляции

Test.n:10:16:10:31: error: expected System.Collections.Generic.IEnumerable[object+], got void in function return value: void is not a subtype of System.Collections.Generic.IEnumerable[object+]


Если поменять комментарий и убрать явную пропись IEnumerable[_] из сигнатуры функции f, то код заработает:

using System.Console;
using System.Collections.Generic;

public module Tester {

  public Test () : IEnumerable [int]
  {
    // def f ()
    def f () : IEnumerable [_]
    {
      for (mutable i = 0; i < 10; i ++)
      {
        yield i
      }
    }
    
    f ()
  }
}

foreach (i in Tester.Test())
{
  WriteLine (i)
}
Re: Забавная ошибка компиляции
От: Аноним  
Дата: 20.04.10 13:02
Оценка:
Здравствуйте, dsorokin, Вы писали:

D>Есть кусок кода, который приводит к ошибке компиляции


Это не ошибка компиляции, а ошибка автора куска кода

Оператор yield обозначает передачу управления из метода, а не из локальной функции. Такое поведение имеет смысл и осуществлено, так сказать, by design.

Жаль, компилятор не выдает предупреждения про yield-ы из локальных функций.
Re[2]: Забавная ошибка компиляции
От: Аноним  
Дата: 20.04.10 13:07
Оценка:
Но ошибка таки забавная, потому что показывает, как компилятор лучше справляется с типизацией, чем человек.

В будущем этот пример можно использовать в интервью на работу в транснациональных корпорациях, где, конечно же, вовсю будет использоваться Nemerle
Re[2]: Забавная ошибка компиляции
От: VladD2 Российская Империя www.nemerle.org
Дата: 20.04.10 13:22
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Жаль, компилятор не выдает предупреждения про yield-ы из локальных функций.


yield в локальных функциях тоже вполне легальны. Ведь те же циклы тоже переписываются в локальны функции.

Ошибки нужно выдвавать только на yield в локальных функциях которые не могут быть заинлайнены. Например, там гед имеет место не концевая рекурсия.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[3]: Забавная ошибка компиляции
От: VladD2 Российская Империя www.nemerle.org
Дата: 20.04.10 13:24
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Но ошибка таки забавная, потому что показывает, как компилятор лучше справляется с типизацией, чем человек.


Это как раз не странно. Человек думает высокоуровневыми абстракциями, а компилтор тупо выполняет заданный (хотя и хитрый) алгорит.

Достижением является скорее то когда чловек начинат думать о компилятор, что тот думает .
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.