В первой части мы обсудили, как добиться переноса определения шаблона фунции из заголовочного файла в исходник, если набор типов, для которых должен быть инстанциирован шаблон известен заранее. В этой части мы посмотрим, как добиться этого красиво.
Читать полностью »
Рубрика «метапрограммирование» - 4
Инстанциирование шаблонов функций по списку типов (Часть 2)
2014-09-06 в 21:44, admin, рубрики: c++, метапрограммирование, ненормальное программированиеМетаобъектный протокол Common Lisp на примере реализации прототипной объектной системы
2014-07-21 в 20:33, admin, рубрики: common lisp, метапрограммирование, ооп, Программирование, метки: common lispВведение
Common Lisp, а точнее, его объектная система, CLOS, предоставляет пользователю языка совершенно замечательный механизм, а именно, метаобъектный протокол.
К сожалению, очень часто этот компонент языка незаслуженно обходится без должного внимания, и в данной статье я постараюсь это несколько компенсировать.
Вообще, что такое метаобъектный протокол? Очевидно, это слой объектной системы, который, судя по названию, каким-либо образом оперирует над ней самой, и управляет ей.
Для чего он нужен? На самом деле, в зависимости от языка и объектной системы, список применений может быть практически безграничен. Это как добавление коду декларативности(аннотации в Java и аттрибуты в C#), так и разнообразная генерация кода и классов в рантайме(здесь можно вспомнить разнообразные persistance и ORM фреймворки), так и многое другое.
С моей лично точки зрения, лучше всего метаобъектные протоколы себя зарекомендовали со стороны закрепления паттернов проектирования на уровне объектной системы. Такие паттерны, как, скажем, синглтон, которые в языках без достаточно развитого ООП приходится снова и снова реализовывать методом copy-n-paste, в моем любимом Common Lisp создаются буквально из пары десятков строчек кода и переиспользуются в дальнейшем исключительно указанием метакласса[1].
Тем не менее, в нижеследующем тексте я хочу сосредоточиться на кое-чем более интересном, а именно — на изменении правил работы самой объектной системы, самих ее основ. Именно добавление возможностей подобного изменения и было ключевой целью разработчиков метаобъектного протокола для Common Lisp.
Итак, дальнейший текст будет посвящен созданию прототипной объектной системы, подобной JavaScript, в Common Lisp, с использованием метаобъектного протокола и интеграцией ее в CLOS. Полный код проекта доступен на github[2].
Метапрограммирование (с примерами на JavaScript)
2014-07-04 в 14:16, admin, рубрики: javascript, абстракция, анализ, Анализ и проектирование систем, динамическое связывание, замыкания, индивидуация, интерпретация, метаданные, метамодель, метапрограммирование, позднее связывание, примеси, Программирование, проектирование Эта статья, еще одна попытка переосмысления метапрограммирования, которые я периодически предпринимаю. Идея каждый раз уточняется, но в этот раз удалось подобрать достаточно простых и понятных примеров, которые одновременно очень компактны и иллюстративны, имеют реальное полезное применение и не тянут за собой библиотек и зависимостей. В момент публикации я буду докладывать эту тему на ОдессаJS, поэтому, статью можно использовать, как место для вопросов и комментариев к докладу. Формат статьи дает возможность более полно изложить материал, чем в докладе, слушатели которого, не освобождаются от прочтения.
Популярное понимание метапрограммирования обычно очень размытое, и чаще всего, заканчивается такими вариантами:
- Шаблоны и макросы, используемые при компиляции
- Программа, которая изменяет саму себя
- Программа, генерирующая другую программу
Предлагаю следующее определение:
Метапрограммирование — это парадигма программирования, построенная на программном изменении структуры и поведения программ.
И дальше мы разберем как это работает, зачем это нужно и какие преимущества и недостатки мы получаем в итоге.
SFINAE — это просто
2013-12-13 в 5:51, admin, рубрики: c++, c++11, sfinae, template, метапрограммирование, метки: c++, c++11, sfinae, template, метапрограммированиеTLDR: как определять, есть ли в типе метод с данным именем и сигнатурой, а также узнавать другие свойства типов, не сойдя при этом с ума.

Здравствуйте, коллеги.
Хочу рассказать о SFINAE, интересном и очень полезном (к сожалению*) механизме языка C++, который, однако, может представляться неподготовленному человеку весьма мозгоразрывающим. В действительности принцип его использования достаточно прост и ясен, будучи сформулирован в виде нескольких чётких положений. Эта заметка рассчитана на читателей, обладающих базовыми знаниями о шаблонах в C++ и знакомых, хотя бы шапочно, с C++11.
* Почему к сожалению? Хотя использование SFINAE — интересный и красивый приём, переросший в широко используемую идиому языка, гораздо лучше было бы иметь средства, явно описывающие работу с типами.Читать полностью »
Динамическая интерпретация метамоделей
2012-10-15 в 18:18, admin, рубрики: Анализ и проектирование систем, метамодель, метапрограммирование, моделирование, предметная область, Программирование, Проектирование и рефакторинг, метки: model, метамодель, метапрограммирование, моделирование, предметная область Продолжая серию статей по метапрограммированию, подготовил выжимку из достаточно объемной своей работы о повышении уровня абстракций в информационных системах. Хабр конечно любит практические решения, и их таки есть у меня, но материала много и я вынужден разделить его на несколько статей. А для иллюстрации эффективности подхода, могу сказать, что внедрение его во множестве живых проектов позволило повысить эффективность разработки в десятки раз, например, создавать приложения баз данных со структурой в несколько сотен таблиц за неделю и портировать решения между платформами за считанные часы. Эта статья носит характер теоретический и наполнена специфической терминологией, без которой, к сожалению, она была бы значительно объемнее.
Читать полностью »
Как я Boost.Any с Boost.MPL дружил
2012-10-10 в 9:57, admin, рубрики: boost, c++, mpl, метапрограммирование, ненормальное программирование, Песочница, метки: boost, c++, mpl, метапрограммирование Недавно мне пришлось работать с кодом, в котором задача передачи параметров произвольных типов решена с использованием стандартных STL контейнеров, параметризованных типом boost::any.
Например:
void foo (std::vector<boost::any>& args) {
// do smth.
}
Предыдущий разработчик был не очень аккуратен и внутри функции работа с содержимым boost::any основывалась на предположении об исходном типе данных, то есть если преобразование boost::any_cast не проходило, то параметр пропускался. В определенных случаях такой способ обработки приемлем и примеры этой методики работы можно посмотреть тут.
Однако, мне хотелось несколько обобщить исходные предположения о типе данных.
Читать полностью »
Объектно-ориентированное функциональное метапрограммирование или каррирование метода
2012-08-01 в 15:59, admin, рубрики: closure, php, каррирование, метапрограммирование, ооп, Программирование, функциональное программирование, частичное применение, метки: closure, PHP, каррирование, метапрограммирование, ооп, функциональное программирование, частичное применение
Вдохновившись статьей Еще раз о каррировании и частичном применении в PHP, в голову пришла реализация частичного применения метода, именно метода, а не функции.
Читать полностью »
Интерактивная книга «Радугоны» на HTML5 и JavaScript для Windows 8 (неделя в Store)
2012-06-06 в 13:53, admin, рубрики: html, html5, javascript, windows, Windows 8, метапрограммирование, метки: html5, javascript, Windows 8, метапрограммирование Уважаемый хаброчитатель, поведаем тебе сегодня об опыте практической разработки приложений для Windows 8, подготовке, отладке и публикации проектов под этой платформой, и про применение одного из методов метопрограммирования (о чем мы писали раньше) для анимации в стеке технологий HTML5 + JavaScript + Metro style apps. Ведь теперь в Windows 8 можно применять JavaScript не только в браузере, но и для создания нативных «оконных» приложений. И вот, мы уже 6 дней в сторе, приложение можно установить бесплатно, более того, мы не приводим тут код, т.к. его можно свободно посмотреть после установки приложения прямо по папочкам js, css, html, fonts, images. Можно качать и смотреть, обфускацию мы не применяли. Пока HTML5 приложения ни как не защищены в маркете, но Microsoft обещает в самое ближайшее время реализовать защиту.
Читать полностью »
Вникаем в метаклассы Ruby
2012-05-16 в 17:21, admin, рубрики: eigenclass, ghost class, metaclass, ruby, singleton class, метаклассы ruby, метапрограммирование
Примечание переводчика: данный пост является логическим развитием, а точнее «предысторией» поста Вникаем в include и extend и был подсказан в комментариях к нему пользователем murr, за что ему большое спасибо.
Классы и объекты в Ruby связаны между собой достаточно затейливо и не сразу можно понять что к чему. Из-за особого назначения классов очень легко потерять из вида тот факт, что классы — это тоже объекты Ruby. От «обычных» объектов их отличает два вещи: они служат образцом для создания новых объектов и они являются частью иерархии классов. Все верно, классы могут иметь экземпляры себя (объекты), суперклассы (родителей) и подклассы (детей).
Если классы — это объекты, то у них должен быть свой собственный класс. Классом всех классов (как объектов) в Ruby является класс Class:
# один из способов создать новый класс
Dog = Class.new
# общепринятый способ создания класса
class Dog
# какая-то реализация собачьего поведения
end
Dog.class
=> Class
Полуавтоматическая конвертация лени в код
2012-04-12 в 7:25, admin, рубрики: .net, метапрограммирование, Программирование, метки: c++, метапрограммирование Всем доброго дня. Сегодня я хочу поговорить об автоматической генерации кода C#. Например, свойства в классах, описывающих сущности предметной области, обычно описываются по совершенно одинаковой схеме. И мне элементарно лениво писать для каждого примитивного свойства одинаковые конструкции. Немного спасает применение сниппетов и активных шаблонов, но когда приходит нужда что-то поменять в этой схеме, то приходится перелопачивать кучу кода. Так почему бы это однообразие не генерировать автоматически в процессе сборки?
В какой-то момент кинетическая энергия творчества ненадолго пересилила потенциальную энергию лени, и результатом этого стала маленькая библиотечка для автоматической генерации некоторых исходных файлов программы на основе внешних данных. Приглашаю под кат всех ленивых (в хорошем смысле этого слова) разработчиков на C#.
Читать полностью »