Библиотека Boost - классификация

Boost - одна из самых больших, функциональных и интересных библиотек для C++. Чего в ней только нет... На официальном сайте boost.org в документации существует классификация библиотек, входящих в состав Boost.
Мало кто применяет все это изобилие на практике. Некоторые библиотеки очень простые, а некоторые настолько сложны, что для правильной работы с ними нужно быть экспертом в C++. Некоторые чрезвычайно полезны, другие скорее демонстрируют потенциальные возможности языка, но вряд ли пригодятся вам в повседневной работе.

Официальное деление библиотек на группы показалось мне недостаточно точным, поэтому я решил сделать свое собственное деление.

Вот моя классификация:

Дальнейшие планы

В планах перенос в этот блог из личного архива и написание новых статей, посвященных темам. Итак, грандиозные планы по возобновлению блога:

  • языки программирования (возможно переводы глав из книг с собственными комментариями)
  • библиотека Boost (возможно переводы документации и комментарии)
  • Развитие C++
  • NoSQL СУБД (также возможны переводы)
  • разработка собственного языка программирования
  • интернет, социальные сети, пиринговые сети
  • софт
  • прочие идеи из самых разных областей

Как сделать структурную типизацию

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

Простейший пример: если есть некий тип данных POINT { float x, y; }, и есть некий тип MyPoint { float x, y; } то благодаря структурной типизации тип MyPoint можно применять там же, где и POINT (и наоборот). Более того, если объявлен некоторый тип MySuperPoint { int i, j; float z; char str[10]; float z, k, y; } то его тоже можно применять вместо POINT и MyPoint. Для структурной типизации достаточно совпадения имен внутренних имен и совместимости типов.

Еще немного о шаблонах

Небольшое дополнение.
Первое - решено отказаться от угловых скобок, и вместо них использовать обычные круглые со спецсимволом #. Угловые скобки приносят больше проблем, чем пользы. В языке D от угловых скобок отказались, в Scala отказались (там в пользу квадратных) и правильно сделали. В том же Си макросы используют обычные круглые скобки (даже без спецсимволов) и ничего.
Использование простых круглых скобок для шаблонов не есть хорошо с точки зрения понимания кода (смешиваются понятия вызова функции и макроподстановки). Вместо этого предлашается использовать скобки с символом #. То есть шаблон будет выглядеть так:

MyTempl#(x,y)

Таким образом, макрос - это идентификатор, начинающийся с решетки (мы как-бы имеем в виду что сам по себе макрос - код, относящийся к метауровню), а шаблон -  идентификатор , аргументы которого начинаются с решетки. В общем вполне логично.

Шаблоны без аргументов все равно должны иметь скобки (также как и функции). Синтаксис типа "MyTempl#" (то есть шаблон с решеткой на конце) скорее всего недопустим, так как можно спутать с макросом.

Метапрограммирование 5 - сводим все воедино

Итак, в предыдущих статьях мы получили, что в общем случае шаблоны - это чистые квазицитаты; что любые аргументы шаблонов и макросов - это фрагменты AST (объекты типа expr). Поскольку в квазицитаты можно в общем случае подставлять любые фрагменты AST, а не только имена типов и числовые константы (как в С++), то совершенно логично, что шаблоны можно расширить и обобщить. Мы выяснили,  что практически аналогично шаблоны могут получать в качестве аргументов нечисловые константы и функции. Также было сделано предположение, что аргументами шаблонов могут быть и произвольные блоки кода. Кроме того, сами блоки кода могут быть параметризированы подобно шаблонам. Именно этим мы и займемся.

Метапрограммирование - 4 - тип expr и шаблоны

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

Метапрограммирование - макросы 3

В Nemerle почему-то существует сразу 4 вида макросов: обычные, макроатрибуты, макрооператоры и лексические макросы (макро-ключевые слова). Я не планирую делать язык с полностью изменяемым синтаксисом, так как считаю, что это нарушает целостность дизайна языка.
Рассмотрим варианты синтаксиса макросов

Итак, в обычные макросы я уже внес изменение: любой вызов макроса должен начинаться с символа решетки #. Это позволит визуально отличить макрос от любого другого элемента кода даже в редакторе без подсветки синтаксиса (а в IDE значительно облегчит эту самую подсветку).

Макроатрибуты - это макрос, оформленный как атрибут (то есть в унарых квадратных скобках). Я считаю, что такой синтаксис создает путаницу - визуально он неотличим от обычного атрибута, а по сути - нечто совершенно иное (выполняющийся на этапе компиляции код!). Поэтому в Neo никаких макроатрибутов не будет, а для применения макросов к конструкциям, к которым в Nemerle применяли макроатрибуты, следует использовать обычный синтаксис макросов.

Для облегчения жизни программистов имеет смысл ввести еще одно правило: если макрос имеет единственный аргумент, то скобки для него необязательны (единственный аргумент - это как раз случай макроатрибутов). Это позволит писать в синтаксисе, близком к макоратрибутам и даже у унарным макрооператорам. В качестве примера - сплайс-строки в Neo:

string w = "World";
string s = #s "Hello $w";


Сплайс-строки работают в точности также, как в PHP, но - что важно - вычисляются на этапе компиляции. Это наиболее безопасная, быстрая и удобная замена printf() из всех известных мне. Использование в сплайс-строках доллара, или решетки, или любого другого символа или сочетания - это уже вопрос реализации: #s - это макрос, и понятно что можно написать другой аналогичный макрос, использующий другой синтаксис сплайсинга (например, заключение переменных в фигурные скобки - тоже вполне востребованный вариант)


Что же касается возможностей Nemerle по модификации синтаксиса и введению новых синтаксических конструкций, то на данный момент я считаю такую возможность избыточной. Обычные макросы более чем достаточно покрывают потребности кодогенерации и метапрограммирования. А синтаксис все-же должен быть единым, а не своим собственным в каждом файле.