Перегрузка ()
От: _NN_ www.nemerleweb.com
Дата: 04.01.13 16:24
Оценка:
в процессе разработки NemerleWeb возникла необходимость перегрузки ().
Также был не раз задан вопрос на эту тему: operator(), operator()
Автор: catbert
Дата: 03.08.10
.

Реализовал данный функционал, работает следующим образом:

class A
{
  public static @()(a : A, x : int) : int { x + 1 }
}

def a = A();
a(10); // в процессе компиляции заменяется на A.@()(a, 10)


Компилятор собирается, тесты все проходят.

Что думаете ?
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re: Перегрузка ()
От: hardcase Пират http://nemerle.org
Дата: 04.01.13 16:29
Оценка:
Здравствуйте, _NN_, Вы писали:

_NN>Что думаете ?


Жесть
Щас набижит Влад и закидает какашками
/* иЗвиНите зА неРовнЫй поЧерК */
Re: Перегрузка ()
От: VladD2 Российская Империя www.nemerle.org
Дата: 04.01.13 16:30
Оценка:
Здравствуйте, _NN_, Вы писали:

_NN>Что думаете ?


Думаю, что это извращение. Есть ФВП и приведение типов.

А это даже не реализация перегрузки скобок, а какой-то хак.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: Перегрузка ()
От: _NN_ www.nemerleweb.com
Дата: 04.01.13 17:04
Оценка:
Здравствуйте, VladD2, Вы писали:

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


_NN>>Что думаете ?


VD>Думаю, что это извращение. Есть ФВП и приведение типов.

А если нужно именно через объект без лямбды.
Что плохого в этой фиче ?

VD>А это даже не реализация перегрузки скобок, а какой-то хак.

А как должна выглядеть перегрузка скобок ?

По сути все что начинается с '@' является операцией, а значит должно быть public static.
Ну и соответственно нужно туда передавать объект первым аргументом, как в методах расширения.

Чем это нелогично ?
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[2]: Перегрузка ()
От: _NN_ www.nemerleweb.com
Дата: 04.01.13 17:07
Оценка:
Здравствуйте, hardcase, Вы писали:

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


_NN>>Что думаете ?

H>Жесть
А конкретнее ?
Хочется понять, чем эта возможность кому-то помешает.
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[3]: Перегрузка ()
От: VladD2 Российская Империя www.nemerle.org
Дата: 04.01.13 18:28
Оценка:
Здравствуйте, _NN_, Вы писали:

VD>>Думаю, что это извращение. Есть ФВП и приведение типов.

_NN>А если нужно именно через объект без лямбды.

Скорее всего кто-то в очередной раз занимается велосипедостроением.

Давай для начала рассмотрим решаемую задачу.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: Перегрузка ()
От: Visor2004  
Дата: 04.01.13 21:45
Оценка:
Здравствуйте, hardcase, Вы писали:

H>Щас набижит Влад и закидает какашками


я тоже хотел бы метнуть какаху за такое... где можно?
Помните!!! ваш говнокод кому-то предстоит разгребать.
Re[4]: Перегрузка ()
От: _NN_ www.nemerleweb.com
Дата: 05.01.13 11:26
Оценка:
Здравствуйте, VladD2, Вы писали:

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

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


VD>>>Думаю, что это извращение. Есть ФВП и приведение типов.

_NN>>А если нужно именно через объект без лямбды.

VD>Скорее всего кто-то в очередной раз занимается велосипедостроением

Возможно %)

VD>Давай для начала рассмотрим решаемую задачу.

Перегрузка () позволяет написать следующий код без макросов и без лишних использований (using):

// Фреймворк
[Record]
class XInt 
{
  public X : int { get; }
  public F() : void {}
}

[Record]
class XString 
{
  public X : string { get; }
  public G() : void {} 
}

class XObject
{
  public static @()(_ : XObject, x : int) : XInt { XInt(x); }
  public static @()(_ : XObject, x : string) : XString { XString(x); }

  public X() : void {}
}

def xobject = XObject();

// Использование
xobject.X();
xobject(1).F();
xobject("").G();
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[5]: Перегрузка ()
От: VladD2 Российская Империя www.nemerle.org
Дата: 05.01.13 14:18
Оценка:
Здравствуйте, _NN_, Вы писали:

_NN>Перегрузка () позволяет написать следующий код без макросов и без лишних использований (using):


А индексаторы почему не подходят?
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[6]: Перегрузка ()
От: _NN_ www.nemerleweb.com
Дата: 06.01.13 07:56
Оценка:
Здравствуйте, VladD2, Вы писали:

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


_NN>>Перегрузка () позволяет написать следующий код без макросов и без лишних использований (using):


VD>А индексаторы почему не подходят?


С таким же успехом можно просто использовать два объекта.
Хочется использовать именно скобки, тем более когда это технически реализуемо.
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[7]: Перегрузка ()
От: VladD2 Российская Империя www.nemerle.org
Дата: 06.01.13 21:41
Оценка:
Здравствуйте, _NN_, Вы писали:

_NN>С таким же успехом можно просто использовать два объекта.


С каким "с таим же"? Неявный индексатор позволяет реализовать то что ты хочешь, но без изменения языка. Кроме того он для твоего примера подходит намного лучше.

_NN>Хочется использовать именно скобки, тем более когда это технически реализуемо.


Какая разница какие скобки ты будешь использовать (круглые или квадратные)?

Не уж то ради круглых скобок нужно усложнять и уродовать язык?
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[8]: Перегрузка ()
От: _NN_ www.nemerleweb.com
Дата: 07.01.13 07:09
Оценка: 1 (1) +1
Здравствуйте, VladD2, Вы писали:

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


_NN>>С таким же успехом можно просто использовать два объекта.


VD>С каким "с таим же"? Неявный индексатор позволяет реализовать то что ты хочешь, но без изменения языка. Кроме того он для твоего примера подходит намного лучше.


Нужны круглые скобки для того, чтобы код был максимально похож на код в JS.
Это может быть большим плюсом в выборе NemerleWeb.

Кому не нужно, тот просто может не использовать эту возможность, точно так же как и любую другую возможность языка.
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[9]: Перегрузка ()
От: VladD2 Российская Империя www.nemerle.org
Дата: 07.01.13 16:55
Оценка:
Здравствуйте, _NN_, Вы писали:

_NN>Нужны круглые скобки для того, чтобы код был максимально похож на код в JS.

_NN>Это может быть большим плюсом в выборе NemerleWeb.

Ничего что Немерл совсем не похож на JS?

_NN>Кому не нужно, тот просто может не использовать эту возможность, точно так же как и любую другую возможность языка.


К сожалению, это не так. Ты же не макрос предлагаешь сделать? Ты хочешь изменить язык и изменить вывод типов.

Вывод типов и так не быстрый. Твои доработки замедлят его еще больше.

Ну, а для твоей задачи достаточно сделать макрос который и будет создавать нужные типы.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[10]: Перегрузка ()
От: _NN_ www.nemerleweb.com
Дата: 07.01.13 17:48
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Ничего что Немерл совсем не похож на JS?

Ничего

VD>К сожалению, это не так. Ты же не макрос предлагаешь сделать? Ты хочешь изменить язык и изменить вывод типов.

Изменить не так сильно.

VD>Вывод типов и так не быстрый. Твои доработки замедлят его еще больше.

Замедлятся только когда имеем код вида x() и 'x' типизировался до простого типа X.
Могу замерить на скорости сборки компилятора.
Это будет достаточно ?

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

Макрос уже есть, который генерирует типы.
И в этих типах хочется иметь перегрузку ().
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[11]: Перегрузка ()
От: catbert  
Дата: 08.01.13 15:31
Оценка:
Здравствуйте, _NN_, Вы писали:

_NN>И в этих типах хочется иметь перегрузку ().


А что, если эти типы будут производными от Nemerle.Builtins.Function? Компилятор скушает?
Re[12]: Перегрузка ()
От: _NN_ www.nemerleweb.com
Дата: 08.01.13 15:41
Оценка:
Здравствуйте, catbert, Вы писали:

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


_NN>>И в этих типах хочется иметь перегрузку ().


C>А что, если эти типы будут производными от Nemerle.Builtins.Function? Компилятор скушает?

Да.

http://rsdn.ru/forum/nemerle/2551486.1
Автор: Алексей П
Дата: 20.06.07
:
public class Adder: Nemerle.Builtins.Function[int, int, int]
{
    public override apply(p1: int, p2: int): int
    {
        p1 + p2
    }
    
    public static Test(): void
    {
        def f = (Adder() : object) :> int * int -> int;
        assert(f(1, 2) == 3);
    }
}


Однако это не позволяет иметь перегрузки '()'.
http://rsdn.nemerleweb.com
http://nemerleweb.com
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.