Здравствуйте, Аноним, Вы писали:
А>В действительности в сравнении по ссылке и по значению все намного хуже.
А>Не везде ясно какой из вариантов используется.
Здравствуйте, Аноним, Вы писали:
А>В действительности в сравнении по ссылке и по значению все намного хуже.
А>Не везде ясно какой из вариантов используется.
Это в C#. В Nemerle как раз всегда известно. В Nemerle сравнение по ссылке допустимо только для типа object, так что попытка использовать == для типов у которых не определен оператор == приведет к выдаче сообщения об ошибке. Если нужно сравнить ссылки то нужно или уточнить тип:
В нем нет генерации оператора ==. А учитывая, что немерл не позволяет использовать оператор == для типов для которых он не определен, то и пример твой работать не должен.
Я провел смелый научный эксперимент и получил ожидаемый результат:
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
}
}
Так что ищи ошибку в своем коде.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, 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"]))
{
}
Здравствуйте, Ziaw, Вы писали:
Z>А что конкретно лежало в newRoute["langdir"]? Если это строка то я никаких проблем не вижу, а если другой тип, не пойму чем здесь поможет equals?
Строка
Я не знаю что там происходило, но изменение на второй способ сделало код работоспособным.
Здравствуйте, VladD2, Вы писали:
VD>Немерл позволил бы вообще не писать подобный шлак. Написал бы себе обвязочку из макросов и описывал бы весь роутинг декларативно.
Там не роутинг (роутинг на строковых шаблонах в ASP.NET MVC вообще непостижимый какой-то), там модификация текущего маршрута с целью изменения выбранного языка.
Здравствуйте, hardcase, Вы писали:
VD>>Немерл позволил бы вообще не писать подобный шлак. Написал бы себе обвязочку из макросов и описывал бы весь роутинг декларативно.
H>Там не роутинг (роутинг на строковых шаблонах в ASP.NET MVC вообще непостижимый какой-то), там модификация текущего маршрута с целью изменения выбранного языка.
Надо бы придумать роутинг на пеге, есть идеи синтаксиса и реализации? Все что не приходит в голову, приводит меня к переписыванию большого куска макроса
Здравствуйте, Ziaw, Вы писали:
Z>Надо бы придумать роутинг на пеге, есть идеи синтаксиса и реализации? Все что не приходит в голову, приводит меня к переписыванию большого куска макроса
А зачем его переписывать? Нужно просто фронт-энд для него новый создавать (это достаточно легко делается), а кишкам макроса отдавать объект Grammar и класс с обработчиками.
Здравствуйте, hardcase, Вы писали:
H>Строка H>Я не знаю что там происходило, но изменение на второй способ сделало код работоспособным.
Хм... точно. Одинаковые строки могут выдавать по ReferenceEquals как true так и false. Неожиданно, хотя механизм вполне понятен, компилятор строки интернирует, а рантайм, естественно, нет.
H>Nemerle этого бы не допустил и потребовал явного вызова Equals:
Не потребовал бы. Индексатор RouteValueDictionary возвращает object. А как раз для него в Неперле разрешено использовать == для ссылочной эквивалентности. Ну, и как результат две копии строки будут разными даже если они содержат одно и то же значение.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, hardcase, Вы писали:
Z>>Надо бы придумать роутинг на пеге, есть идеи синтаксиса и реализации? Все что не приходит в голову, приводит меня к переписыванию большого куска макроса
H>А зачем его переписывать? Нужно просто фронт-энд для него новый создавать (это достаточно легко делается), а кишкам макроса отдавать объект Grammar и класс с обработчиками.
О каком макросе вы ведете речь?
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
Z>>>Надо бы придумать роутинг на пеге, есть идеи синтаксиса и реализации? Все что не приходит в голову, приводит меня к переписыванию большого куска макроса
H>>А зачем его переписывать? Нужно просто фронт-энд для него новый создавать (это достаточно легко делается), а кишкам макроса отдавать объект Grammar и класс с обработчиками.
VD>О каком макросе вы ведете речь?
PegGrammar, грубо говоря нужно научиться давать ему грамматику из другого макроса.
Здравствуйте, Ziaw, Вы писали:
Z>PegGrammar, грубо говоря нужно научиться давать ему грамматику из другого макроса.
Я тебе уже говорил, что ты извращенно мыслишь. Грамматика юрлов одна и та же. Писать разные парсеры для разных путей — это овреркил. Проблема решается в сто раз проще.
Ты просто не представляешь сколько PegGrammar может нагенерировать кода. Его компиляция будет занимать времени во много раз больше нежели будет нужно для сборки основного кода проекта.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
VD>Я тебе уже говорил, что ты извращенно мыслишь. Грамматика юрлов одна и та же. Писать разные парсеры для разных путей — это овреркил. Проблема решается в сто раз проще.
А ты сам ее решал? Под рукой нет ASP.NET-ных исходников, но в RoR код роутинга это несколько тысяч строк (обычных текстовых, код нечем измерить). Это во первых.
Во вторых, там очень тупой алгоритм, берется урл и проверяется на каждый маршрут из списка, если совпал — вот он наш маршрут, O(N). На очень простеньком RoR сайте у меня сейчас 127 маршрутов. Для оптимизации их количество советуют сокращать, используя универсальный: /{controller}/{action}[/{id}]?params, но мне такой подход не нравится.
Можно конечно придумать макрос попроще, конечный автомат он и есть конечный автомат, но когда уже есть пег...
VD>Ты просто не представляешь сколько PegGrammar может нагенерировать кода. Его компиляция будет занимать времени во много раз больше нежели будет нужно для сборки основного кода проекта.
Это уже другой вопрос. А вообще пока все теории, я не на шутку загружен