Nemerle: как определить несколько операторов явного приведен
От: Ilya10k Россия  
Дата: 20.09.06 00:13
Оценка:
using System;

namespace Test
{
    public struct Date
    {
        public this(year: int, month: int, day: int)
        {
            _value = 10000 * year + 100 * month + day;
        }

        public Test1(date: Date): DateTime
        {
            date:> DateTime
        }

        public Test2(date: Date): int
        {
            date:> int
        }

        public static @:>(date: Date): int
        {
            date.Value
        }
        
        public static @:>(date: Date): DateTime
        {
            DateTime(date.Year, date.Month, date.Day)
        }

        public Year: int { get { Value / 10000 } }
        public Month: int { get { (Value % 10000) / 100 } }
        public Day: int { get { Value % 100 } }
        
        private Value: int { get { _value } }
        private _value: int;
    }
}



D:\>ncc -target:library test.n
test.n:27:15:27:40: <[01;31merror<[0m: attempted return type overload on method Test.Date.op_Explicit(date : Test.Date): System.DateTime and method Test.Date.op_Explicit(date : Test.Date) : int
test.n:27:15:27:40: <[01;31merror<[0m: redefinition of method Test.Date.op_Explicit(date : Test.Date) : System.DateTime
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>

30.01.07 18:16: Перенесено модератором из 'Декларативное программирование' — IT
Re: Nemerle: как определить несколько операторов явного прив
От: VladD2 Российская Империя www.nemerle.org
Дата: 20.09.06 00:22
Оценка: 2 (1)
Здравствуйте, Ilya10k, Вы писали:

I>D:\>ncc -target:library test.n

I>test.n:27:15:27:40: <[01;31merror<[0m: attempted return type overload on method Test.Date.op_Explicit(date : Test.Date): System.DateTime and method Test.Date.op_Explicit(date : Test.Date) : int
I>test.n:27:15:27:40: <[01;31merror<[0m: redefinition of method Test.Date.op_Explicit(date : Test.Date) : System.DateTime
I>[/code]

Возможно это баг. Надо бы заслать в их багтрекер.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: Nemerle: как определить несколько операторов явного п
От: Denis K.  
Дата: 20.09.06 11:28
Оценка:
Здравствуйте, VladD2, Вы писали:

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


VD>Возможно это баг. Надо бы заслать в их багтрекер.


А можно определить две одиннаковые функции, различающиеся только возвращающим значением ?
Или опереторы приведения — это специальный случай ?
Re[3]: Nemerle: как определить несколько операторов явного п
От: Vermicious Knid  
Дата: 20.09.06 12:11
Оценка:
Здравствуйте, Denis K., Вы писали:

VD>>Возможно это баг. Надо бы заслать в их багтрекер.

DK>А можно определить две одиннаковые функции, различающиеся только возвращающим значением ?
Нет, нельзя. В C# кстати тоже нельзя.

DK>Или опереторы приведения — это специальный случай ?

Да, в C# это специальный случай. В Nemerle видимо нет.

Я кстати не уверен, что это баг. У компилятора Nemerle есть тесты, в том числе и для операторов приведения, вот в них я ни разу не видел больше одного оператора явного и неявного приведения(в смысле с одинаковыми параметрами).

Возможно это by design. Авторы Nemerle вообще не любят подобные штуки, вот и решили не делать специальных случаев для операторов приведения. При этом, как ни странно, к внешним классам с несколькими операторами приведения Nemerle относится благосклонно(в независимости от того явные они или неявные), все приводит как надо.
Re[3]: Nemerle: как определить несколько операторов явного п
От: VladD2 Российская Империя www.nemerle.org
Дата: 20.09.06 13:39
Оценка:
Здравствуйте, Denis K., Вы писали:

DK>А можно определить две одиннаковые функции, различающиеся только возвращающим значением ?


Нет, конечно. Это будет несовместимо с C#. Но вот с операторами явного приведения типов как раз все иначе.

DK>Или опереторы приведения — это специальный случай ?


Специальный.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[4]: Nemerle: как определить несколько операторов явного п
От: VladD2 Российская Империя www.nemerle.org
Дата: 20.09.06 13:39
Оценка: +1
Здравствуйте, Vermicious Knid, Вы писали:

DK>>А можно определить две одиннаковые функции, различающиеся только возвращающим значением ?

VK>Нет, нельзя. В C# кстати тоже нельзя.

Именно потому и нельзя. Возмжно это еще усложняет вывод типов, но потенциально MSIL это поддерживает.

DK>>Или опереторы приведения — это специальный случай ?

VK>Да, в C# это специальный случай. В Nemerle видимо нет.

Думаю, это ошибка. Nemerle декларирует совместимость с C# по публичному интерфейсу. Так что любой публичный интерфейс который можно написать на C# должно быть можно на Nemerle.

VK>Я кстати не уверен, что это баг. У компилятора Nemerle есть тесты, в том числе и для операторов приведения, вот в них я ни разу не видел больше одного оператора явного и неявного приведения(в смысле с одинаковыми параметрами).


Это логичесакая ошибка. Не думаю, что в мире так много людей знающих спецификацию C# наизусть.

VK>Возможно это by design. Авторы Nemerle вообще не любят подобные штуки, вот и решили не делать специальных случаев для операторов приведения.


Любя, не любят — это не аргументация. Это не приводит к конфликтам, и это требуется для совместимости. Значит это должно быть.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[5]: Nemerle: как определить несколько операторов явного п
От: Vermicious Knid  
Дата: 20.09.06 22:58
Оценка: 48 (4)
Здравствуйте, VladD2, Вы писали:

VK>>Возможно это by design. Авторы Nemerle вообще не любят подобные штуки, вот и решили не делать специальных случаев для операторов приведения.

VD>Любя, не любят — это не аргументация. Это не приводит к конфликтам, и это требуется для совместимости. Значит это должно быть.
Да я в принципе согласен. А вот согласятся ли с этим "Немерлисты"? В качестве разминки я исправил эту "ошибку" и отправил репорт и патч. Но вот что они на это скажут это еще очень большой вопрос...

Кстати по поводу совместимости. Nemerle в отличие от C# операторы приведения типов еще и не наследует(т.е. унаследованные операторы попросту не действуют на наследник), так что на этом эпопея не закончится.

DK>>>А можно определить две одиннаковые функции, различающиеся только возвращающим значением ?

VK>>Нет, нельзя. В C# кстати тоже нельзя.
VD>Именно потому и нельзя. Возмжно это еще усложняет вывод типов, но потенциально MSIL это поддерживает.
Я кстати ради интереса включил и слегка потестировал перегрузку по возвращаемым значениям. Она вроде бы работает(собственно в этом я изначально не сомневался), но что будет в более сложных случаях я не знаю. Вот пара тестов, которые работают на моей версии компилятора:
class foo {
    public static @:>(_x : foo) : char { '1' }
    public static @:>(_x : foo) : string { "2" }
    public static @:(_x : foo) : int { 1 }
    public static @:(_x : foo) : float { 2.0f }
    public baz() : int { 1 }
    public baz() : float { 2.0f }
}

class bar : foo {
    public static @:>(_x : bar) : list[string] { ["3"] }
    public static @:(_x : foo) : bar { bar() }
    public static @:(_x : bar) : double { 3.0 }
    public baz() : double { 3.0 }
}

def b = bar();
def f : foo = b;

def i0 : int = f;
def i1 : float = f;
def i2 : double = f : bar;

def e0 = f :> char;
def e1 = f :> string;
def e2 = b :> list[string];

def o0 : int = f.baz();
def o1 : float = f.baz();
def o2 : double = b.baz();

System.Console.WriteLine((i0,i1,i2));
System.Console.WriteLine((e0,e1,e2));
System.Console.WriteLine((o0,o1,o2));

public class foo
{
    public bar() : int
    {
        1
    }
    public bar() : string
    {
        "123"
    }
}

def blob(x : string)
{
    System.Console.WriteLine(x);
}

def x = foo();
def y = x.bar();
blob(y);
Re[6]: Nemerle: как определить несколько операторов явного п
От: VladD2 Российская Империя www.nemerle.org
Дата: 21.09.06 13:30
Оценка:
Здравствуйте, Vermicious Knid, Вы писали:

VK>Да я в принципе согласен. А вот согласятся ли с этим "Немерлисты"?


Думаю — "спасибо".

VK> В качестве разминки я исправил эту "ошибку" и отправил репорт и патч. Но вот что они на это скажут это еще очень большой вопрос...


О! Здорово! А не хочешь ли ты в качестве разминки помочь нам в доведении до ума Интеграции со студией?
Ты бы мог сильно помочь нам. Нам рук ой как нехватает.

VK>Кстати по поводу совместимости. Nemerle в отличие от C# операторы приведения типов еще и не наследует(т.е. унаследованные операторы попросту не действуют на наследник), так что на этом эпопея не закончится.


А это может и к лучшему. Что тлоку от ператоров оперирующих с другим типом? Вообще они в Шарпе были по дурацкому сделаны. Да и на совместимость это не влияет. Ведь главное, что мы можем создать такой публичный интерфейс какой пожелаем (совместимый с шарпом).
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.