Re[4]: [proof-of-concept] compile time query language
От: Evgeny.Panasyuk Россия  
Дата: 11.07.16 20:19
Оценка:
Здравствуйте, VTT, Вы писали:

VTT>Нет конечно, в компайл-тайм только генерируется код метода, собирающего данные.

VTT>т.е. в рантайм нет никаких SQL строчек, а просто вызывается метод, выполняющий заданный в компайл-тайм запрос со всеми оптимизациями.

Да, подобная мысль была. Например, грубо говоря убрать этап текстового SQL из связки приложение + SQLite, плюс генерировать код запроса во время компиляции.
Но, это имеет смысл только для сценариев типа встраиваемых СУБД а-ля SQLite.
Отредактировано 11.07.2016 20:19 Evgeny.Panasyuk . Предыдущая версия .
Re[12]: [proof-of-concept] compile time query language
От: niXman Ниоткуда https://github.com/niXman
Дата: 11.07.16 20:28
Оценка:
Здравствуйте, niXman, Вы писали:

X>ща я тот код откопаю и гляну, как оно там планировалось...

ну понятно.
каждый тип на основе field_t хранит в себе хеш-сумму от имени колонки.
select() возвращает vector моих оберток поверх std::tuple, каждая из которых возвращает элемент тьюпла соответствующий хешь-сумме колонки.
for(auto &&row : db(from(foo).where(id > 42).select(name, age)))
    cout << row.get<name>();
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re[11]: [proof-of-concept] compile time query language
От: Erop Россия  
Дата: 11.07.16 21:07
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>
EP>    struct field
EP>    {
EP>        T number;
EP>    };
EP>

А смысл? Как предлагается это использовать?

EP>
EP>    template <typename T>
EP>    static auto &access(T &x)
EP>    {
EP>        return x.number;
EP>    }
EP>    // ... number function, number type, etc, etc
EP>};
EP>

Думаю, что лучше тогда уж сделать что-то вроде:
template<typename T> static auto member_ptr() { return &T::number; }
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[13]: [proof-of-concept] compile time query language
От: Evgeny.Panasyuk Россия  
Дата: 11.07.16 21:10
Оценка:
Здравствуйте, niXman, Вы писали:

X>>ща я тот код откопаю и гляну, как оно там планировалось...

X>ну понятно.
X>каждый тип на основе field_t хранит в себе хеш-сумму от имени колонки.
X>select() возвращает vector моих оберток поверх std::tuple, каждая из которых возвращает элемент тьюпла соответствующий хешь-сумме колонки.

Непонятно зачем hash, когда можно индексировать непосредственно по полному строковому имени.

X>
X>for(auto &&row : db(from(foo).where(id > 42).select(name, age)))
X>    cout << row.get<name>();
X>


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

Плюс синтаксис будет всё же немного другой — в select name это значение, а в get name это тип, но не суть, это легко обходится.
Re[12]: [proof-of-concept] compile time query language
От: Evgeny.Panasyuk Россия  
Дата: 11.07.16 21:34
Оценка:
Здравствуйте, Erop, Вы писали:

EP>>
EP>>    struct field
EP>>    {
EP>>        T number;
EP>>    };
EP>>

E>А смысл? Как предлагается это использовать?

В запросах к БД в SELECT указывается список полей которые должна содержать строка результирующего набора. Для удобства использования в коде нужно создавать структуру с аналогичным набором полей.
Смотри функцию handwritten из первого сообщения, в ней есть структура:
    struct Row
    {
        double value;
        int id;
        int number;
    } row;
    vector_noinline<Row> xs;

Которая соответствует полям в SELECT: SELECT foo.value, foo.id, foo.number FROM foo WHERE foo.id>42

Трюк выше нужен для автогенерации такой структуры. Собственно он и используется в исходном сообщении:
    for(auto &&x : to_vector(
                       from(foo)
                       .where(foo.id > 42_i)
                       .select(foo.value, foo.id, foo.number)
                   ))
    {
        using namespace std;
        cout << "ROW: " << x.id << " " << x.value << " " << x.number << endl;
        // cout << x.code; // - compile error, because .code is not in projection
    }


Вот упрощённый пример этого трюка
template<typename ...Columns>
struct row : Columns::field...
{};

template<typename ...Columns>
auto select(Columns...)
{
    return row<Columns...>{};
}


E>Думаю, что лучше тогда уж сделать что-то вроде:

E>
template<typename T> static auto member_ptr() { return &T::number; }


Не суть, вариантов много.
Re[12]: [proof-of-concept] compile time query language
От: Evgeny.Panasyuk Россия  
Дата: 11.07.16 21:41
Оценка:
Здравствуйте, Erop, Вы писали:

E>А смысл? Как предлагается это использовать?


Или другой пример на тему reification<char...>:
Начиная с C++11 можно обрабатывать строки в compile-time.
Можно создать строковый DSL, который на основе текстового кода создаёт конкретные структуры у которых имена полей сгенерированны из этих строк.
Совсем абстрактный пример:
auto x = MAKE_STRUCT(" struct Test { int foo, double bar };  ");
x.foo = 1;
x.bar = .5;


Причём подобным образом можно генерировать не только поля, но и например методы и т.п.
Отредактировано 11.07.2016 21:42 Evgeny.Panasyuk . Предыдущая версия .
Re[13]: [proof-of-concept] compile time query language
От: niXman Ниоткуда https://github.com/niXman
Дата: 11.07.16 21:56
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>Можно создать строковый DSL, который на основе текстового кода создаёт конкретные структуры у которых имена полей сгенерированны из этих строк.

почему-ьто мне кажется это невозможным... можно пример?
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re[14]: [proof-of-concept] compile time query language
От: Evgeny.Panasyuk Россия  
Дата: 11.07.16 22:11
Оценка:
Здравствуйте, niXman, Вы писали:

EP>>Можно создать строковый DSL, который на основе текстового кода создаёт конкретные структуры у которых имена полей сгенерированны из этих строк.

X>почему-ьто мне кажется это невозможным... можно пример?

Для этого нужна фича std::reification которую я описал выше.

Ты же можешь обработать строку " struct Test { int foo, double bar }; " во время компиляции и вытащить от туда имена "foo" и "bar"? (пример
Автор: Evgeny.Panasyuk
Дата: 12.10.14
как это сделать)
Для этого даже есть готовый генератор парсеров — Boost.Metaparse.

Вытащив имена, ты можешь их скормить в std::reification<'f', 'o', 'o'>, где компилятор автоматом сгенерирует специализацию (в этом и есть мой proposal):
template<>
struct reification<'f', 'o', 'o'>
{
    template <typename T>
    struct field
    {
        T foo;
    };
};

А далее, уже из этих специализаций можно слепить итоговую структуру через наследование, как в sqlpp11.
Отредактировано 11.07.2016 22:12 Evgeny.Panasyuk . Предыдущая версия .
Re[15]: [proof-of-concept] compile time query language
От: niXman Ниоткуда https://github.com/niXman
Дата: 11.07.16 22:20
Оценка: :)
я не понял одного: как имея строку, в компайл-тайме сгенерить переменную с именем, содержащимся в строке?
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re[16]: [proof-of-concept] compile time query language
От: Evgeny.Panasyuk Россия  
Дата: 11.07.16 22:27
Оценка:
Здравствуйте, niXman, Вы писали:

X>я не понял одного: как имея строку, в компайл-тайме сгенерить переменную с именем, содержащимся в строке?


Через std::reification. Это несуществующая пока фича. Ты пишешь std::reification<'f', 'o', 'o'>, а компилятор тебе даёт:
template<>
struct reification<'f', 'o', 'o'>
{
    template <typename T>
    struct field
    {
        T foo;
    };
    // ...
};
Это в том числе позволит из твоего определения:
using table = table_t<
   field_t<"id"_S, int>
  ,field_t<"name"_S, std::string>
>;
Получить синтаксис аналогичный sqlpp11 (то есть "через точку" result_row.name), без всяких макросов.

Реализовать в компиляторе должно быть достаточно просто.
Сейчас это можно сэмулировать разбирая сообщения об ошибках внешним скриптом.
Отредактировано 11.07.2016 22:28 Evgeny.Panasyuk . Предыдущая версия .
Re[16]: [proof-of-concept] compile time query language
От: niXman Ниоткуда https://github.com/niXman
Дата: 11.07.16 22:28
Оценка:
Здравствуйте, niXman, Вы писали:

X>я не понял одного: как имея строку, в компайл-тайме сгенерить переменную с именем, содержащимся в строке?


перечитал про reification.
и все равно не понял, как ты себе представляешь генерацию структуры в компайл-тайм, чтоб имена мемберов были те, что в строке... %)

т.е. ты действительно думаешь что такое реально сделать?:
auto x = MAKE_STRUCT("{int a; double b;}");
x.a = 3;
x.b = 3.14;
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re[17]: [proof-of-concept] compile time query language
От: niXman Ниоткуда https://github.com/niXman
Дата: 11.07.16 22:29
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>Это несуществующая пока фича.

ааа, где-то я этот момент упустил =)))
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re[17]: [proof-of-concept] compile time query language
От: Evgeny.Panasyuk Россия  
Дата: 11.07.16 22:32
Оценка: +1
Здравствуйте, niXman, Вы писали:

X>и все равно не понял, как ты себе представляешь генерацию структуры в компайл-тайм, чтоб имена мемберов были те, что в строке... %)


Это будет делать компилятор, ему не трудно. Сейчас, в самом языке std::reification не реализуем.

X>т.е. ты действительно думаешь что такое реально сделать?:

X>
X>auto x = MAKE_STRUCT("{int a; double b;}");
X>x.a = 3;
X>x.b = 3.14;
X>


Сейчас нет. Это я размышляю о предложении в ISO такой фичи (std::reification), которая позволит это реализовать.
Re[13]: [proof-of-concept] compile time query language
От: Erop Россия  
Дата: 11.07.16 23:19
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>Не суть, вариантов много.


Что бы описать структуру с несколькими полями, предлагается выводиться из всех таких структур? Или какая идея?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[13]: [proof-of-concept] compile time query language
От: Erop Россия  
Дата: 11.07.16 23:20
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>Причём подобным образом можно генерировать не только поля, но и например методы и т.п.

Методам ещё теля нужны...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[14]: [proof-of-concept] compile time query language
От: Evgeny.Panasyuk Россия  
Дата: 12.07.16 04:56
Оценка:
Здравствуйте, Erop, Вы писали:

EP>>Не суть, вариантов много.

E>Что бы описать структуру с несколькими полями, предлагается выводиться из всех таких структур? Или какая идея?

Наследование от всех таких структур
template<typename ...Columns>
struct row : Columns::field...
{};
Re[14]: [proof-of-concept] compile time query language
От: Evgeny.Panasyuk Россия  
Дата: 12.07.16 05:06
Оценка:
Здравствуйте, Erop, Вы писали:

EP>>Причём подобным образом можно генерировать не только поля, но и например методы и т.п.

E>Методам ещё теля нужны...

Тела комбинируются из готовых блоков. Например так как в Boost.Phoenix.
Re[18]: [proof-of-concept] compile time query language
От: flаt  
Дата: 12.07.16 05:11
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>Сейчас нет. Это я размышляю о предложении в ISO такой фичи (std::reification), которая позволит это реализовать.


https://dlang.org/mixin.html мощнее, почему не аналог его попросить у isocpp? Всё равно они сейчас включают всё подряд в стандарт
Re[19]: [proof-of-concept] compile time query language
От: Evgeny.Panasyuk Россия  
Дата: 12.07.16 05:15
Оценка:
Здравствуйте, flаt, Вы писали:

EP>>Сейчас нет. Это я размышляю о предложении в ISO такой фичи (std::reification), которая позволит это реализовать.

F>https://dlang.org/mixin.html мощнее, почему не аналог его попросить у isocpp? Всё равно они сейчас включают всё подряд в стандарт

Подобное вряд ли включат (хотя я только за), это намного сложнее — std::reification генерирует простую специализацию, а не произвольный текстовый код (который ещё и возможно в свою очередь сгенерирует другой текстовый код).
Re[15]: [proof-of-concept] compile time query language
От: Erop Россия  
Дата: 12.07.16 06:45
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

E>>Что бы описать структуру с несколькими полями, предлагается выводиться из всех таких структур? Или какая идея?


EP>Наследование от всех таких структур

EP>
EP>template<typename ...Columns>
EP>struct row : Columns::field...
EP>{};
EP>


Думаешь это удобно?

На самом деле, в С++ есть какой-то системный косяк уже давно с метапрограммированием.
Если уж развивать язык в эту сторону, то я бы лучше концепцию constexpr развивал. Всё равно у нас для реализации constexpr компилятор должен уметь исполнять CT с++ код без побочных эффектов, так что недалеко до того, что бы сделать так, что бы компилятор отдавал в макрос текст или АСТ или что-то вроде того, и получал наружу модифицированное тоже самое...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.