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.
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.
Re:Terrifying. (Score:4, Insightful)
Re:Terrifying. (Score:5, Insightful)
If only the people who want to take on challenges like this put their skills to something actually useful....... There has GOT to be a better use of your knowledge and skills.
Sometimes people do things for fun........not because they want to please internet critics.
Re:Terrifying. (Score:4, Insightful)
Then why would they blog about it... and then submit an article to Slashdot describing and linking to their own god dam blog.
Because other people like to see it, and it's really cool. Specifically, if you don't like this kind of thing, you shouldn't be on Slashdot. See also this [slashdot.org].
Re: (Score:3, Insightful)
I am mystified how people can read this and not realize it was just a little fun thing to do in his spare time. Or do you spend every waking minute of your life doing serious things with your knowledge and skills?
Re: (Score:2)
* Don't you have a life?
* What a nerd
* You have too much time on your hands
* There has GOT to be a better use of your knowledge and skills
* There's something wrong with you
Ignore those critics and do what you want anyway. Your life will be better for it.
Re: (Score:2, Insightful)
Nonsense.
No one should ever have to work with C++ metaprogramming in their work.
It should not be encouraged. It's a horrible dead end. Sadly it isn't the only dead end in computer science.
Re: (Score:3)
No one should ever have to work with C++ metaprogramming in their work.
He wasn't working.
He was playing.
Re: (Score:2)
Re: (Score:2)
No one should ever have to work with C++ metaprogramming in their work.
In your own words: nonsense.
Like all tools it requires skill and good taste to use. You can do stupid stuff with it, but then there isn't a language out there which doesn't let you make stupid design decisions.
Re: Terrifying. (Score:1)
Metaprogramming is useful for real things. It allows to automate some code generation instead of weiting redundant code by hand, which is definitely a great thing.
Re: (Score:2)
Metaprogramming is wonderful. C++ templates are horrible.
"Captain, you're asking me to work with equipment which hardly very far ahead of stone knives and bearskins. " - Mr. Spock
Re: (Score:1)
Not any more horrible than any other pure functional programming language, and people tend to find those elegant more than horrible.
Re: (Score:2)
Pure functional programming is pretty horrible too.
Take the classic book, "numerical recipes in Fortran"
( http://apps.nrbook.com/fortran... [nrbook.com] ) and try to convert all of the routines in there to pure functional style with no mutable variables, structures, arrays and no non-recursive loops.
Big step backwards. It will be horrible, it will obscure the code and it will run slowly.
It's funny that computer science doesn't build on old successes. They had good computer languages for doing math going back to the 50s
Re: (Score:2)
No, the most terrifying and ridiculous thing would be if it was rewritten in JavaScript which outputted Java source that piped C# source that then, when compiled and executed, outputted as an x86 ASM program that produced a PHP script.
Re:Terrifying. (Score:4, Interesting)
This is the most terrifying and ridiculous thing I've seen in my entire life.
Americans have spent more than a trillion hours watching reality TV. That is far more terrifying and ridiculous than someone playing with a Turing-complete compiler meta-language.
Re: (Score:3)
This is the most terrifying and ridiculous thing I've seen in my entire life.
If only the people who want to take on challenges like this put their skills to something actually useful....... There has GOT to be a better use of your knowledge and skills.
It is one of the first things people do in programming - building games. My son is on the verge of learning computing, and he wishes to build a few games. Once these simpler things are achieved, more complex things are easier to do by more people.
C++ metaprogramming is just like functional progra (Score:1)
Say what?
Re: (Score:1)
Nonfunctional programming is not really a different paradigm.
Re: (Score:2)
Re: (Score:1)
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".
Re: (Score:2)
Re:C++ metaprogramming is just like functional pro (Score:5, Insightful)
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.
Re: (Score:3)
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.
Re:C++ metaprogramming is just like functional pro (Score:4, Informative)
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.
Re: (Score:1)
proves the old maxim (Score:2, Insightful)
About semi-complex programs ending up re-implementing aspects of lisp or smalltalk-- just less elegantly.
I think you've done it!
Re: (Score:2)
Bjarne Stroustrup and Lennart Poettering have a lot in common....
Syntax (Score:4, Interesting)
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.
Re: (Score:1)
"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...
Re: (Score:2)
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.
Re: (Score:3)
Source files would then
Re: (Score:2)
Is it allowed? (Score:1)
Tetris v. Xio (Score:2)
Reference: The Tetris Company's victory in court three years ago [slashdot.org]
Re: (Score:2)
What if I want to use a functional programming language, but none of them are fast enough
If Fortran isnt fast enough, C++ will only make it worse.
One sad thing (Score:2)
someone was asking for the luajit implementer, Mike Pall, to add copying data structures as something optimized by the compiler and he was told that not sharing structures was a "code smell"
Oh God. The implementer is so out of touch and focused on low level efficiency that he doesn't recognize the basics of reliable programming.
Re: (Score:2)
Hint:
you do not have to write C++ like this.
I use C++11 a lot. It is a very nice language, as long as you avoid abominations like these.
One problem is that template metaprogramming quickly became "cool", so everybody started to overuse it (*cough* Boost.Spirit *cough*). The result is a barely manageable mess that produces huge binaries.
But if used sparingly, combined with all the niceness C++11 brought us, it is really nice to develop with modern (!) C++, especially if you are working on rather low-level st
...just like functional programming! (Score:2)
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.
Re: (Score:1)
How complicated can you make a rube goldberg machine? That's what this is thing is, a hacker's rube goldberg machine. Stop being so serious dickwads.
Stupid and bad coder. (Score:1)
Re: (Score:2, Insightful)
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.
Blink. Horrible. Really horrible. (Score:3)
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.
Misplaced Mistrust (Score:2)
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.
Re: (Score:2)
Could versus Should (Score:2)
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.
Really "C++ Plays Tetris", not Clang... (Score:3)
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).
Re: (Score:1)
Re: (Score:2)
I don't see why you can't have multistage compiling so that you can use the full power of (whatever language) at "compile" time.
You should be able to have mutable data structures at compile time.
You should be able to have tables and arrays.
And custom file and network io.
Security hole? Like running a bash script isn't a security hole.
Preprocessors are cool (Score:2)
void foo(bool on) {
if(on){
#define FOO
} else {
#undef FOO
}
}