Здравствуйте, VladD2, Вы писали:
VD>Больше? Он не делал то что от него требовалось. И друго полезного тоже ничего не делает.
Так же легко повернуть, что и код на Nemerle не делает, того что от него требовалось, и другого полезного ничего не делает.
VD>Серьезно? Ну, сделай ее менее строгой. Хотя что-то я не заметил там какой-то строгости. Недоработки вот видны сразу. Например, контроль количества параметров у фунций отсуствует. Можно такую несуразность как Min() с одинм параметром сделать.
Что несуразного в Min с одним параметром? Не больше чем в умножении на 1. К тому же добавить контроль количества параметров очень легко, что я и показал в следующем коде. А так у меня даже был Min с любым количеством параметров, не помню только выкладывал или нет.
VD>Это проблемы твоей реализации и выбронного тбой подхода. Сделай по другому. Главное, чтобы по фунциональности было тоже самое.
Серьезно не понимаю, зачем добиваться той же функциональности с точностью до миллиметра. Разговор с моей стороны идет, что по объему кода никакого пятикратного преимущества у Nemerle нет, а есть максимум двухкратное, как по количеству строк, так и по объему файла за вычетом ведущих проблелов. А уж если сравнивать по количеству нажатий на кнопки в среде оснащенной Intellisense'ом.
VD>У тебя код не делал то что нужно.
Это на Nemerle не делал то что нужно
VD>Это спорно только для тебя. И то потому что ты любиль спорить и не любишь призновать своей не правоты (сам такй, по этому знаю не по наслышке ).
Всего второй раз говорю здесь о Nemerle, а уже любитель спорить. Что касается правоты/не правоты, то я не любитель бинарной логики.
На вопрос вполне может быть несколько ответов.
VD>Заметь, люди которые знают оба зыка откровенно помеялись над твоим кодом.
Пускай, я пока не смеюсь.
VD>К тому же если все так хорошо, что же ты переписал код как только увидел мой вариант?
А откуда такая уверенность. Я переписал, код как только получил доступ к форуму и смог посмотреть на исходные условия. Да и что в твоем примере такого существенного?
VD>Да уж это неверотное приемущество, вот только этого не требовалось по условию задачи и не ясно что оно дает.
Инкапсуляция всегда небесполезна.
VD>То-то я гляжу, все так легко, что дня не хвает на реализацию.
Пишу, в основном, после работы. Кстати, стараюсь никогда не оправдыватся, но, ха-ха, вчера у меня прорвало счетчик воды в квартире и половину ее залило, к счастью без особых последствий, но пять 15 литровых ведер воды, я с пола собрал.
VD>Что же ты ее не написал в этом же духе сразу? И как выглядит код твоих трансформаций? Заметь я привел совсем примитивные примеры образцов. Они у тебя уже порождают кучу кода. А даже небольшое их усложнение приведет к настоящей горе кода. Причем совершенно нечитаемого.
Я подумал, подумал и написал сопоставление с образцом на C#.
VD>Кстати, использовать Eval() для доступа к значениям литералов плохой подход. В будущем поведение может измениться и этот код превратится в ошибочный, а компилятор снова не сможет ничего подсказать.
С этим не согласен. К тому же добавить свойство — всего одна дополнительная строка, а работа с литералами у меня и так типизированная.
VD>Да? А как понимать, то что ты полностью переписал свой код и отказался от так защищаемого тбой RemoveOneParameterMin()?
Я сделал это только чтобы не спорить по, на мой взгляд, ничтожному поводу. К тому же я прочитал, что нужен вынос конвертации в отдельные функции.
VD>Ты уже начиташь сам себе противоречить и своими же действиями опровергать свои же слова .
Отнюдь, я просто показал широту своих взглядов и легкость к изменениям.
VD>Отнюдь. Как раз посетители отлично выявляют необработанные классы иерархии, если конечно, правильно их готовить.
В таком случае хотелось бы увидеть пример правильно приготовленного, на иерархии буквально из одного двух классов.
VD>Серьезно? Ну, я почти на верняка пишу на C# дольше тебя (начал еще в 2000-ном когда первые превью появились), но вот почему-то никак не могу привыкнуть к тому, что вместо:
Я тоже начал в 2000 с бета версий, правда, тогда в основном упирал на VB.NET, ну да в контексте .NET это не так важно.
И оценка на brainbench у нас примерно одинаковая по C#.
VD>Расскажи, как ты к такому привыкаешь?
VD>Я даже могу тебе подсказать, как сократить еще по строчки в каждой из функий.
Мысль неплохая.
А>>Вот код:...
VD>Ну, что же. Ты не плохо учишся. Это называется переписать код в близком к функциональному стилю. Заметь, сходу ты такой код порадить не был способен. Пришлось подглядывать за поей версией и тырить от туда идеи. Я же просто писал в выбранном стиле, что называется не думая.
Да ничего там не пришлось подглядывать. Говорю же, написал, сразу после отправки версии с методами в классе, когда прочитал условия задачи.
У меня к тому же есть отличие, не надо проводить повторную конвертацию, если в результате первой конвертации в выражении получились, образцы подходящие для условий конвертации. Впрочем, можешь заявить, что это я у WolfHound подглядел.
VD>Теперь еще раз разберем полеты.
VD>Объем кода
VD>После устранения в твоем коде совсем уж затариенных в одну строку вещей кода получилось около 200 строк. Причем он еще остался "ужатым". В реальных проетах код будет по рыхлее. Мой код занимает 75 строк.
VD>Получается кода более чем в 2 раза больше. Его вдвое больше при любых других измерения (в словах, в символах и т.п.). Если твой код отформатировать скажем по правилам РСДН, то его станет в трое больше.
Сравнивал, получалось не больше двух раз. К тому же и в коде на Nemerle в паре мест есть ужимания, где код уместно перенести на строчку/другую.
И еще в большинстве случаев я стараюсь использовать полные имена для переменных, а не одно-двухбуквенные имена.
VD>Читаемость кода
VD>Вряд ли ты станешь спорить, что теперь наш код иделогически близок. Но вот что лучше читается? На мой взгляд действия собранные вместе и без лишних заголовков функций читается намного лучше. Его и поддерживать проще.
C# неплохо читается, можно по отдельности классы разбирать.
VD>Развитие кода
VD>Если нам понадобиться добавить новую операцию обработки кода мне будет достаточно создать новый метод, а тебе придется лазить по всем классам и добавлять в каждый из них по фукнции.
Во все не по всем. За счет наследования метод надо будет добавить буквально в нескольких классах.
VD>Если прийдется добавить новую ветку AST, то тебе прийдется добавить один класс и реализовать в нем по методу для каждого метода обработки, а мне добавить в каждый метод обработки по записи. Причем компилятор сам подксажет где это нужно сделать.
Так и мне подскажет. Набираешь override (даже несколько букв) вот и готово тело метода.
А вот код сопоставления по образцу:
static Expr RemoveMulToOne(Expr expr)
{
Mul mul = null; Expr first = null; Lit lit = null;
if (new Pattern<Mul, Expr, Lit>().Match<Expr>(expr, ref mul, ref first, ref lit))
{
if (lit.Eval() == 1) return first;
}
return expr;
}
static Expr RemoveMaxOfLiterals(Expr expr)
{
Max max = null; Lit lit1 = null; Lit lit2 = null;
if (new Pattern<Max, Lit, Lit>().Match<Expr>(expr, ref max, ref lit1, ref lit2))
{
return new Lit(Math.Max(lit1.Eval(), lit2.Eval()));
}
return expr;
}