Re[14]: Ошибка компилятора.
От: Аноним  
Дата: 12.08.13 19:42
Оценка:
Здравствуйте, CodingUnit, Вы писали:


using Nemerle;
using Nemerle.Collections;
using Nemerle.Extensions1;
using Nemerle.Text;
using Nemerle.Utility;

using System;
using System.Collections.Generic;
using System.Linq;
using System.Console;

module Program
{

 
[StructuralEquality(Ignore = name, NotIgnore = A.name, AllIgnore = true)]
variant X
{
 | A { name : string; name2 : string; other : int; }
 | B { name : string }
 | C {
     [EqualsNotIgnore] a1:int; 
     [EqualsNotIgnore] a2:int; 
     [EqualsNotIgnore] a3:int }
}

  Main() : void
  {
        def a1 = X.A("abc", "aaa", 1);
        def a2 = X.A("abcd", "aaa", 1);
        WriteLine(a1 == a2);

    _ = ReadLine();
}
}


Nemerle.Extensions1 брать из пулреквеста немерли сегодняшнего StructuralEquality.n

декомпилируй и посмотри.
Кстати, когда константы генерирует правильно.
декомпилировал я дотпиком
Re[15]: Ошибка компилятора.
От: CodingUnit Россия  
Дата: 12.08.13 20:16
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Только что просмотрел генерацию.

А>там где все значения константы выходит верно.
А>Но у меня там выражения.

Не знаю как вы смотрите, я сделал аналогичный код в С# и N:


    public class Class1
    {
          public int a1 = 1;
          public int a2 = 2;
          public int a3 = 3;

          public override int GetHashCode()
          {
              unchecked { return -2128831035 ^ base.GetHashCode() ^ (16777619 * (16777619 * (16777619 * (-2128831035 ^ this.a1) ^ this.a2) ^ this.a3) + 3); }
          }
    }

    class Program
    {
        static void Main(string[] args)
        {
            var cl = new Class1();
            Console.WriteLine(cl.GetHashCode());
            Console.ReadLine();
        }
    }


и

[MacroUsage(MacroPhase.BeforeInheritance, MacroTargets.Class)]
  macro Macro1(ty : TypeBuilder)
  {
    def body = <[ -2128831035 ^ base.GetHashCode() ^ (16777619 * (16777619 * (16777619 * (-2128831035 ^ this.a1) ^ this.a2) ^ this.a3) + 3) ]>;
    ty.Define(<[decl: public override GetHashCode() : int { unchecked { $body } } ]>)
  }

// в другом проекте
[Macro1]
class Class1
{
  public a1 : int = 1;
  public a2 : int = 2;
  public a3 : int = 3;
}

module Program
{
  Main() : void
  {
    def cl = Class1();
    def res = cl.GetHashCode();
    WriteLine($"Hi! $res");
    _ = ReadLine();
  }
}


получается -706362363

Все работает совершенно одинаково и код Reflector показывает одинаковый и там и там, в верном порядке, ищите ошибки у себя, порядок компилятор уже 10 лет как генерирует правильный.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.