'()' operator oveloading
От: Elifant  
Дата: 16.06.07 05:38
Оценка: +1
Возможно ли перегрузить оператор '()'?
Неработающий пример желаемого:

class Adder {
    public @()(arg1: int, arg2: int): int { arg1 + arg2; }
};
def adder = Adder();
def sum = adder(1, 2);
Posted via RSDN NNTP Server 2.1 beta
Re: '()' operator oveloading
От: Lloyd Россия  
Дата: 16.06.07 05:55
Оценка: +1
Здравствуйте, Elifant, Вы писали:

E>Возможно ли перегрузить оператор '()'?


А зачем, если есть делегаты?
Re: '()' operator oveloading
От: Иванков Дмитрий Россия  
Дата: 16.06.07 07:13
Оценка: 2 (1)
Здравствуйте, Elifant, Вы писали:

E>Возможно ли перегрузить оператор '()'?

E>Неработающий пример желаемого:

E>
E>class Adder {
E>    public @()(arg1: int, arg2: int): int { arg1 + arg2; }
E>};
E>def adder = Adder();
E>def sum = adder(1, 2);
E>


Как уже было сказано для такого примера класс ни к чему, можно обойтись просто функцией.
Если же надо превращать класс в функцию, то
1) можно определить метод ее возвращающий и явно вызывать его
   public static getAdder () : int*int->int { _ + _ }

2) определить оператор приведения к функции
   public static @: (a : Adder) : int*int->int { _ + _ }

и там, где явно будет выведено приведение к функциональному типу, преобразование пройдет само, например:
def f = A ();
def g (x) { x (1,1) };
_ = g (f);

однако просто написать f(1,1) нельзя и это может выглядеть как бага, но по мне так фича
Re[2]: '()' operator oveloading
От: Elifant  
Дата: 16.06.07 07:28
Оценка:
Иванков Дмитрий пишет:

E>>Возможно ли перегрузить оператор '()'?


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

> просто функцией.
> Если же надо превращать класс в функцию, то
> 1) можно определить метод ее возвращающий и явно вызывать его
> public static getAdder () : int*int->int { _ + _ }
> 2) определить оператор приведения к функции
> public static @: (a : Adder) : int*int->int { _ + _ }
> и там, где явно будет выведено приведение к функциональному типу,
> преобразование пройдет само, например:
>
> def f = A ();
> def g (x) { x (1,1) };
> _ = g (f);
>
> однако просто написать f(1,1) нельзя и это может выглядеть как бага, но
> по мне так фича

Понятно, спасибо. Указанные трюки мне знакомы. Просто я пришел из мира
C++,Ruby,Python
и захотелось привычного Думал есть какие-нибудь магические имена
методов, вроде
apply и update в Scala.
Posted via RSDN NNTP Server 2.1 beta
Re[3]: '()' operator oveloading
От: WolfHound  
Дата: 16.06.07 15:20
Оценка: +2
Здравствуйте, Elifant, Вы писали:

E>Понятно, спасибо. Указанные трюки мне знакомы. Просто я пришел из мира

E>C++,Ruby,Python
E>и захотелось привычного Думал есть какие-нибудь магические имена
E>методов, вроде
E>apply и update в Scala.
Перегрузка () это от отсутствия нормальных замыканий.
В немерле есть нормальные замыкания.
Пора избавлятся от дурных привычек.
... << RSDN@Home 1.2.0 alpha rev. 673>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[4]: '()' operator oveloading
От: Elifant  
Дата: 20.06.07 07:18
Оценка: 1 (1) -1
WolfHound пишет:

E>> Просто я пришел из мира C++,Ruby,Python

E>> и захотелось привычного Думал есть какие-нибудь магические имена
E>> методов, вроде apply и update в Scala.
> Перегрузка () это от отсутствия нормальных замыканий.
> В немерле есть нормальные замыкания.
> Пора избавлятся от дурных привычек.

Категорично Это в Python, в Scala или в Ruby нету нормальных замыканий?

На самом деле я обычно перегружаю скобки для объектов с одной
единственной основной операцией, например:

format = TextFormatter(width=60)
out = format("bla-bla-bla")
format.width = 80
out = format("foo-bar-foo")


Если бы я спросил, как написать подобное в Nemerle, мне наверняка
ответили бы не выпендриваться и написать:

def formatter = TextFormatter(width=60)
mutable out = formatter.Format("bla-bla-bla")
format.Width = 80
out = formatter.Format("foo-bar-foo")


Так что замыкания тут как бы и ни при чем...


---
Любое слишком категоричное утверждение ошибочно, включая и это.
Posted via RSDN NNTP Server 2.1 beta
Re: '()' operator oveloading
От: Алексей П Россия  
Дата: 20.06.07 07:55
Оценка:
Здравствуйте, Elifant, Вы писали:

E>Возможно ли перегрузить оператор '()'?

E>Неработающий пример желаемого:

E>
E>class Adder {
E>    public @()(arg1: int, arg2: int): int { arg1 + arg2; }
E>};
E>def adder = Adder();
E>def sum = adder(1, 2);
E>


Криво, но можно:

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);
    }
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.