Как стать автором
Обновить

Всё новое — хорошо забытое старое

Чулан
Бродя по интернету (уже не помню что искал), набрёл на Sun Self. Проект 1995 года (!!!), теперь безнадёжно заброшенный. Тем не менее, в нём уже реализована куча фич, о которых мечтают программеры (визуальное программирование, например). По ссылке можно посмотреть фильм, чтобы иметь представление о системе.
Спрашивается: чем занимались программисты 12 лет?
Sun Self
Всего голосов 14: ↑13 и ↓1 +12
Просмотры 388
Комментарии 13

Метапрограммирование в C++

Ненормальное программирование *
Метапрограммирование — это «программирование программ», то есть написание некой промежуточной программы, результатом которой будет некая часть другой программы. Самый простой пример метапрограммирования — это шаблоны C++. Вместо написания десяти одинаковых функций для разных типов, мы пишем шаблон, и компилятор сам соберет нам эти десять функций.
Читать дальше →
Всего голосов 69: ↑64 и ↓5 +59
Просмотры 34K
Комментарии 55

Сила и красота декораторов

Python *
Одним из самых сложных для понимания и осознания элементов языка является декоратор, хотя по сути это очень простая вещь, доступная для понимания даже начинающему программисту. Новых Эверестов я не открываю, а лишь предлагаю краткий обзор возможностей и несколько типичных примеров использования. Этакий короткий экскурс в метапрограммирование на питоне.

Upd 1: изменил несколько категоричное утверждение о несходстве паттерна Декоратор и одноимённой языковой конструкции на более мягкое.

Читать дальше →
Всего голосов 98: ↑97 и ↓1 +96
Просмотры 80K
Комментарии 30

1. Metaprogramming patterns — 25кю. Метод eval

Ruby *
Программирование, которым я периодически по-прежнему занимаюсь, постепенно меняет свой стиль и всё больше связано с метапрограммированием. При этом нельзя сказать, что обычное программирование мне опостылело. Просто как любой программист, я ищу пути для всё большей модульности, краткости, внятности и гибкости кода, и в метапрограммировании мне видится нераскрытый потенциал (несмотря на давний необозримый интернетовский флуд по метапрограммированию идущий ещё от Lisp). :)

Хочу начать вести блог, посвященный метапрограммированию на Ruby.
Читать дальше →
Всего голосов 10: ↑10 и ↓0 +10
Просмотры 21K
Комментарии 12

2. Metaprogramming patterns — 22кю. Reuse в малом — bang!

Ruby *
На этот раз буду рассказывать не только про метапрограммирование, но и про Ruby, а также про алгоритмы — сегодня вспомним классику и посмотрим, как она нам явится в Ruby-строках реализации метода qsort. Блог только начинается, про настоящее метапрограммирование пока говорить рано, поэтому позволю себе отступления от основной темы.
Читать дальше →
Всего голосов 14: ↑13 и ↓1 +12
Просмотры 2.9K
Комментарии 3

3. Metaprogramming patterns — 20 кю. Замыкания

Ruby *
В предыдущем посте мы затронули важнейшую концепцию — замыкание (closure).
Суть этой концепции в том, что в любой блок как бы заключается «весь окружающий мир» так, как он виден в контексте, где блок создается. Правильнее сказать, что в блок заключается не весь окружающий мир (пространство имён), а фиксируется точка зрения на окружающий мир (пространство имён).
Читать дальше →
Всего голосов 32: ↑27 и ↓5 +22
Просмотры 5.3K
Комментарии 8

Io Language: Метапрограммирование

Ненормальное программирование *

Метапрограммирование в языке io



В продолжении серии статей про чудесный язык io я таки собрался написать про метапрограммирование.
habrahabr.ru/blogs/crazydev/29375
habrahabr.ru/blogs/crazydev/28254
habrahabr.ru/blogs/crazydev/28167
habrahabr.ru/blogs/crazydev/28041

Метапрограммирование — создание программ, которые создают другие программы как результат своей работы (либо — частный случай — изменяющие или дополняющие себя во время выполнения).
© Православная википедия

Совершенно не интересен канонический смысл термина «метапрограммирование», любой тьюринг-полный язык имеющий библиотеки IO способен генерировать исходные тексты программ на произвольном языке. Намного интересней возможность самопознания программы — интроспекция, а так же генерация и модификация самой себя в процессе выполнения.

Если посмотреть на крестных отцов io, то можно увидеть Lisp, Smalltalk, Self и другие динамические языки. Но все они решают проблему метапрограммирования по своему, например Lisp генерирует код в процессе компиляции из макросов, очень мощных штук. Smalltalk содержит развитую систему «отражений» (reflection) позволяющую гулять по дереву объектов в любую сторону. Io пошел по пути smalltalk'а и строит свои динамические механизмы на базе объектной модели, а не универсальности синтаксиса (как лисп).

Читать дальше →
Всего голосов 38: ↑35 и ↓3 +32
Просмотры 2.2K
Комментарии 22

Метапрограммирование

Программирование *
imageМетапрограммирование — общее название класса средств автоматизации труда программиста. Под ним понимают и кодогенерацию, и макросы препроцессора в C, и шаблоны C++, и макросы LISP, и создание своих DSL, а так же использование динамических языков с генерацией кода на лету. Nemerle поддерживает еще один вариант метапрограммирования.

Читать дальше →
Всего голосов 32: ↑26 и ↓6 +20
Просмотры 3.5K
Комментарии 47

Итератор по кортежу (boost)

Чулан
Итератор по кортежу И так, нам нам нужно огранизованно пройтись по всем членам кортежа. Мне это понадобилось для сохранения в xml — файл конструкций типа std::vector<boost::tuple<...>>. Кстати, пишу я это в Qt.

Ну да ладно, к делу.
Читать дальше →
Всего голосов 25: ↑5 и ↓20 -15
Просмотры 642
Комментарии 3

Katahdin: метапрограммирование на грани фантастики

Ненормальное программирование *
Katahdin — это интерпретируемый язык программирования, в котором синтаксис и семантика могут изменяться во время исполнения. Чтобы идея стала ясна, сразу приведу пример с официального сайта. В примере определяется операция получения остатка от деления ("%" в C, «mod» в Pascal).
class ModExpression : Expression {
  pattern {
    option leftRecursive;
    a:Expression "%" b:Expression
  }
 
  method Get() {
    a = this.a.Get...();
    b = this.a.Get...();
    return a - (b * (a / b));
  }
}

Читать дальше →
Всего голосов 62: ↑54 и ↓8 +46
Просмотры 2K
Комментарии 93

Примеры использования языкоориентированного программирования

Ненормальное программирование *
Идея language oriented programming (LOP), состоит в том, что во время разработки программы, постоянно создаются миниязыки. Они могут как расширять основной язык разработки, так и быть отдельными языками. Лучшим языком для LOP является Common Lisp с его макросами, но здесь речь пойдёт не о нём. Примеры использования LOP с Common Lisp советую посмотреть в замечательной книге Peter Seibel Practical Common Lisp. Я считаю, что LOP один из самых простых и эффективных способов программирования. Мы описываем задачу и предметную область на самом подходящем для этого языке, а потом стараемся его реализовать.

Я разрабатываю браузерные игры на Ruby, поэтому часто использую LOP, как для расширения языка и встроенных DSL (Ruby позволяет делать это очень хорошо), так и для создания миниязыков связанных со сложной игровой механикой. В этой статье я рассмотрю простое расширение основного языка, встроенный мини-DSL и два не встроенных языка. Буду приводить примеры в близкой мне тематике, надеюсь они будут вполне понятны.

Читать дальше →
Всего голосов 35: ↑34 и ↓1 +33
Просмотры 1.7K
Комментарии 18

Expressions в C# — impress yourself!

.NET *
.NET 4.0 уже не за горами и принесет кучу всего нового, нужного и не очень, крутого и суперкрутого. Однако и в старом добром .NET 3.5 есть много разных интересных фич, которые не используются в повседенвной работе, но иногда здорово облегчают жизнь разработчикам. Одна из таких замечательных штук — это Expressions.
Много текста и кода
Всего голосов 51: ↑39 и ↓12 +27
Просмотры 92K
Комментарии 23

Изменение поведения метода в зависимости от контекста

Ruby *
По сути задачка для гиков:
Есть класс А, у него метод save, принимающий один параметр, у параметра есть значение по умолчанию (допустим, true). Экземпляр класса А, принимающий метод save без параметров, автоматически принимает true и работает в соответствии с этим флагом. Есть класс В, у которого есть поле типа А. При вызове метода save для этого поля изнутри контекста класса В без параметров управление должно передаваться другой реализации метода, которая принимает по умолчанию значение параметра false. Примерно как работает override, но не глобально, а внутри только одного класса.
Читать дальше →
Всего голосов 10: ↑5 и ↓5 0
Просмотры 584
Комментарии 7

Шаблонная магия, паттерн CallWithType

C++ *
Доброго времени суток, уважаемые Xабровчане!

В этой статье я хочу рассказать о том, как в С++ можно делать преобразование данных времени компиляции (типов) в данные времени выполнения (целые значения) и обратно.

Пример:
int nType = ...;
 
if( boost::is_base_of< ISettable, /* ... magically resolve type hidden by nType here ... */ >::value )
{
    // Do something
}
else
{
    // Do something else
}

Весь этот топик направлен на то, чтобы понять, что же надо написать вместо «magically resolve type hidden by nType here».
Читать дальше →
Всего голосов 37: ↑35 и ↓2 +33
Просмотры 5K
Комментарии 49

Шаблонная магия, метафункция IsValidExpression

C++ *
Доброго времени суток, уважаемое Хабрасообщество.

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

Пример:
/* Определяем метафункцию HasF, которая позволяет определить наличие функции f() у любого класса. */
DECLARE_IS_VALID_EXPRESSION(
    HasF,
    ( ( U * ) NULL )->f() /* Это выражение компилируемо только если присутствует U::f() */ );
 
struct Foo{ void f(); };    
struct Bar{};
 
BOOST_STATIC_ASSERT( HasF< A >::value );  /* Тут константа HasF< A >::value будет true */
BOOST_STATIC_ASSERT( !HasF< B >::value ); /* Тут константа HasF< A >::value будет false */

Как Вы уже, наверное, догадались мы будем думать как написать макрос DECLARE_IS_VALID_EXPRESSION.
Читать дальше →
Всего голосов 32: ↑29 и ↓3 +26
Просмотры 2.2K
Комментарии 14

Вычисление простых чисел на шаблонах C++

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

Алгоритмы проиллюстрированы кодом на Scheme, поэтому осторожно: скобочки!

Читать дальше →
Всего голосов 46: ↑42 и ↓4 +38
Просмотры 19K
Комментарии 44

Язык программирования D — продолжение

Программирование *D *
Доброго всем времени суток!
Итак, я решил продолжить рассказ о замечательном языке программирования D.
Моя прошлая статья была о мультипарадигменности языка, о том, что он естественным и гармоничным образом поддерживает большинство современных популярных стилей программирования.
В этот раз я задумал осветить другую сторону языка — менее общую и фундаментальную, но не менее полезную. А именно возможности метапрограммирования и compile-time computations.
Читать дальше →
Всего голосов 32: ↑31 и ↓1 +30
Просмотры 3.1K
Комментарии 75

Язык D2 и метапрограммирование: всё страньше и страньше

Программирование *D *
Не так давно Monnoroch опубликовал несколько прекрасных вступительных статей по языку D2, и это было хорошо. Но, прочитав последнюю статью, посвящённую метапрограммированию, захотелось сделать ещё лучше и раскрыть тему немножко подробнее. Дьявол, как известно, в деталях — и именно внимание к мелочам делает реализацию meta-парадигмы в D2 столь удобной. Если вы не читали статью Monnoroch, рекомендую вначале ознакомиться с ней, т.к. в рамках этой не хотелось бы тратить время на базовые вещи.

Итак, если вам уже знакомы некоторые возможности шаблонов в D2, я хотел бы подробнее рассказать о том, что сопутствует им — инструментах статической интроспекции, нюансах CTFE и даже такой запретной, но притягательной вещице, как mixin.

Цель — больше наглядных примеров кода с комментариями и меньше слов.
Читать дальше →
Всего голосов 35: ↑35 и ↓0 +35
Просмотры 3.5K
Комментарии 38

Метапрограммирование

Программирование *
Целью этой статьи есть привлечение внимания широкой ИТ-шной общественности к метапрограммированию и всем его многочисленным формам и техникам. Я постарался собрать классификацию всего, что знаю по этой теме, и показать ее применимость не только в умозрительных задачах, но и в разработке рядовых приложений. Но это скорее план для дальнейшего изучения и, я надеюсь, толчек для более активного обсуждения.

UPD: Более новая статья: Метапрограммирование с примерами на JavaScript. И лекция по статье на Youtube (лекция записана в Киевском политехническом институте 18 апреля 2019 года в рамках курса «100 видео-лекций по программированию»):


Читать дальше →
Всего голосов 43: ↑33 и ↓10 +23
Просмотры 40K
Комментарии 28

Полуавтоматическая конвертация лени в код

Программирование *.NET *C# *
Всем доброго дня. Сегодня я хочу поговорить об автоматической генерации кода C#. Например, свойства в классах, описывающих сущности предметной области, обычно описываются по совершенно одинаковой схеме. И мне элементарно лениво писать для каждого примитивного свойства одинаковые конструкции. Немного спасает применение сниппетов и активных шаблонов, но когда приходит нужда что-то поменять в этой схеме, то приходится перелопачивать кучу кода. Так почему бы это однообразие не генерировать автоматически в процессе сборки?
В какой-то момент кинетическая энергия творчества ненадолго пересилила потенциальную энергию лени, и результатом этого стала маленькая библиотечка для автоматической генерации некоторых исходных файлов программы на основе внешних данных. Приглашаю под кат всех ленивых (в хорошем смысле этого слова) разработчиков на C#.
Читать дальше →
Всего голосов 33: ↑29 и ↓4 +25
Просмотры 6.1K
Комментарии 17