override Equals: Nemerle-CSharp
От: para  
Дата: 28.02.11 20:25
Оценка:
[StructuralEquality]
public class A{
  i : int;
}

def a1 = A();
def a2 = A();

// два теста
// 1. Nemerle
a1 == a2      // = true

// 2. CSharp
a1 == a2      // = false
a1.Equals(a2) // = true


Как реализовано в Nemerle мне нравиться больше,
но при интеграции с шарпом возникла эта проблема, хоть и простая но внезапная.

Плюс мне кажется, что в CSharpToNemerle на этой почве потенциально могут быть проблемы

в issues?
Re: override Equals: Nemerle-CSharp
От: Аноним  
Дата: 01.03.11 05:39
Оценка:
В действительности в сравнении по ссылке и по значению все намного хуже.

Не везде ясно какой из вариантов используется.
Re[2]: override Equals: Nemerle-CSharp
От: Ziaw Россия  
Дата: 01.03.11 06:02
Оценка:
Здравствуйте, Аноним, Вы писали:

А>В действительности в сравнении по ссылке и по значению все намного хуже.


А>Не везде ясно какой из вариантов используется.


Например?
Re[2]: override Equals: Nemerle-CSharp
От: VladD2 Российская Империя www.nemerle.org
Дата: 01.03.11 06:43
Оценка:
Здравствуйте, Аноним, Вы писали:

А>В действительности в сравнении по ссылке и по значению все намного хуже.


А>Не везде ясно какой из вариантов используется.


Это в C#. В Nemerle как раз всегда известно. В Nemerle сравнение по ссылке допустимо только для типа object, так что попытка использовать == для типов у которых не определен оператор == приведет к выдаче сообщения об ошибке. Если нужно сравнить ссылки то нужно или уточнить тип:
def s1 = "abc";
def s2 = s1;
assert(s1 : object == s2);

или воспользоваться функцией object.ReferenceEquals().

В данном же случае проблема в чем-то другом, так как макрос генерирует один и тот же код. Думаю, что автор темы просто где-то ошибся.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re: override Equals: Nemerle-CSharp
От: VladD2 Российская Империя www.nemerle.org
Дата: 01.03.11 06:48
Оценка:
Здравствуйте, para, Вы писали:

P>
P>[StructuralEquality]
P>...
P>// 1. Nemerle
P>a1 == a2      // = true
P>// 2. CSharp
P>a1 == a2      // = false
P>


P>в issues?


Сдается мне ты где-то ошибся. Я поглядел исходный код макроса StructuralEquality:
  Скрытый текст
  [Nemerle.MacroUsage (Nemerle.MacroPhase.WithTypedMembers,
                       Nemerle.MacroTargets.Class,
                       Inherited = false, AllowMultiple = false)]
  macro StructuralEquality (tb : TypeBuilder)
  {
    def fields = tb.GetFields(BindingFlags.Public %| BindingFlags.NonPublic %|
                             BindingFlags.Instance %| BindingFlags.DeclaredOnly);

    def invokeEquals(x : IField)
    {
      def nm = Macros.UseSiteSymbol(x.Name);
      if(x.GetMemType().IsValueType)
        <[ $(nm : name).Equals(other.$(nm : name)) ]>
      else
        <[ System.Collections.Generic.EqualityComparer.Default.Equals($(nm : name), other.$(nm : name)) ]>;
    }

    def body = match(fields)
    {
      | []       => <[ true ]>
      | [single] => invokeEquals(single)
      | first :: others =>
        others.FoldLeft(invokeEquals(first), (field, acc) => <[ $acc && $(invokeEquals(field)) ]>)
    }

    tb.Define(<[ decl:
      public override Equals (_ : System.Object) : bool
      {
        | null => false
        | x when x.GetType().Equals(this.GetType()) =>
          def other = x :> $(tb.ParsedTypeName);
          $body
        | _ => false
      }
    ]>);
  }

В нем нет генерации оператора ==. А учитывая, что немерл не позволяет использовать оператор == для типов для которых он не определен, то и пример твой работать не должен.

Я провел смелый научный эксперимент и получил ожидаемый результат:
using Nemerle.Collections;
using Nemerle.Text;
using Nemerle.Utility;

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

[StructuralEquality]
public class A{
  i : int;
}

module Program
{
  Main() : void
  {
    def a1 = A();
    def a2 = A();

    WriteLine(a1 == a2); // Error: the custom attribute 'StructuralEquality' could not be found or is invalid
  }
}


Так что ищи ошибку в своем коде.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: override Equals: Nemerle-CSharp
От: Ziaw Россия  
Дата: 01.03.11 08:36
Оценка: +1
Здравствуйте, VladD2, Вы писали:

VD>Я провел смелый научный эксперимент и получил ожидаемый результат:

VD>
VD>using Nemerle.Collections;
VD>using Nemerle.Text;
VD>using Nemerle.Utility;

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

VD>[StructuralEquality]
VD>public class A{
VD>  i : int;
VD>}

VD>module Program
VD>{
VD>  Main() : void
VD>  {
VD>    def a1 = A();
VD>    def a2 = A();

VD>    WriteLine(a1 == a2); // Error: the custom attribute 'StructuralEquality' could not be found or is invalid
VD>  }
VD>}
VD>


VD>Так что ищи ошибку в своем коде.


Ошибка тут будет: Error: comparing values of types A and A with reference equality
А то, что показано это отсутствие using Nemerle.Extensions;
Re[3]: override Equals: Nemerle-CSharp
От: hardcase Пират http://nemerle.org
Дата: 01.03.11 08:59
Оценка:
Здравствуйте, Ziaw, Вы писали:

Z>Здравствуйте, Аноним, Вы писали:


А>>В действительности в сравнении по ссылке и по значению все намного хуже.


А>>Не везде ясно какой из вариантов используется.


Z>Например?


Буквально вчера поимел таковую проблему:
var newRoute = new RouteValueDictionary(ViewContext.RouteData.Values);
if (newRoute ["langdir"] == "en")
{
...
}


Nemerle этого бы не допустил и потребовал явного вызова Equals:
var newRoute = new RouteValueDictionary(ViewContext.RouteData.Values);
if ("en".Equals(newRoute["langdir"]))
{
}
/* иЗвиНите зА неРовнЫй поЧерК */
Re[4]: override Equals: Nemerle-CSharp
От: Ziaw Россия  
Дата: 01.03.11 09:21
Оценка:
Здравствуйте, hardcase, Вы писали:

H>Буквально вчера поимел таковую проблему:

H>
H>var newRoute = new RouteValueDictionary(ViewContext.RouteData.Values);
H>if (newRoute ["langdir"] == "en")
H>{
H>...
H>}
H>


А что конкретно лежало в newRoute["langdir"]? Если это строка то я никаких проблем не вижу, а если другой тип, не пойму чем здесь поможет equals?
Re[4]: override Equals: Nemerle-CSharp
От: VladD2 Российская Империя www.nemerle.org
Дата: 01.03.11 10:22
Оценка:
Здравствуйте, hardcase, Вы писали:

H>Nemerle этого бы не допустил и потребовал явного вызова Equals:

H>
H>var newRoute = new RouteValueDictionary(ViewContext.RouteData.Values);
H>if ("en".Equals(newRoute["langdir"]))
H>{
H>}
H>


Немерл позволил бы вообще не писать подобный шлак. Написал бы себе обвязочку из макросов и описывал бы весь роутинг декларативно.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[5]: override Equals: Nemerle-CSharp
От: hardcase Пират http://nemerle.org
Дата: 01.03.11 10:28
Оценка:
Здравствуйте, Ziaw, Вы писали:

Z>А что конкретно лежало в newRoute["langdir"]? Если это строка то я никаких проблем не вижу, а если другой тип, не пойму чем здесь поможет equals?


Строка
Я не знаю что там происходило, но изменение на второй способ сделало код работоспособным.
/* иЗвиНите зА неРовнЫй поЧерК */
Re[5]: override Equals: Nemerle-CSharp
От: hardcase Пират http://nemerle.org
Дата: 01.03.11 10:30
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Немерл позволил бы вообще не писать подобный шлак. Написал бы себе обвязочку из макросов и описывал бы весь роутинг декларативно.


Там не роутинг (роутинг на строковых шаблонах в ASP.NET MVC вообще непостижимый какой-то), там модификация текущего маршрута с целью изменения выбранного языка.
/* иЗвиНите зА неРовнЫй поЧерК */
Re[2]: override Equals: Nemerle-CSharp
От: para  
Дата: 01.03.11 11:06
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Сдается мне ты где-то ошибся.


да точно
Re[6]: override Equals: Nemerle-CSharp
От: Ziaw Россия  
Дата: 01.03.11 16:45
Оценка:
Здравствуйте, hardcase, Вы писали:

VD>>Немерл позволил бы вообще не писать подобный шлак. Написал бы себе обвязочку из макросов и описывал бы весь роутинг декларативно.


H>Там не роутинг (роутинг на строковых шаблонах в ASP.NET MVC вообще непостижимый какой-то), там модификация текущего маршрута с целью изменения выбранного языка.


Надо бы придумать роутинг на пеге, есть идеи синтаксиса и реализации? Все что не приходит в голову, приводит меня к переписыванию большого куска макроса
Re[7]: override Equals: Nemerle-CSharp
От: hardcase Пират http://nemerle.org
Дата: 01.03.11 16:55
Оценка:
Здравствуйте, Ziaw, Вы писали:

Z>Надо бы придумать роутинг на пеге, есть идеи синтаксиса и реализации? Все что не приходит в голову, приводит меня к переписыванию большого куска макроса


А зачем его переписывать? Нужно просто фронт-энд для него новый создавать (это достаточно легко делается), а кишкам макроса отдавать объект Grammar и класс с обработчиками.
/* иЗвиНите зА неРовнЫй поЧерК */
Re[6]: override Equals: Nemerle-CSharp
От: Ziaw Россия  
Дата: 01.03.11 16:57
Оценка:
Здравствуйте, hardcase, Вы писали:

H>Строка

H>Я не знаю что там происходило, но изменение на второй способ сделало код работоспособным.

Хм... точно. Одинаковые строки могут выдавать по ReferenceEquals как true так и false. Неожиданно, хотя механизм вполне понятен, компилятор строки интернирует, а рантайм, естественно, нет.
Re[4]: override Equals: Nemerle-CSharp
От: VladD2 Российская Империя www.nemerle.org
Дата: 01.03.11 19:29
Оценка:
Здравствуйте, hardcase, Вы писали:

H>Буквально вчера поимел таковую проблему:

H>
H>var newRoute = new (ViewContext.RouteData.Values);
H>if (newRoute ["langdir"] == "en")
H>{
H>...
H>}
H>


H>Nemerle этого бы не допустил и потребовал явного вызова Equals:


Не потребовал бы. Индексатор RouteValueDictionary возвращает object. А как раз для него в Неперле разрешено использовать == для ссылочной эквивалентности. Ну, и как результат две копии строки будут разными даже если они содержат одно и то же значение.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[8]: override Equals: Nemerle-CSharp
От: VladD2 Российская Империя www.nemerle.org
Дата: 01.03.11 19:30
Оценка:
Здравствуйте, hardcase, Вы писали:

Z>>Надо бы придумать роутинг на пеге, есть идеи синтаксиса и реализации? Все что не приходит в голову, приводит меня к переписыванию большого куска макроса


H>А зачем его переписывать? Нужно просто фронт-энд для него новый создавать (это достаточно легко делается), а кишкам макроса отдавать объект Grammar и класс с обработчиками.


О каком макросе вы ведете речь?
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[9]: override Equals: Nemerle-CSharp
От: Ziaw Россия  
Дата: 01.03.11 20:08
Оценка:
Здравствуйте, VladD2, Вы писали:

Z>>>Надо бы придумать роутинг на пеге, есть идеи синтаксиса и реализации? Все что не приходит в голову, приводит меня к переписыванию большого куска макроса


H>>А зачем его переписывать? Нужно просто фронт-энд для него новый создавать (это достаточно легко делается), а кишкам макроса отдавать объект Grammar и класс с обработчиками.


VD>О каком макросе вы ведете речь?


PegGrammar, грубо говоря нужно научиться давать ему грамматику из другого макроса.
Re[10]: override Equals: Nemerle-CSharp
От: VladD2 Российская Империя www.nemerle.org
Дата: 01.03.11 20:13
Оценка:
Здравствуйте, Ziaw, Вы писали:

Z>PegGrammar, грубо говоря нужно научиться давать ему грамматику из другого макроса.


Я тебе уже говорил, что ты извращенно мыслишь. Грамматика юрлов одна и та же. Писать разные парсеры для разных путей — это овреркил. Проблема решается в сто раз проще.

Ты просто не представляешь сколько PegGrammar может нагенерировать кода. Его компиляция будет занимать времени во много раз больше нежели будет нужно для сборки основного кода проекта.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[11]: override Equals: Nemerle-CSharp
От: Ziaw Россия  
Дата: 01.03.11 21:47
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Я тебе уже говорил, что ты извращенно мыслишь. Грамматика юрлов одна и та же. Писать разные парсеры для разных путей — это овреркил. Проблема решается в сто раз проще.


А ты сам ее решал? Под рукой нет ASP.NET-ных исходников, но в RoR код роутинга это несколько тысяч строк (обычных текстовых, код нечем измерить). Это во первых.

Во вторых, там очень тупой алгоритм, берется урл и проверяется на каждый маршрут из списка, если совпал — вот он наш маршрут, O(N). На очень простеньком RoR сайте у меня сейчас 127 маршрутов. Для оптимизации их количество советуют сокращать, используя универсальный: /{controller}/{action}[/{id}]?params, но мне такой подход не нравится.

Можно конечно придумать макрос попроще, конечный автомат он и есть конечный автомат, но когда уже есть пег...

VD>Ты просто не представляешь сколько PegGrammar может нагенерировать кода. Его компиляция будет занимать времени во много раз больше нежели будет нужно для сборки основного кода проекта.


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