Tetris in C++ at compile time
От: landerhigh Пират  
Дата: 02.07.15 08:47
Оценка: 97 (15) +1 :))) :))) :))) :))) :))) :))) :))
Даже не знаю, сюда или сразу в КУ.

Тынц.

Пойду убъюсь апстену, наверное
www.blinnov.com
Re[2]: Tetris in C++ at compile time
От: Don Reba Канада https://stackoverflow.com/users/49329/don-reba
Дата: 02.07.15 12:55
Оценка: +2
Здравствуйте, Vamp, Вы писали:

V>Где-то эти ребята не договаривают. Я код не смотрел, но так как компиляция задает только один ход, предыдущее состояние может быть считано только в рантайме. А значит, игра по-определению не compile-time.


http://blog.mattbierner.com/stupid-template-tricks-super-template-tetris/#interactivity
Ce n'est que pour vous dire ce que je vous dis.
Re[2]: Tetris in C++ at compile time
От: watchmaker  
Дата: 09.07.15 01:26
Оценка: 4 (1)
Здравствуйте, Alexey F, Вы писали:

AF>template <typename T, T... chars> 
AF>constexpr auto operator""_string() {


AF>Это с C++14 пришло?


Нет, это n3599.

AF> сейчас так можно?


В gcc или clang уже можно.
Re[2]: Anything possible at compile time
От: MT-Wizard Украина  
Дата: 04.07.15 17:58
Оценка: 1 (1)
Здравствуйте, Went, Вы писали:

W>Здравствуйте. Почитал тему, правда не стал углубляться в детали. Но возникла такая простая мысль. Может, она и баян, ткните.

W>Почему бы не ввести в С++ такое правило: "все, что может быть вычислено во время компиляции, вычисляется во время компиляции, если того требует контекст". То есть любой код, который не зависит от процесса исполнения, считается статически константным, а все его результаты — априори constexpr. Пара примеров:
W>
W>template<typename T>
W>void f(T* px)
W>{
W>  // Если px указывает на константу, функция не будет делать ничего, код внутри if выкинется.
W>  if (!std::is_const<T>::value)
W>    *px = 0;
W>}
W>

W>
W>std::tuple<int, float, bool> tpl;
W>// Банально перебираем все члены туплы в цикле
W>for (size_t n = 0; n < std::tuple_type<decltype(tpl)>::value; ++ n)
W>  std::cout << std::get<n>(tpl) << " ";
W>

W>Есть какие-то ограничения, не позволяющие компилятору сделать такое? При том что введение такого расширения вроде не должно сломать имеющийся код.

Есть ограничение, называется "Страуструп категорически против". Я спросил у него что он думает о предложенном Александреску static if-е, он на меня чуть не накинулся с кулаками — настолько ему эта идея не нравится. Так что не в этой жизни
А ти, москалику, вже приїхав (с)
Re[2]: Tetris in C++ at compile time
От: Evgeny.Panasyuk Россия  
Дата: 02.07.15 13:19
Оценка: :)
EP>а ввод команд это сильное колдунство типа M-x butterfly "Amazing physics going on...".

Ввод кстати можно организовать через создание/удаление либо редактирование .hpp файлов прямо во время компиляции.
Re[2]: Tetris in C++ at compile time
От: Went  
Дата: 09.07.15 18:48
Оценка: +1
Здравствуйте, Alexey F, Вы писали:

AF>Стоп, а что, сейчас так можно?

А представляете какие возможности это несет? Brainfuck времени компиляции!
Re[2]: Tetris in C++ at compile time
От: wander  
Дата: 05.10.15 09:06
Оценка: +1
Здравствуйте, Alexey F, Вы писали:

AF>Здравствуйте, landerhigh, Вы писали:


AF>Стоп, а что, сейчас так можно?


Clang пишет вот что:

warning: string literal operator templates are a GNU extension [-Wgnu-string-literal-operator-template]

Re: Tetris in C++ at compile time
От: Vamp Россия  
Дата: 02.07.15 12:52
Оценка:
Где-то эти ребята не договаривают. Я код не смотрел, но так как компиляция задает только один ход, предыдущее состояние может быть считано только в рантайме. А значит, игра по-определению не compile-time.

L>Тынц.


L>Пойду убъюсь апстену, наверное
Да здравствует мыло душистое и веревка пушистая.
Re: Tetris in C++ at compile time
От: Evgeny.Panasyuk Россия  
Дата: 02.07.15 13:16
Оценка:
Здравствуйте, landerhigh, Вы писали:

L>Даже не знаю, сюда или сразу в КУ.


Я когда сначала увидел, то подумал что наверное вывод анимаций происходит через ошибки/предупреждения компилятора с управляющими escape последовательностями, где sleep это специально подобранные долгие инстантиниации, а ввод команд это сильное колдунство типа M-x butterfly "Amazing physics going on...". Но посмотрел описание — там читерство чистой воды, никакой магии.
Re: Tetris in C++ at compile time
От: Хон Гиль Дон Россия  
Дата: 02.07.15 13:45
Оценка:
Здравствуйте, landerhigh, Вы писали:

L>Даже не знаю, сюда или сразу в КУ.


L>Тынц.


L>Пойду убъюсь апстену, наверное


Круто чел упоролся.
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Re: Tetris in C++ at compile time
От: alex_mah Россия www.elsy.ru
Дата: 03.07.15 22:25
Оценка:
Здравствуйте, landerhigh, Вы писали:

L>Даже не знаю, сюда или сразу в КУ.


L>Тынц.


L>Пойду убъюсь апстену, наверное


А хри неть

Надо будет завтра попробовать.
Как раз gcc обновил на днях. Чо он всякой фигней занимается.
Отредактировано 03.07.2015 22:32 alex_mah . Предыдущая версия .
Re: Anything possible at compile time
От: Went  
Дата: 04.07.15 16:51
Оценка:
Здравствуйте. Почитал тему, правда не стал углубляться в детали. Но возникла такая простая мысль. Может, она и баян, ткните.
Почему бы не ввести в С++ такое правило: "все, что может быть вычислено во время компиляции, вычисляется во время компиляции, если того требует контекст". То есть любой код, который не зависит от процесса исполнения, считается статически константным, а все его результаты — априори constexpr. Пара примеров:
template<typename T>
void f(T* px)
{
  // Если px указывает на константу, функция не будет делать ничего, код внутри if выкинется.
  if (!std::is_const<T>::value)
    *px = 0;
}

std::tuple<int, float, bool> tpl;
// Банально перебираем все члены туплы в цикле
for (size_t n = 0; n < std::tuple_type<decltype(tpl)>::value; ++ n)
  std::cout << std::get<n>(tpl) << " ";

Есть какие-то ограничения, не позволяющие компилятору сделать такое? При том что введение такого расширения вроде не должно сломать имеющийся код.
Re[3]: Anything possible at compile time
От: Went  
Дата: 04.07.15 18:24
Оценка:
Здравствуйте, MT-Wizard, Вы писали:
MW>Есть ограничение, называется "Страуструп категорически против". Я спросил у него что он думает о предложенном Александреску static if-е, он на меня чуть не накинулся с кулаками — настолько ему эта идея не нравится. Так что не в этой жизни
Ну, допустим он принципиально против императивного подхода к метапрограммированию. Замечательно. Но тогда почему допустили constexpr и собираются развивать эту идею в С++17? constexpr-функции, значит это норма, а constexpr-операторы — нет? Действительно, непонятно.
Отредактировано 04.07.2015 18:24 Went . Предыдущая версия .
Re: Tetris in C++ at compile time
От: Alexey F  
Дата: 09.07.15 01:03
Оценка:
Здравствуйте, landerhigh, Вы писали:

Стоп, а что, сейчас так можно?

template <typename T, T... chars> 
constexpr auto operator""_string() {  
    return String<chars...>{};
}

...

decltype("abc"_string)


Это с C++14 пришло? Какой пункт стандарта это разрешил?
Re: Tetris in C++ at compile time
От: Дрободан Фрилич СССР  
Дата: 22.07.15 12:47
Оценка:
landerhigh:

L>Даже не знаю, сюда или сразу в КУ.

L>Тынц.

Тащемта я не очень секу в баше, но в конце строки вроде бинарь запускается "./tetris".
Не похоже на компильтайм.
Re[2]: Tetris in C++ at compile time
От: enji  
Дата: 22.07.15 13:19
Оценка:
Здравствуйте, Дрободан Фрилич, Вы писали:

ДФ>Тащемта я не очень секу в баше, но в конце строки вроде бинарь запускается "./tetris".

ДФ>Не похоже на компильтайм.

Насколько я понял, там берется игровой мир на начало хода из констант (из хидера) и в компайл-тайме преобразуется в соответствии с очередным ходом (который задан дефайном). При исполнении этот игровой мир пишется обратно в хидер. Далее запускаешь сборку с другим дефайном и так до победного
Re[3]: Tetris in C++ at compile time
От: Dym On Россия  
Дата: 27.07.15 10:08
Оценка:
W>А представляете какие возможности это несет? Brainfuck времени компиляции!
А главное: возможность не только прострелить ногу, но и снести всю башку на хрен .
Счастье — это Glück!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.