“На небе и земле, Горацио, больше вещей, чем мечтают в вашей философии.& #8221;
Proto является основой для создания встраиваемых доменных языков на C++. Он предоставляет инструменты для построения, проверки типов, преобразования и выполненияшаблонов выражения. Более конкретно, Proto предоставляет:
- Структура данных дерева экспрессии.
- Механизм предоставления выражений дополнительного поведения и членов.
- Оператор перегружает для постройки дерево от выражения.
- Утилиты для определения грамматики, которой должно соответствовать выражение.
- Расширяемый механизм для немедленного выполнения шаблона выражения.
- Расширяемый набор преобразований деревьев для применения к экспрессионным деревьям.
Шаблоны экспрессии — это продвинутый метод, который разработчики библиотек C++ используют для определения встроенных мини-языков, ориентированных на конкретные проблемные домены. Этот метод был использован для создания эффективных и простых в использовании библиотек для линейной алгебры, а также для определения генераторов парсера C++ с читаемым синтаксисом. Но разработка такой библиотеки предполагает написание непомерного количества нечитаемых и неподдерживаемых шаблонов. Повышаю. Proto облегчает разработкудоменных встроенных языков (EDSL). Используйте Proto для определения примитивов вашего мини-языка и позвольте Proto справиться с перегрузкой оператора и конструкцией дерева экспрессии. Немедленно оцените дерево выражения, пройдя по нему объект функции. Или преобразуйте дерево выражения, определив грамматику вашего мини-языка, украшенного ассортиментом трансформаций дерева, предоставленных Proto или определенных вами. Затем используйте грамматику, чтобы дать пользователям короткие и читаемые синтаксические ошибки для недействительных выражений. Больше нет mumbo-jumbo — библиотека шаблонов выражений, разработанная с помощью Proto, является декларативной и читаемой.
Прото является EDSL для определения EDSL.
В этой документации используются следующие соглашения об именах и форматировании.
- Код находится в<
fixedwidth
font
>и является синтаксисом.
- Заменимый текст, который вам нужно будет предоставить, находится в<
italics
>.
- Если имя относится к свободной функции, оно указывается следующим образом:<
free_function()
>; то есть оно находится в кодовом шрифте, а за его именем следует<()
>, чтобы указать, что это свободная функция.
- Если имя относится к шаблону класса, оно указывается следующим образом:<
class_template<>
>; то есть оно находится в шрифте кода, а за его именем следует<<>
>, чтобы указать, что это шаблон класса.
- Если имя относится к функционально-подобному макросу, оно указывается следующим образом:<
MACRO()
>; то есть оно является верхним шрифтом кода, а за его именем следует<()
>, чтобы указать, что это функционально-подобный макрос. Объектоподобные макросы появляются без следа<()
>.
- Имена, которые относятся кпонятиямв общем смысле программирования, указаны в CamelCase.
![[Note]](/img/note.png) |
Note |
Кроме того, такие заметки, как эта, указывают несущественную информацию, которая обеспечивает дополнительный фон или обоснование. |
Наконец, вы можете мысленно добавить следующие фрагменты кода в этот документ:
#include <boost/proto/proto.hpp>
namespace mpl = boost::mpl;
namespace fusion = boost::fusion;
namespace proto = boost::proto;
using proto::_;