Рубрика «макросы» - 4

Вместо эпиграфа:
Сидит 30-летний программист за компом, программу отлаживает, обложился справочниками, документацией, дедлайн подходит, уже вторые сутки сидит, взъерошенный, немытый, красноглазый — не получается, глючит где-то.
Тут входит в комнату его немолодая мама, смотрит на него с тоской и говорит с укором:
— Всё играешься…

Поскольку обзоры никто полностью не читает, сразу «проматывая» до «выводов», то резюмирую здесь:

  1. Gamdias Hermes Ultimate — это дорогая, «имиджевая», универсальная (даже несмотря на то, что позиционируется она как игровая) клавиатура с расширенным функционалом: после тщательной «настройки» и «обкатки макросов» она позволит не только с успехом «валить фрагов», но и удобно работать;
  2. она построена на фирменных переключателях (свичах, кнопочках) Черри (Cherry MX) — мне досталась на «чёрных» (Black) — они идеально подходят не только для игр, но и для работы: нажимаются легко и практически бесшумно, срабатывают чётко, их очень приятно нажимать, о чём, собственно, и говорят все фанаты «механики»;
  3. в клавиатуре применена новая запатентованная технология GAMDIAS Element — специальные резиновые вставки под колпачками клавиш, которые увеличивают скорость обратного хода клавиш и снижают шум;
  4. все клавиши подсвечиваются красивым, насыщенным красным светом, яркость подсветки регулируемая;
  5. раскладка классическая ANSI: длинные «шифты» и «одноэтажный» Enter (т. е., ничто не помешает использовать её и для работы — собственно, мне лично именно такая раскладка нравится больше всех);
  6. имеется 13 дополнительных клавиш, 5 из которых традиционно расположены слева вертикальным рядком, 3 — под пробелом, ещё три — под правым Ctrl, и две — «по бокам» «стрелки вверх» «курсорного креста», все дополнительные клавиши, как и «основные», сделаны на тех же фирменных свичах — никаких «полумер», «концевичко́в от мыши» и прочего;
  7. клавиатура крута до невозможности: кроме наличия так называемого NKRO абсолютно все клавиши поддаются переназначению (ну, кроме Fn, конечно);
  8. переназначать можно как на «другую клавишу», так и на разнообразные макросы (которые легко записать и отладить в программной оболочке Hera), и ещё много разных «служебных» функций;
  9. как таковые макросы можно без проблем записывать непосредственно с само́й клавиатуры, не загружая «Геру»;
  10. есть 10 (десять!) мгновенно переключаемых профилей, которые ещё и «связываются» с программами;
  11. в комплекте идёт удобная, красивая и вполне эргономичная подставка под запястья, которой можно, когда компьютер выключен, «накрыть» клавиатуру чтобы она не пылилась;
  12. кроме своего функционала, клавиатура весьма красива своей строгостью и изысканной прямотой линий, большой подсвеченный логотип посередине выгодно дополняет имидж;
  13. в клавиатуру также встроены удлинители порта USB, выхода наушников и микрофонного входа компьютера, т. е., мышку и гарнитуру можно непосредственно «втыкать в клаву», а не лезть к задней стенке компьютера;
  14. дополнительные клавиши в сочетании с возможностью перепрограммирования и «навешивания» на клавиши макросов придают этой клавиатуре сходство с пультом управления звездолётом как внешне, так и «по ощущениям» и все ваши друзья, только взглянув на неё, дико обзавидуются, а «потрогав» её — сразу побегут в магазин за такой же!

Читать полностью »

Недавно в нашем проекте возникла необходимость программно получать информацию о перечислениях (enum), например, имена констант в виде строк, а также общий список всех имеющихся в enum-е констант.

enum Suit { Spades, Hearts, Diamonds, Clubs };

Обычно решение данной задачи базируется на дублировании значений, например, внутри switch-а:

switch(value)
{
    case Spades:   return "Spades";
    case Hearts:   return "Hearts";
    case Diamonds: return "Diamonds";
    case Clubs:    return "Clubs";
    default:       return ""
};

И возможно, для небольших перечислений такое решение действительно является приемлемым, однако если значений много, и особенно, если они время от времени меняются, то рано или поздно разработчик может забыть дописать или изменить соответствующие строки в switch. Сюда прибавляются и другие очевидные минусы, например сам факт необходимости дублирования значений уже вызывает у меня некоторое недовольство.

Поэтому я постарался найти путь, который вообще не требовал бы дублирования, но при этом полностью справлялся бы с поставленной задачей. Думаю, у меня получилось.

Далее в статье я опишу способ, позволяющий организовать рефлексию для enum-ов. Кому интересно — добро пожаловать под кат.
Читать полностью »

Друзья, к нам в JetBrains периодически заходят в гости хардкорные ученые и разработчики популярных технологий. В таких случаях мы просим наших гостей сделать небольшой доклад и рассказать коллегам о своей работе.

Встреча с Евгением Бурмако: макросы в Scala - 1

В грядущий вторник, 9 февраля, у нас в гостях будет Евгений Бурмако, PhD студент EPFL (École polytechnique fédérale de Lausanne), работающий в команде, ответственной за поддержку и эволюцию Scala. Во время своего пребывания в EPFL Евгений придумал макросы для Scala и реализовал их в официальном компиляторе. Последнее время Евгений работает над новым проектом, который значительно упрощает метапрограммирование в Scala и предоставляет новые возможности авторам средств анализа кода и интегрированной разработки. Читать полностью »

От переводчика

Процедурные макросы — одна из наиболее ожидаемых фич Rust. На данный момент процедурные макросы возможно писать только под нестабильную версию компилятора, хотя есть несколько контейнеров, вроде syntex, позволяющие делать ограниченную кодогенерацию в рамках стабильного компилятора. Однако ситуацию это особо не облегчает, поскольку интерфейс к AST остаётся нестабильным, и, хотя авторы syntex стараются идти в ногу с ночными сборками, иногда случаются фейлы из-за изменений в структуре AST.
В этом блог посте один из участников core team — Nick Cameron — поделился своим видением будущего процедурных макросов. Хотя пост полон технических подробностей по внутренностям компилятора, мне показалось, что хабрасообществу может быть интересно заглянуть немного за кулисы разработки Rust.

Фреймворк для процедурных макросов

В этом посте я расскажу, как, по моему мнению, должны выглядеть процедурные макросы. Я уже рассказывал про синтаксис в другом посте, а когда мы опубликуем API для процедурных макросов, то напишу пост и про него. Я уже описывал целый ряд изменений в системе макросов, так что здесь я в чём-то повторюсь (отчасти противореча прошлому посту), но раскрою больше подробностей.
Читать полностью »

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

  • Безопасный вызов метода
  • Неиспользуемые переменные
  • Превращение в строку
  • Запятая в аргументе макроса
  • Бесконечный цикл

Заранее предупреждаю: если Вы думаете увидеть под катом что-то крутое, головоломное и сногсшибательное, то ничего такого в статье нет. Статья про светлую сторону макросов.Читать полностью »

Макросы в haxe: выполняем код прямо во время компиляции (и это нормально) - 1В предыдущей статье я немного рассказал про haxe — простой и удобный язык общего назначения. Однако, кроме простоты и понятности, есть в нём и вещи глубокие — такие, как концепция макросов — кода, который выполняется в процессе компиляции. Почему в haxe нет традиционных Си-подобных макросов и какие возможности нам отрывают haxe-макросы, и пойдёт речь в статье.
Читать полностью »

Язык Julia не поддерживает такую технику программирования, хорошо зарекомендовавшую себя в языках Haskell, Prolog, Erlang, Scala, Mathematica, как pattern matching. Но разрешает писать макросы, которые позволяют исправить этот фатальный недостаток. Выглядит это примерно так:

julia> immutable X a end

julia> immutable Y a ; b end

julia> @case(Y(X(9),2),  Y(4,3)-> 55, Y(X(k),2)->1+k)
10

Исходный код доступен на github.
Похожую (но гораздо более развитую и готовую для использования) можно взять здесь, но она слишком большая, что бы разбирать ее как пример в статье.
Читать полностью »

О блоках в ObjC и правильной работе с ними написано очень много, в том числе и на хабре. Вопрос о том, как правильно работать с self в блоках, чтобы избежать циклических ссылок, регулярно задается на собеседованиях. При использовании таких фреймворков, как ReactiveCocoa количество блоков в коде сильно возрастает, при этом увеличивается шанс допустить ошибку и потерять в памяти объекты. Про попытку окончательно решить эту проблему, метапрограммирование для с99 с экстеншнами и блоками + хипстерсткие макросы с @ под катом.
Читать полностью »

ZoG на стероидахКогда я писал о разработке игры "Thud!", я уже сетовал на некоторую избыточность полученного описания. Простота языка ZRF имеет свою оборотную сторону — для того чтобы написать на нем что-то более менее сложное, часто, приходится дублировать значительные фрагменты кода. Подобная избыточность, как известно, приводит не только к увеличению объема ручной работы, но и значительно усиливает риск появления в коде разнообразных ошибок (поскольку процесс отладки ZoG приложений весьма не тривиален, это является существенным моментом).

Как можно бороться с подобной избыточностью?

Разумеется, с помощью макросов! Проблема в том, что макросы ZRF недостаточно выразительны для этого. Адриан Кинг, в процессе разработки игр Scirocco и Typhoon, пришел к аналогичному выводу и разработал свой собственный, расширенный язык макросов, работающий как внешний препроцессор. Сегодня, я расскажу о возможностях этого языка и постараюсь, на примере Thud!, показать его использование в процессе разработки ZRF-приложений.

Читать полностью »

В качестве промо-довеска к ранее опубликованной статье приложу немного опыта и исходного кода для специфической аудитории, а именно пользователей SAP. Однажды мне пришлось полгода позаниматься изучением и программированием в этой чудесной системе, а точнее в модуле CRM. Поскольку, с одной стороны, средства для броузинга данных в SAP крайне скудны, а, с другой, я был избалован собственными привычками делать все мышкой, однажды от скуки я занялся любимым делом — «Свободой выборки», но в ABAP & light версии.
Читать полностью »


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js