Здравствуйте, 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
декомпилируй и посмотри.
Кстати, когда константы генерирует правильно.
декомпилировал я дотпиком
Здравствуйте, Аноним, Вы писали:
А>Только что просмотрел генерацию.
А>там где все значения константы выходит верно.
А>Но у меня там выражения.
Не знаю как вы смотрите, я сделал аналогичный код в С# и 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 лет как генерирует правильный.