Re[9]: Функциональное программирование в Nemerle
От: Аноним  
Дата: 18.05.07 20:54
Оценка: -1
Здравствуйте, 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;
  }
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.