Локальная функция с дженерик-параметром
От: Ka3a4oK  
Дата: 06.09.11 19:13
Оценка:
Почему во втором случае возникает ошибка?

module Program
{
    fun1[T]():T where T:new()
    {
        T()
    }
    
  Main() : void
  {
      def fun2[T]():T where T:new()
        {
            T()
        }
          
        def t1=fun1.[int](); //ok
        def t2=fun2.[int](); //Error: don't know how to apply generic specifier to fun2.[?]
  }
}
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Re: Локальная функция с дженерик-параметром
От: VladD2 Российская Империя www.nemerle.org
Дата: 06.09.11 19:31
Оценка:
Здравствуйте, Ka3a4oK, Вы писали:

KK>Почему во втором случае возникает ошибка?


Похоже на баг. Добавь в исью.

Обходной маневр прост. Не указывай параметры типов явно. Потому, видимо, никто раньше и не нарывался.

А вообще, по моим наблюдениям, появление параметров типов у локальных функций указывает на не очень качественное проектирование, или на не очень качественное разнесение кода по модулям. Раз функция обобщенная, то ее место в библиотеке, так как обобщение делается явно не для однократного использования.

Ну, а локальные функции — это средство декомпозиции и инкапсуляции реализации методов.

Так что у меня давно зреет желание запретить обобщенные локальные функции.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: Локальная функция с дженерик-параметром
От: hardcase Пират http://nemerle.org
Дата: 06.09.11 19:34
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Так что у меня давно зреет желание запретить обобщенные локальные функции.


+1
Все равно вывод типов для них нормально не работает.
/* иЗвиНите зА неРовнЫй поЧерК */
Re[2]: Локальная функция с дженерик-параметром
От: Ka3a4oK  
Дата: 06.09.11 19:39
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Здравствуйте, Ka3a4oK, Вы писали:


KK>>Почему во втором случае возникает ошибка?


VD>Похоже на баг. Добавь в исью.


VD>Обходной маневр прост. Не указывай параметры типов явно. Потому, видимо, никто раньше и не нарывался.

Не получится. Там внутри функции другой класс типизируется дженерик параметром. А функция вообще без параметров.

VD>А вообще, по моим наблюдениям, появление параметров типов у локальных функций указывает на не очень качественное проектирование, или на не очень качественное разнесение кода по модулям. Раз функция обобщенная, то ее место в библиотеке, так как обобщение делается явно не для однократного использования.

Там совсем частный функционал. В библиотеке он не нужен. Я просто сделал ее нелокальной.

VD>Ну, а локальные функции — это средство декомпозиции и инкапсуляции реализации методов.


VD>Так что у меня давно зреет желание запретить обобщенные локальные функции.

Не надо. Пусть будут. Реально иногда бывает полезно.
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Re[3]: Локальная функция с дженерик-параметром
От: hardcase Пират http://nemerle.org
Дата: 06.09.11 19:46
Оценка:
Здравствуйте, Ka3a4oK, Вы писали:

VD>>Так что у меня давно зреет желание запретить обобщенные локальные функции.

KK>Не надо. Пусть будут. Реально иногда бывает полезно.

С этого места подробнее. Эти юзкейзы неочевидны.
/* иЗвиНите зА неРовнЫй поЧерК */
Re[4]: Локальная функция с дженерик-параметром
От: Ka3a4oK  
Дата: 06.09.11 19:52
Оценка:
Здравствуйте, hardcase, Вы писали:

H>Здравствуйте, Ka3a4oK, Вы писали:


VD>>>Так что у меня давно зреет желание запретить обобщенные локальные функции.

KK>>Не надо. Пусть будут. Реально иногда бывает полезно.

H>С этого места подробнее.

Ну вот мне понадобилось Завтра если будет время, напишу модель кода в котором мне это понадобилось.

H>Эти юзкейзы неочевидны.

Это первое что пришло мне в голову, т.е. для меня это было очевидно.
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Re[3]: Локальная функция с дженерик-параметром
От: VladD2 Российская Империя www.nemerle.org
Дата: 07.09.11 00:59
Оценка:
Здравствуйте, Ka3a4oK, Вы писали:

KK>Не получится. Там внутри функции другой класс типизируется дженерик параметром. А функция вообще без параметров.


Причем тут внутри функции? Я про место применения. В параметры типа ты же int передаешь?

KK>Там совсем частный функционал. В библиотеке он не нужен. Я просто сделал ее нелокальной.


Если он частный, то почему у него параметры типов? Частный он же предполагает однократное применение. А параметры типов сразу предполагают многократное применение.

Можно поглядеть на этот код более детально?

VD>>Ну, а локальные функции — это средство декомпозиции и инкапсуляции реализации методов.


VD>>Так что у меня давно зреет желание запретить обобщенные локальные функции.

KK>Не надо. Пусть будут. Реально иногда бывает полезно.

Откровенно говоря не очень согласен. Но удалять конечно будем только если будет общее согласие по этому вопросу.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re: Локальная функция с дженерик-параметром
От: _nn_ www.nemerleweb.com
Дата: 07.09.11 07:02
Оценка:
Здравствуйте, Ka3a4oK, Вы писали:

Сколько будет "фича" — столько и будут задаваться вопросом:
Issue 661
Issue 838
Issue 916
Issue 1335

Либо выкинуть, либо чинить.

Кто-то чинить имеет желание ?
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[4]: Локальная функция с дженерик-параметром
От: Don Reba Канада https://stackoverflow.com/users/49329/don-reba
Дата: 19.11.11 06:14
Оценка:
Здравствуйте, hardcase, Вы писали:

VD>>>Так что у меня давно зреет желание запретить обобщенные локальные функции.

KK>>Не надо. Пусть будут. Реально иногда бывает полезно.

H>С этого места подробнее. Эти юзкейзы неочевидны.


Например, удобно делать так:

def stringBuilder = StringBuilder();
def Append['T](fragment) { _ = stringBuilder.Append(fragment) }
Ce n'est que pour vous dire ce que je vous dis.
Re[5]: Локальная функция с дженерик-параметром
От: hardcase Пират http://nemerle.org
Дата: 19.11.11 09:22
Оценка:
Здравствуйте, Don Reba, Вы писали:

DR>Например, удобно делать так:


DR>
DR>def stringBuilder = StringBuilder();
DR>def Append['T](fragment) { _ = stringBuilder.Append(fragment) }
DR>


Мимо...
def stringBuilder = StringBuilder();
def Append(fragment : object) { _ = stringBuilder.Append(fragment) }
/* иЗвиНите зА неРовнЫй поЧерК */
Re[6]: Локальная функция с дженерик-параметром
От: i1yich  
Дата: 30.11.11 17:53
Оценка:
Здравствуйте, hardcase, Вы писали:

H>Здравствуйте, Don Reba, Вы писали:


H>Мимо...

H>
H>def stringBuilder = StringBuilder();
H>def Append(fragment : object) { _ = stringBuilder.Append(fragment) }
H>


Но ведь у StringBuilder.Append много перегрузок, а если фрагмент всегда object, то будет использована одна и будет боксинг.
Re[7]: Локальная функция с дженерик-параметром
От: VladD2 Российская Империя www.nemerle.org
Дата: 30.11.11 18:21
Оценка:
Здравствуйте, i1yich, Вы писали:

H>>Мимо...

H>>
H>>def stringBuilder = StringBuilder();
H>>def Append(fragment : object) { _ = stringBuilder.Append(fragment) }
H>>


I>Но ведь у StringBuilder.Append много перегрузок, а если фрагмент всегда object, то будет использована одна и будет боксинг.


Можно добавить метод-расширениt вроде:
  public Append2[T](this builder : NStringBuilder, value : T) : void
  {
    _ = builder.Append(value.ToString())
  }

Он избавит от боксинга. Название мне только не нравится.

Можно даже в модуль Nemerle.Utility.NStringBuilderExtensions его добавить, чтобы все могли пользоваться.

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