Want to read Slashdot from your mobile device? Point it at m.slashdot.org and keep reading!

 



Forgot your password?
typodupeerror
×
Programming Classic Games (Games) Open Source

Clang Plays Tetris -- Tetris As a C++ Template Metaprogram 68

New submitter mjvzb writes: Ever wish compiling was more fun? Well, I recently implemented Tetris as a C++ template metaprogram (code at Github). The game is played by recompiling its source, taking player input by compiler flag. The runtime program is only needed to print the game screen to the console and save the game state across compiler runs.

Implementing Tetris in templates is not as horrific as you may imagine, and I've put together a post covering the details. Once you get over the syntax, C++ metaprogramming is just like functional programming.
This discussion has been archived. No new comments can be posted.

Clang Plays Tetris -- Tetris As a C++ Template Metaprogram

Comments Filter:
  • C++ metaprogramming is just like functional programming.

    Say what?

    • by Anonymous Coward

      Nonfunctional programming is not really a different paradigm.

      • This is like "functional" programming about as much as playing hopscotch all the way to the next town is like taking the train.
    • by Anonymous Coward

      He presumably means "just like" in the same sense as in the phrase, "Eating a high end steak dinner is just like having someone saw through your kneecaps with a circular saw".

      • When I had a $100 steak in Las Vegas, it melted like butter in my mouth. I don't think taking a circular saw to your kneecaps has the same pleasant experience.
    • by phantomfive ( 622387 ) on Friday July 03, 2015 @05:27PM (#50041357) Journal
      metaprogramming is like functional programming in these senses:

      1) Uses lots of recusion
      2) Has no variables, only constants. Nothing is mutable.
      3) Has functions

      Because of 1 and 2, it helps to think in terms of functional programming if you want to do anything substantial.
      • Has no variables, only constants. Nothing is mutable.

        And... this is the definition of functional programming (referential transparency). So yes - it actually really *just like* functional programming, because it *is* functional programming.

    • by serviscope_minor ( 664417 ) on Friday July 03, 2015 @06:27PM (#50041577) Journal

      Say what?

      Template metaprogramming is exactly functional programming.

      Not only that, C++98 style was completely 100% pure with no mutabe state. You got recuursion and pattern matching (called [partial] specialisation). A class is essentially a function returning a type (well, multiple types) as internal typedefs. And as such functions are very much first class objects.

      C++11 added some local mutable state. constexpr functions can now be evaluated at compile time. Those yielding an int can be used as template arguments.

    • C++ TMP is turing complete and has no state. So yes it is functional. The point is not to write games though, but to write better tuned library code. I can only guess at the illicit substances the person doing this was ingesting.
  • by Anonymous Coward

    About semi-complex programs ending up re-implementing aspects of lisp or smalltalk-- just less elegantly.
    I think you've done it!

  • Syntax (Score:4, Interesting)

    by phantomfive ( 622387 ) on Friday July 03, 2015 @05:24PM (#50041343) Journal

    Once you get over the syntax, C++ metaprogramming is just like functional programming.

    No, the syntax is the entire thing wrong with C++ metaprogramming. It clearly wasn't designed for things like this. To clear up any doubt about the syntax, check out this file [github.com]. In addition the inscrutable error messages (although those have improved over the past decade). If anyone likes template metaprogramming, I suggest they just use LISP.

    That said, this project is really cool. Nice hack mattbierner.

    • by Threni ( 635302 )

      "In addition the inscrutable error messages"

      Well, Stroustrup himself describes them as "appalling", and Concepts was supposed to clean some of this stuff up. Roll on c++17...

    • It's also that C++ requires so many workarounds for template metaprogramming, so many help libraries, so many types, that writing, say template metaprogramming library that plays nice with Boost takes an infinitude of time and detail.

      Syntax isn't the majority of the problem. The rest of it is even worse.

    • I really wish people would get away from the character-by-character idea of program source, and rediscovered the Lisp idea that program is a data structure. In the case of what, say, C or C++ do, it would be nice to develop a means to construct things like functions and classes (with reading from traditional character based source files implemented as a thin parser layer in front of this), add them to a program, and then through things (in this data structure form) over to a compiler.
      Source files would then
  • I thought Tetris issued cease and desist letters for any implementation of its game, even if only for educational purposes.
  • Oh goody. So it's no different than any other monadic polymorphized differential functor system utilizing monoidal categories and parameterized applicative type expressions.

    Whew. Lucky me. I was worried about finding something to do over the holiday weekend.

  • That just just it. I remember Alexander Alexandrescu talking about such stupidity on Usenet in the mid90's. The code without a doubt is complex. slow and resource hogging since you use the compiler as an interpreter. Just a way of wasting watts ( the power it takes the computer to run ). No serious professional programmer would even try to attempt such a thing and there is really no reason to. It also flies in the face of things that Stroustrup and Sutter have been saying at conferences like CppCon2014 t
    • Re: (Score:2, Insightful)

      by Anonymous Coward

      Go fuck yourself. Really. If you don't realize that this is a toy and a very clever one at that, I'm not sure what to tell you. Sometimes some things are done to scratch an itch, or for fun or something. You can learn an awful lot about how to do things/not do things by playing around with projects like this. Oh right, you are a "serious professional programmer" with ZERO passion for the work you do.

      Also you seriously have zero sense of humor. You must be great fun at parties.

  • by Cafe Alpha ( 891670 ) on Friday July 03, 2015 @09:43PM (#50042167) Journal

    I've done that sort of metaprogramming. Years ago I wrote a compile-time Lisp interpreter. It's a HORRIBLE language.

    Look, say you have some advanced feature. You could write a library in scheme - it will take you 1 day to a week.

    You could write it in C++ templates. It will have a worse feature set than the scheme version, it will be much less readable (not that scheme is readable) and much harder to use. It will have unusable error messages. And a mockup version will take you months to write.

    Getting your mockup embedded in Boost and working well with it will take the help of a bunch of experts and a two or three times as much work.

    If you want it included in the Boost libraries, you'll need a couple years of work integrating it and getting it approved.

    Horrible.

  • Some time ago Elon Musk went on a rant about AI's destroying us.

    AI's I do not fear, but C++ templates... there he might have something.

  • Sometimes you have to ask yourself, just because I CAN do this ... SHOULD I do this?

    No.

    In this case, the answer is clearly no.

  • The title of this article is a little misleading, as this program works fine with the latest release of gcc (5.1) as well...

    [No changes, either to the program or the command-line are required, just use "g++" instead of "clang++".]

    Presumably it will also work with any compiler that supports a recent-enough version of the C++ standard and its proposed updates (with the command-line options updated accordingly).

    • by lott11 ( 1516269 )
      This shows how much intellectual development some of you have today. I guess most of you would say that spending your time in front of TV is a hobby. Or time well spent is watching sports on the boob tube. This is what I would expect from a large majority of all the illustrious critics. It is a mind game. It is a way of expanding the elasticity of thought, or distraction from every days monotony. I think of 17 different ways that it can be use for. cryptography, matter displacement, sorting crystalline stru
  • void foo(bool on) {
            if(on){
                #define FOO
            } else {
                #undef FOO
            }
    }

One person's error is another person's data.

Working...