• Пишем расширения c Roslyn к 2015 студии (часть 2)

    • Tutorial
    … Эта статья является продолжением первой части о написании расширений к студии с Roslyn.

    Тут я буду описывать что делать, если мы хотим сгенерировать/поменять какой-нибудь код. Для генерации кода мы будем статические методы класса SyntaxFactory. Некоторые методы требуют указать ключевое слово/тип выражения/тип токена, для этого есть перечисление — SyntaxKind, который содержит все это вместе.

    Хорошо, давайте для примера сгенерируем код, содержащий число 10. Это делается просто.

    SyntaxFactory.LiteralExpression(SyntaxKind.NumericLiteralExpression, SyntaxFactory.Literal(10))

    Я не шутил, когда говорил, что чтобы создать код проще всего распарсить строку. Благо, SyntaxFactory предоставляет кучу методов для этого (ParseSyntaxTree, ParseToken, ParseName, ParseTypeName, ParseExpression, ParseStatement, ParseCompilationUnit, Parse*List).

    Но это не путь настоящего самурая.
    Давайте генерировать по пути самурая
    • +27
    • 5,8k
    • 2
  • Пишем расширения c Roslyn к 2015 студии (часть 1)

    • Tutorial
    Перейти ко второй части

    Для начала, нам потребуется:

    1. 2015 студия
    2. SDK для разработки расширений
    3. Шаблоны проектов
    4. Визуализатор синтаксиса
    5. Крепкие нервы

    Полезные ссылки: исходники roslyn, исходники и документация roslyn, roadmap с фичами С# 6.

    Наверное вас смутило, что вам потребуются крепкие нервы и вы хотите пояснения. Все дело в том, что весь API компилятора — это низкоуровненное кодогенерерированное API. Вы будете смеяться, но простейший способ создать код — это распарсить строку. Иначе вы либо погрязнете в куче нечитаемого кода, либо будете писать тысячи extension-методов, чтобы ваш код выглядел синтаксически не как полная кака. И еще две тысячи extension-методов, чтобы оставаться на приемлемом уровне абстракций. Ладно, я вас убедил, что писать Roslyn расширения к студии это плохая идея? И очень хорошо, что убедил, а то кто-то из читающих эту статью может написать второй ReSharper по прожорливости ресурсов. Не убедил? Платформа все еще сырая, бывают баги и не доработки.

    Вы меня не убедили
  • Я не могу написать бинарный поиск

      Недавно (буквально два года назад) тут пробегала статья Только 10% программистов способны написать двоичный поиск. Двоичный поиск — это классический алгоритм поиска. Мало того, это еще чрезвычайно простой алгоритм, который можно очень легко описать: берем отсортированный массив, смотрим в середину, если не нашли там число, в зависимости от того, что в середине — ищем это число этим же методом либо в левой части, либо в правой, откидывая средний элемент. Для функций также, просто берем не массив, а функцию. Все очень и очень просто, алгоритм описан почти везде, все баги словлены и описаны.

      Так вот, я не могу реализовать двоичный поиск. Для меня он ни капельки не тривиален. Наверное, я ненастоящий программист. А ведь так и есть, я всего-лишь студент, но ведь это не оправдание? Если точнее, я не могу реализовать хороший корректный красивый двоичный поиск. Все время у меня вылезает проблема либо с корректностью, либо с красивостью, либо и с тем, и с другим. Так что, да, заголовок немного желтоват.
      Прежде чем читать этот топик, напишите свою версию бинарного поиска — для отсортированного массива. Причем, в зависимости от параметра, поиск должен выдавать или первый элемент, или любой из дублирующих. Еще для сравнения, напишите бинарный поиск для функций

      А в чем, собственно, проблема?
    • Извлечение квадратного корня с помощью нормальных алгоритмов Маркова

        Захотел я однажды вычислить квадратный корень с помощью нормальных алгоритмов Маркова (НАМ).

        Кратко о НАМ:
        • Существует список замен одной подстроки на другую, называемых правилами
        • Ищем с начала списка первое правило которое можем применить и применяем его для первого вхождения
        • Если такое правило было обнаружено, то возвращаемся к предыдущему пункту и просматриваем список правил сначала
        • Если правило было заключительным, то завершаем работу
        • Если больше нет правил, которые мы можем применить, то завершаем работу

        Итак, вроде бы все просто? Однако, как писать программы на НАМ?
        Для себя я сделал примерно такой план:
        • Пытаемся написать обычный алгоритм использующий только строки
        • Следим за тем, чтобы последние замены не пересекались с первыми
        • Переворачиваем алгоритм и записываем с конца к началу

        Итак, вернемся к вычислению квадратного корня. Мы будем использовать «детский» метод (он же арифметический), который основывается на том простом факте, что квадрат числа — это сумма нечетных чисел от 1 до 2n-1:
        • 1 = 12 = 1
        • 1 + 3 = 22 = 4
        • 1 + 3 + 5 = 32 = 9
        Читать дальше →
      • Свои судоку на своих батниках

          image
          С предыдущего хабратопика я понял, что хабражителям очень понравился сапер на своих батниках и поэтому рискнул написать еще одну игру, а именно — Судоку. И опять же, на своих батниках.
          Как и Minesweeper, Sudoku for cmd.exe имеет ряд следующих преимуществ:
          • Оригинальное лого
          • Двухцветный текстовой графический интерфейс (фон — чёрный, текст — серый)
          • Возможность воспроизведения программы практически на любом компьютере
          В общем, это Судоку для настоящих мужчин. И скачать эту замечательную игру вы можете прямо сейчас, воспользовавшись этими ссылками: Plain Text | Google Docs
          Читать дальше →
        • Свой сапер на своих батниках

            image

            Однажды захотелось мне написать Minesweeper… на батниках. И я его написал.

            Встречайте!!! Minesweeper for cmd.exe

            Итак, особенности данного продукта:
            • Оригинальное лого
            • Двухцветный текстовой графический интерфейс (фон — чёрный, текст — серый)
            • Возможность воспроизведения программы практически на любом компьютере
            В общем, это настоящий сапер (а не те жалкие подобия — KMines и сапер for Windows) для настоящих мужчин. И далее вы сможете прочитать как сделать свой крутой сапер.
            Читать дальше →
          • Почему Mono хорош

              Мы с участниками социальной сети open-life.org решили сделать перевод статьи Джо Шилдза (Jo Shields) «Here we go again – why Mono doesn’t suck». В результате получилась статья «Почему Mono хорош». Копию данного перевода можно прочитать здесь: Почему Mono хорош — open-life.org

              Прим.: Если кто захочет инвайт на open-life.org — стучитесь в личку

              Я участник Debian Mono Group, Debian CLI Applications Team, и Debian CLI Libraries Team. И уже в течении года работаю над сопровождением пакетов проекта Mono и программ, которые используют его в ОС Ubuntu (и Debian). Мне хорошо известны горячие споры, угрозы и последующие переходы на личности, и сейчас я принимаю ваш «вызов». В этой статье я говорю от себя лично — не от проекта Debian, не от Ubuntu, не от Mono, и не потому, что меня попросил мой начальник.

              Вам хотелось «объективного пояснения, чем хорош Mono, почему он не представляет угрозы и почему его следует включить в Ubuntu по умолчанию»? — Я отвечу на эти 3 вопроса по очереди, затем предложу общий вывод к этой статье, а так же к более широкому движению «Анти-Mono». Это сообщение подписано GPG (прим. переводчика: GPG=GNU Privacy Guard — свободная альтернатива набору криптографического ПО PGP) для подтверждения факта его публикации без изменений. Оригинальный текст доступен по адресу retro.apebox.org/herewegoagain.txt чтобы каждый желающий мог проверить его подлинность самостоятельно.

              Читать дальше →