Перегрузка оператора ()
От: catbert  
Дата: 03.08.10 09:11
Оценка:
На рассылке недавно была тема про перегрузку оператора (). Как по мне, фича средней нужности, но поскольку Немерле позволяет перегружать практически все операторы, включая несуществующие, её отсутствие смущает народ.

Кстати, она почти реализована.

module Program
{
    Main() : void
    {
        def mf = MyFun();
        def i = mf("any"); // Error: the value called (mf) has non-functional type Program.MyFun
        WriteLine(i);
    }
    
    public class MyFun
    {
        public Invoke(_ : string) : int
        {
            42
        }
        
        public static @:(fn : MyFun) : string -> int
        {
        | null => null
        | _ => fn.Invoke
        }
    }
}


То есть при определении вызываемой функции не учитываются неявные преобразования. Эксперементируем дальше:

    Main() : void
    {
        def mf : string -> int = MyFun();
        def i = mf("any");
        WriteLine(i);
    }


Этот вариант уже работает. Так же как и этот:

    Main() : void
    {
        def call(a : string -> int) { a }
        
        def mf = MyFun();
        def i = call(mf)("any");
        WriteLine(i);

        WriteLine(mf.GetType().Name); // выводится MyFun
    }


Для реализации надо в CallTyper-е поискать возможные неявные преобразования и вписать их в overload_possibility. Но я не знаю, как это сделать
Re: Перегрузка оператора ()
От: hardcase Пират http://nemerle.org
Дата: 03.08.10 09:15
Оценка: +1
Здравствуйте, catbert, Вы писали:

C>На рассылке недавно была тема про перегрузку оператора ().


Зачем?
operator() нужен в C++ для создания функторов, а в Nemerle функции уже являются первоклассными объектами.

(Я ТСу с гугла тоже самое отвитил, по-видимому в личку)
/* иЗвиНите зА неРовнЫй поЧерК */
Re[2]: Перегрузка оператора ()
От: catbert  
Дата: 03.08.10 09:42
Оценка: 1 (1)
Здравствуйте, hardcase, Вы писали:

H>Зачем?

H>operator() нужен в C++ для создания функторов, а в Nemerle функции уже являются первоклассными объектами.

А зачем оператор <:$!@$:>? Но его можно определить, а () нет. Хотя определение () выглядит намного более полезным.
Re: Перегрузка оператора ()
От: VladD2 Российская Империя www.nemerle.org
Дата: 09.08.10 03:24
Оценка: +1
Здравствуйте, catbert, Вы писали:

C>На рассылке недавно была тема про перегрузку оператора (). Как по мне, фича средней нужности, но поскольку Немерле позволяет перегружать практически все операторы, включая несуществующие, её отсутствие смущает народ.


А по мне фича вообще никому не нужна кроме тех у кого мозг только на С++ думает. Есть функции высшего порядка и замыкания. Ими и надо пользоваться а не факнкторы в стиле С++ лепить.

На фиг нужно реализовывать эмуляцию функции в классе, если любой метод этого класса можно без проблем передать туда где нужная функция?

ЗЫ

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