Generic функции и optional parameters
От: nikov США http://www.linkedin.com/in/nikov
Дата: 26.05.11 23:36
Оценка:
Вот такой код не компилируется:

module M
{
  Main() : void 
  {
    def foo[T](y : T, x = []) // Error: in argument #2 (x), needed a list[int-], got list[T]: int is not a subtype of T [simple require]
    { 
      _ = y :: x;
    }
    
    foo(1);
  }
}


Это баг или так задумано?
Re: Generic функции и optional parameters
От: hardcase Пират http://nemerle.org
Дата: 27.05.11 07:04
Оценка:
Здравствуйте, nikov, Вы писали:

N>Это баг или так задумано?


Это ограничение компилятора. Для локальных генерик-функций нужно полностью указывать сигнатуру. Помимо этого, опциональные аргументы не могут содержать ничего сложнее литералов.
/* иЗвиНите зА неРовнЫй поЧерК */
Re[2]: Generic функции и optional parameters
От: nikov США http://www.linkedin.com/in/nikov
Дата: 27.05.11 18:09
Оценка:
Здравствуйте, hardcase, Вы писали:

H>Это ограничение компилятора. Для локальных генерик-функций нужно полностью указывать сигнатуру.


Попробовал, ничего не изменилось:
module M
{
  Main() : void 
  {
    def foo[T](y : T, x : list[T] = []) : void // Error: in argument #2 (x), needed a list[int-], got list[T]: int is not a subtype of T [simple require]
    { 
    }
    
    foo(1);
  }
}


H>Помимо этого, опциональные аргументы не могут содержать ничего сложнее литералов.


Вроде бы это ограничение только для top-level методов (т.к. для них значение по умолчанию надо сохранять в метаданные для взаимодействия с другими .NET языками). Например, такой код компилируется успешно:

module M
{
  Main() : void 
  {
    def foo[T](y : T, x : list[T] = []) : void // OK
    { 
        foo(y)
    }
  }
}
Re[3]: Generic функции и optional parameters
От: VladD2 Российская Империя www.nemerle.org
Дата: 27.05.11 18:28
Оценка:
Здравствуйте, nikov, Вы писали:

N>Вроде бы это ограничение только для top-level методов (т.к. для них значение по умолчанию надо сохранять в метаданные для взаимодействия с другими .NET языками). Например, такой код компилируется успешно:


Ага. По уму этот кусок надо переделывать. Ведь можно просто паковать выражение в функцию и подставлять ее вызов в месте вызова функции с необязательными параметрами. Ну, а в метаданных запоминать имя функции.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[4]: Generic функции и optional parameters
От: nikov США http://www.linkedin.com/in/nikov
Дата: 27.05.11 18:36
Оценка: +1
Здравствуйте, VladD2, Вы писали:

VD>Ага. По уму этот кусок надо переделывать. Ведь можно просто паковать выражение в функцию и подставлять ее вызов в месте вызова функции с необязательными параметрами. Ну, а в метаданных запоминать имя функции.


Да, примерно так сделано в Scala. Там можно использовать в качестве значения по умолчанию любое выражение, в т.ч. использующее значения предыдущих параметров. Было бы неплохо сделать такое в Nemerle. А при вызове из других языков можно было бы опускать только те параметры, дефолтные значения для которых можно записать в метаданные.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.