<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom">

	<title>Planet D</title>
	
	<link href="http://planet.dsource.org/" />
	<id>http://planet.dsource.org/_atom.xml</id>
	<updated>2012-05-27T18:00:24+00:00</updated>
	<generator uri="http://www.planetplanet.org/">Planet/2.0 +http://www.planetplanet.org</generator>

	<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/dplanet" /><feedburner:info xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" uri="dplanet" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><entry xml:lang="en">
		<title type="html">DerelictFreeGLUT</title>
		<link href="http://feedproxy.google.com/~r/TheOneWithD/~3/c6gCXwEM41Q/" />
		<id>http://dblog.aldacron.net/?p=1057</id>
		<updated>2012-05-21T13:37:52+00:00</updated>
		<content type="html">&lt;p&gt;I&amp;#8217;ve noticed that a great many modern OpenGL tutorials are using &lt;a href="http://freeglut.sourceforge.net/" target="_blank"&gt;freeglut&lt;/a&gt;. As such, I thought it would be a good idea to add a binding for it to &lt;a href="https://github.com/aldacron/Derelict3" target="_blank"&gt;Derelict3&lt;/a&gt;. It isn&amp;#8217;t 100% complete. It&amp;#8217;s missing the font type declarations at the moment, until I work out the best way to handle them. Until then, if you need the rest of it, I can say that it compiles and loads. Haven&amp;#8217;t tested it at all yet.&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TheOneWithD?a=c6gCXwEM41Q:cFrhtW_dlxs:yIl2AUoC8zA"&gt;&lt;img border="0" src="http://feeds.feedburner.com/~ff/TheOneWithD?d=yIl2AUoC8zA" /&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheOneWithD?a=c6gCXwEM41Q:cFrhtW_dlxs:F7zBnMyn0Lo"&gt;&lt;img border="0" src="http://feeds.feedburner.com/~ff/TheOneWithD?i=c6gCXwEM41Q:cFrhtW_dlxs:F7zBnMyn0Lo" /&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheOneWithD?a=c6gCXwEM41Q:cFrhtW_dlxs:cGdyc7Q-1BI"&gt;&lt;img border="0" src="http://feeds.feedburner.com/~ff/TheOneWithD?d=cGdyc7Q-1BI" /&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img height="1" src="http://feeds.feedburner.com/~r/TheOneWithD/~4/c6gCXwEM41Q" width="1" /&gt;</content>
		<author>
			<name>Aldacron</name>
			<uri>http://dblog.aldacron.net</uri>
		</author>
		<source>
			<title type="html">The One With D</title>
			<subtitle type="html">News and Opinions Regarding the D Programming Language</subtitle>
			<link rel="self" href="http://feeds.feedburner.com/TheOneWithD" />
			<id>http://feeds.feedburner.com/TheOneWithD</id>
			<updated>2012-05-21T14:00:43+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">dpj – A Mini-IDE for D</title>
		<link href="http://feedproxy.google.com/~r/TheOneWithD/~3/ZHxtJW9AvuE/" />
		<id>http://dblog.aldacron.net/?p=1055</id>
		<updated>2012-05-20T04:24:09+00:00</updated>
		<content type="html">&lt;p&gt;I &lt;a href="http://forum.dlang.org/thread/qufvdhexcdzabuzqrvgm@forum.dlang.org" target="_blank"&gt;a recent post in D.announce&lt;/a&gt;,  denewbie let it be known that &lt;a href="http://my.opera.com/run3/blog/2012/05/20/dpj" target="_blank"&gt;dpj for Windows&lt;/a&gt; version 1.0 is ready for exposure to the D community. From both pages, &amp;#8220;dpj is a mini-ide for the  D programming language.&amp;#8221; Currently, it appears to only support DMD. I hope to hear more about this one.&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TheOneWithD?a=ZHxtJW9AvuE:cqPt7ECZjKg:yIl2AUoC8zA"&gt;&lt;img border="0" src="http://feeds.feedburner.com/~ff/TheOneWithD?d=yIl2AUoC8zA" /&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheOneWithD?a=ZHxtJW9AvuE:cqPt7ECZjKg:F7zBnMyn0Lo"&gt;&lt;img border="0" src="http://feeds.feedburner.com/~ff/TheOneWithD?i=ZHxtJW9AvuE:cqPt7ECZjKg:F7zBnMyn0Lo" /&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheOneWithD?a=ZHxtJW9AvuE:cqPt7ECZjKg:cGdyc7Q-1BI"&gt;&lt;img border="0" src="http://feeds.feedburner.com/~ff/TheOneWithD?d=cGdyc7Q-1BI" /&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img height="1" src="http://feeds.feedburner.com/~r/TheOneWithD/~4/ZHxtJW9AvuE" width="1" /&gt;</content>
		<author>
			<name>Aldacron</name>
			<uri>http://dblog.aldacron.net</uri>
		</author>
		<source>
			<title type="html">The One With D</title>
			<subtitle type="html">News and Opinions Regarding the D Programming Language</subtitle>
			<link rel="self" href="http://feeds.feedburner.com/TheOneWithD" />
			<id>http://feeds.feedburner.com/TheOneWithD</id>
			<updated>2012-05-21T14:00:43+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">Binding D to C Part Three</title>
		<link href="http://www.gamedev.net/blog/1140/entry-2254632-binding-d-to-c-part-three/" />
		<id>http://www.gamedev.net/blog/1140/entry-2254632-binding-d-to-c-part-three/</id>
		<updated>2012-05-19T10:52:00+00:00</updated>
		<content type="html">This is the (long overdue) third part of a series on creating bindings to C libraries for the D programming language.&lt;br /&gt;
&lt;br /&gt;
In &lt;a class="bbc_url" href="http://www.gamedev.net/blog/1140/entry-2254003-binding-d-to-c/" title=""&gt;part one&lt;/a&gt;, I introduced the difference between dynamic and static bindings and some of the things  to consider when choosing which kind to implement. In...</content>
		<author>
			<name>D Bits</name>
			<uri>http://www.gamedev.net/blog/1140-d-bits/</uri>
		</author>
		<source>
			<title type="html">D Bits</title>
			<subtitle type="html">D Bits Syndication</subtitle>
			<link rel="self" href="http://feeds.feedburner.com/DBits" />
			<id>http://feeds.feedburner.com/DBits</id>
			<updated>2012-05-19T12:00:21+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Derelict 3 Deb Package</title>
		<link href="http://feedproxy.google.com/~r/TheOneWithD/~3/LiTaEAbMuUs/" />
		<id>http://dblog.aldacron.net/?p=1052</id>
		<updated>2012-05-13T00:38:44+00:00</updated>
		<content type="html">&lt;p&gt;If you are a Linux user with APT on your system, you now have another option to get your hands on Derelict 3. Jordi Sayol has added it to his &lt;a href="http://code.google.com/p/d-apt/wiki/APT_Repository" target="_blank"&gt;D-APT repository&lt;/a&gt;.&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TheOneWithD?a=LiTaEAbMuUs:PkJnjqZPB58:yIl2AUoC8zA"&gt;&lt;img border="0" src="http://feeds.feedburner.com/~ff/TheOneWithD?d=yIl2AUoC8zA" /&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheOneWithD?a=LiTaEAbMuUs:PkJnjqZPB58:F7zBnMyn0Lo"&gt;&lt;img border="0" src="http://feeds.feedburner.com/~ff/TheOneWithD?i=LiTaEAbMuUs:PkJnjqZPB58:F7zBnMyn0Lo" /&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheOneWithD?a=LiTaEAbMuUs:PkJnjqZPB58:cGdyc7Q-1BI"&gt;&lt;img border="0" src="http://feeds.feedburner.com/~ff/TheOneWithD?d=cGdyc7Q-1BI" /&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img height="1" src="http://feeds.feedburner.com/~r/TheOneWithD/~4/LiTaEAbMuUs" width="1" /&gt;</content>
		<author>
			<name>Aldacron</name>
			<uri>http://dblog.aldacron.net</uri>
		</author>
		<source>
			<title type="html">The One With D</title>
			<subtitle type="html">News and Opinions Regarding the D Programming Language</subtitle>
			<link rel="self" href="http://feeds.feedburner.com/TheOneWithD" />
			<id>http://feeds.feedburner.com/TheOneWithD</id>
			<updated>2012-05-21T14:00:43+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en-us">
		<title type="html">Voldemort Types In D</title>
		<link href="http://www.drdobbs.com/blogs/cpp/232901591" />
		<id>http://www.drdobbs.com/blogs/cpp/232901591</id>
		<updated>2012-05-07T23:34:00+00:00</updated>
		<content type="html">Sometimes, the confluence of existing features can yield unexpected surprises.</content>
		<author>
			<name>Walter Bright</name>
			<uri>http://www.drdobbs.com//author/6839</uri>
		</author>
		<source>
			<title type="html">Dr. Dobb's Blogs</title>
			<subtitle type="html">Dr. Dobb's</subtitle>
			<link rel="self" href="http://www.drdobbs.com/rss/blogs/author/6839" />
			<id>http://www.drdobbs.com/rss/blogs/author/6839</id>
			<updated>2012-05-27T18:00:12+00:00</updated>
			<rights type="html">Copyright 2012, United Business Media.</rights>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">vibe.d</title>
		<link href="http://feedproxy.google.com/~r/TheOneWithD/~3/T94T8rJDJLU/" />
		<id>http://dblog.aldacron.net/?p=1047</id>
		<updated>2012-04-30T05:24:16+00:00</updated>
		<content type="html">&lt;p&gt;&lt;a href="http://vibed.org/" target="_blank"&gt;vibe.d&lt;/a&gt; was announced a few days ago and I was going to post about it then, but the site was down for a bit. Then I forgot about it. Which I shouldn&amp;#8217;t have, because it looks like quite an awesome project.&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;a new framework for general I/O and especially for building&lt;br /&gt;
extremely fast web apps. It combines asynchronous I/O with&lt;br /&gt;
core.thread&amp;#8217;s great fibers to build a convenient, blocking&lt;br /&gt;
API which can handle insane amounts of connections due to&lt;br /&gt;
the low memory and computational overhead.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;It&amp;#8217;s a young project, but already packs several features that can make web development with D a breeze. I would love to play around with it myself, but I barely have time for the projects I&amp;#8217;m already working on. Anyone got a few extra hours per week to spare?&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TheOneWithD?a=T94T8rJDJLU:RZGUL7F3ktA:yIl2AUoC8zA"&gt;&lt;img border="0" src="http://feeds.feedburner.com/~ff/TheOneWithD?d=yIl2AUoC8zA" /&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheOneWithD?a=T94T8rJDJLU:RZGUL7F3ktA:F7zBnMyn0Lo"&gt;&lt;img border="0" src="http://feeds.feedburner.com/~ff/TheOneWithD?i=T94T8rJDJLU:RZGUL7F3ktA:F7zBnMyn0Lo" /&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheOneWithD?a=T94T8rJDJLU:RZGUL7F3ktA:cGdyc7Q-1BI"&gt;&lt;img border="0" src="http://feeds.feedburner.com/~ff/TheOneWithD?d=cGdyc7Q-1BI" /&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img height="1" src="http://feeds.feedburner.com/~r/TheOneWithD/~4/T94T8rJDJLU" width="1" /&gt;</content>
		<author>
			<name>Aldacron</name>
			<uri>http://dblog.aldacron.net</uri>
		</author>
		<source>
			<title type="html">The One With D</title>
			<subtitle type="html">News and Opinions Regarding the D Programming Language</subtitle>
			<link rel="self" href="http://feeds.feedburner.com/TheOneWithD" />
			<id>http://feeds.feedburner.com/TheOneWithD</id>
			<updated>2012-05-21T14:00:43+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">libgc-d version 1.0 released</title>
		<link href="http://blog.lycus.org/2012/04/libgc-d-version-10-released.html" />
		<id>tag:blogger.com,1999:blog-1741914028175070563.post-6523339617694288748</id>
		<updated>2012-04-26T11:04:17+00:00</updated>
		<content type="html">Version 1.0 of &lt;a href="https://github.com/lycus/libgc-d"&gt;libgc-d&lt;/a&gt; has been released. This is a simple binding library for the &lt;a href="http://www.hpl.hp.com/personal/Hans_Boehm/gc"&gt;libgc&lt;/a&gt; library. It has been tested with MCI's interpreter on Linux and OS X and should be ready for production use.&lt;br /&gt;&lt;br /&gt;Archives can be downloaded &lt;a href="https://github.com/lycus/libgc-d/downloads"&gt;here&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img alt="" height="1" src="https://blogger.googleusercontent.com/tracker/1741914028175070563-6523339617694288748?l=blog.lycus.org" width="1" /&gt;&lt;/div&gt;</content>
		<author>
			<name>Alex Rønne Petersen</name>
			<email>noreply@blogger.com</email>
			<uri>http://blog.lycus.org/search/label/PlanetD</uri>
		</author>
		<source>
			<title type="html">The Lycus Foundation</title>
			<link rel="self" href="http://blog.lycus.org/feeds/posts/default/-/PlanetD" />
			<id>tag:blogger.com,1999:blog-1741914028175070563</id>
			<updated>2012-05-20T04:00:30+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">libffi-d version 1.0 released</title>
		<link href="http://blog.lycus.org/2012/04/libffi-d-version-10-released.html" />
		<id>tag:blogger.com,1999:blog-1741914028175070563.post-3270019994350844269</id>
		<updated>2012-04-26T10:43:27+00:00</updated>
		<content type="html">Version 1.0 of &lt;a href="https://github.com/lycus/libffi-d"&gt;libffi-d&lt;/a&gt; has been released. This library is a wrapper around the C library &lt;a href="http://sourceware.org/libffi/"&gt;libffi&lt;/a&gt; which is useful for dynamic invocation of native functions. Since libffi-d provides a more 'D-like' wrapper around the C library, as opposed to just being a binding, there is a certain amount of logic in libffi-d that is actually quite error-prone. Version 1.0 has been battle-tested in MCI's interpreter on Windows, Linux, and OS X.&lt;br /&gt;&lt;br /&gt;Archives can be downloaded &lt;a href="https://github.com/lycus/libffi-d/downloads"&gt;here&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img alt="" height="1" src="https://blogger.googleusercontent.com/tracker/1741914028175070563-3270019994350844269?l=blog.lycus.org" width="1" /&gt;&lt;/div&gt;</content>
		<author>
			<name>Alex Rønne Petersen</name>
			<email>noreply@blogger.com</email>
			<uri>http://blog.lycus.org/search/label/PlanetD</uri>
		</author>
		<source>
			<title type="html">The Lycus Foundation</title>
			<link rel="self" href="http://blog.lycus.org/feeds/posts/default/-/PlanetD" />
			<id>tag:blogger.com,1999:blog-1741914028175070563</id>
			<updated>2012-05-20T04:00:30+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">New Bindings in Derelict 3</title>
		<link href="http://feedproxy.google.com/~r/TheOneWithD/~3/D3KsCcVQcb4/" />
		<id>http://dblog.aldacron.net/?p=1045</id>
		<updated>2012-04-17T06:45:00+00:00</updated>
		<content type="html">&lt;p&gt;Thanks to Sven-Hendrik Haase, there are two new packages in &lt;a href="https://github.com/aldacron/Derelict3" target="_blank"&gt;Derelict 3&lt;/a&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;DerelictAlure is a binding to &lt;a href="http://kcat.strangesoft.net/alure.html" target="_blank"&gt;AL Utilities REtooled&lt;/a&gt;, a library that takes care of some common tasks when working with OpenAL.&lt;/li&gt;
&lt;li&gt;DerelictASSIMP is a binding to the &lt;a href="http://assimp.sourceforge.net/" target="_blank"&gt;Open Asset Import&lt;/a&gt; library, which allows you to import, and export, 3D models from a variety of formats.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Both of these are very useful additions to Derelict.&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TheOneWithD?a=D3KsCcVQcb4:-W0yacMWVxI:yIl2AUoC8zA"&gt;&lt;img border="0" src="http://feeds.feedburner.com/~ff/TheOneWithD?d=yIl2AUoC8zA" /&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheOneWithD?a=D3KsCcVQcb4:-W0yacMWVxI:F7zBnMyn0Lo"&gt;&lt;img border="0" src="http://feeds.feedburner.com/~ff/TheOneWithD?i=D3KsCcVQcb4:-W0yacMWVxI:F7zBnMyn0Lo" /&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheOneWithD?a=D3KsCcVQcb4:-W0yacMWVxI:cGdyc7Q-1BI"&gt;&lt;img border="0" src="http://feeds.feedburner.com/~ff/TheOneWithD?d=cGdyc7Q-1BI" /&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img height="1" src="http://feeds.feedburner.com/~r/TheOneWithD/~4/D3KsCcVQcb4" width="1" /&gt;</content>
		<author>
			<name>Aldacron</name>
			<uri>http://dblog.aldacron.net</uri>
		</author>
		<source>
			<title type="html">The One With D</title>
			<subtitle type="html">News and Opinions Regarding the D Programming Language</subtitle>
			<link rel="self" href="http://feeds.feedburner.com/TheOneWithD" />
			<id>http://feeds.feedburner.com/TheOneWithD</id>
			<updated>2012-05-21T14:00:43+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">DMD 1.074 and 2.059</title>
		<link href="http://feedproxy.google.com/~r/TheOneWithD/~3/97XFh7wQWes/" />
		<id>http://dblog.aldacron.net/?p=1041</id>
		<updated>2012-04-14T04:23:25+00:00</updated>
		<content type="html">&lt;p&gt;Walter has announced new versions of the DMD compilers. &lt;a href="http://www.digitalmars.com/d/1.0/changelog.html#new1_074" target="_blank"&gt;1.074&lt;/a&gt; is, as usual, a bug-fix release. With the end-of-support date for D1 getting ever closer, don&amp;#8217;t expect anything major to come out of that branch.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://dlang.org/changelog.html#new2_059" target="_blank"&gt;DMD 2.059&lt;/a&gt;, on the other hand, is quite a sight. In addition to the numerous bug fixes, there are several new features and changes. One thing that&amp;#8217;s going to be a pleaser to many is that Universal Function Call Syntax now applies universally. That&amp;#8217;s something for which we&amp;#8217;ve been waiting for quite some time.&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TheOneWithD?a=97XFh7wQWes:BxUO-87Nkz0:yIl2AUoC8zA"&gt;&lt;img border="0" src="http://feeds.feedburner.com/~ff/TheOneWithD?d=yIl2AUoC8zA" /&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheOneWithD?a=97XFh7wQWes:BxUO-87Nkz0:F7zBnMyn0Lo"&gt;&lt;img border="0" src="http://feeds.feedburner.com/~ff/TheOneWithD?i=97XFh7wQWes:BxUO-87Nkz0:F7zBnMyn0Lo" /&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheOneWithD?a=97XFh7wQWes:BxUO-87Nkz0:cGdyc7Q-1BI"&gt;&lt;img border="0" src="http://feeds.feedburner.com/~ff/TheOneWithD?d=cGdyc7Q-1BI" /&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img height="1" src="http://feeds.feedburner.com/~r/TheOneWithD/~4/97XFh7wQWes" width="1" /&gt;</content>
		<author>
			<name>Aldacron</name>
			<uri>http://dblog.aldacron.net</uri>
		</author>
		<source>
			<title type="html">The One With D</title>
			<subtitle type="html">News and Opinions Regarding the D Programming Language</subtitle>
			<link rel="self" href="http://feeds.feedburner.com/TheOneWithD" />
			<id>http://feeds.feedburner.com/TheOneWithD</id>
			<updated>2012-05-21T14:00:43+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">A simple usage example of Haskell type classes and D templates</title>
		<link href="http://leonardo-m.livejournal.com/106081.html" />
		<id>http://leonardo-m.livejournal.com/106081.html</id>
		<updated>2012-04-10T23:18:55+00:00</updated>
		<content type="html">This is a nice introduction to Haskell language:&lt;br /&gt;&lt;a href="http://yannesposito.com/Scratch/en/blog/Haskell-the-Hard-Way/" rel="nofollow"&gt;http://yannesposito.com/Scratch/en/blog/Haskell-the-Hard-Way/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Near the beginning there is this simple Haskell program:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;f :: Num a =&amp;gt; a -&amp;gt; a -&amp;gt; a
f x y = x*x + y*y

main = print (f 3 2.4)&lt;/pre&gt;&lt;br /&gt;It compiles and produces the 14.76 output because:&lt;br /&gt;&lt;blockquote&gt;`3` is a valid representation both for Fractional numbers like Float and for Integer. As `2.4` is a Fractional number, `3` is then interpreted as being also a Fractional number.&lt;/blockquote&gt;&lt;br /&gt;Despite the D language is sometimes better than C++, D templates are not Haskell type classes. This (heavily annotated) D code works (all those annotations are optional, but template constraints are often handy, also to help the compiler produce better error messages):&lt;br /&gt;&lt;pre&gt;import std.traits;

T f(T)(in T x, in T y) pure nothrow @safe if (isNumeric!T) {
    return x ^^ 2 + y ^^ 2;
}

void main() {
    import std.stdio;
    writeln(f(2.1, 4.2));
}&lt;/pre&gt;&lt;br /&gt;But unlike in the Haskell example, D templates don't perform implicit type coercion (as it happens for normal D functions), so this code causes a compilation error:&lt;br /&gt;&lt;pre&gt;import std.traits;

T f(T)(in T x, in T y) pure nothrow @safe if (isNumeric!T) {
    return x ^^ 2 + y ^^ 2;
}

void main() {
    import std.stdio;
    writeln(f(2, 4.2)); // does not match any function template
}&lt;/pre&gt;&lt;br /&gt;If you also want it to work with the multi-precision numbers currently defined in Phobos standard library you have to drop the "pure" and "nothrow" annotations because currently Phobos BigInt code doesn't have those qualities. And you also have to drop the "in" (that in D equals to "scope const") annotations on the input arguments because currently BigInt doesn't work well with immutability. You also need to keep in mind that &lt;code&gt;isNumeric&lt;/code&gt; is a Phobos trait defined for built-in numbers only, so you need to add another specialization:&lt;br /&gt;&lt;pre&gt;import std.traits, std.bigint;

T f(T)(T x, T y) if (isNumeric!T || is(T == BigInt)) {
    return x ^^ 2 + y ^^ 2;
}

void main() {
    import std.stdio;
    writeln(f(BigInt(2), BigInt(4)));
}&lt;/pre&gt;&lt;br /&gt;What if you want to use Rational numbers too or other kind of user-defined numbers? You have probably to write and use a isNumber template trait that contains actual D code that uses the basic numeric capabilities inside a &lt;code&gt;__traits(compiles, {...})&lt;/code&gt;. Something like this for isInputRange:&lt;br /&gt;&lt;pre&gt;template isInputRange(R) {
    enum bool isInputRange = __traits(compiles, {
        R r = void; // can define a range object
        if (r.empty) {} // can test for empty
        r.popFront(); // can invoke popFront()
        auto h = r.front; // can get the front of the range
    });
}&lt;/pre&gt;&lt;br /&gt;Such code is not hard to write, it's just a minimal list of operations you want to verify, but sometimes you need some tries to put inside it all your requirements. So here it's a good idea to write some compile-time unit tests to verify that your isNumber is working well with several types and usages. D template constraints are not the mythic C++0x Concepts, they can't verify conformance in both directions. So you usually have to write compile-time unit tests to design and write them well.</content>
		<author>
			<name>Leonardo Maffi</name>
			<uri>http://leonardo-m.livejournal.com/</uri>
		</author>
		<source>
			<title type="html">leonardo</title>
			<subtitle type="html">leonardo - LiveJournal.com</subtitle>
			<link rel="self" href="http://leonardo-m.livejournal.com/data/rss?tag=d%20language" />
			<id>http://leonardo-m.livejournal.com/data/rss?tag=d%20language</id>
			<updated>2012-04-15T17:00:15+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">Introducing libgc-d</title>
		<link href="http://blog.lycus.org/2012/03/introducing-libgc-d.html" />
		<id>tag:blogger.com,1999:blog-1741914028175070563.post-6917986972794197936</id>
		<updated>2012-04-06T17:07:38+00:00</updated>
		<content type="html">We've just published &lt;a href="https://github.com/lycus/libgc-d"&gt;libgc-d on GitHub&lt;/a&gt;&amp;nbsp;(and &lt;a href="http://ci.lycus.org/view/libgc-d/"&gt;it is building on the CI server&lt;/a&gt; as well)!&lt;br /&gt;&lt;br /&gt;This is a bare-bones binding to &lt;a href="http://www.hpl.hp.com/personal/Hans_Boehm/gc"&gt;the libgc library&lt;/a&gt; (also known as the Boehm-Demers-Weiser GC). It is a conservative garbage collector targeting applications written in languages such as C, C++, D, etc. We're using libgc-d in MCI as we now support libgc as a garbage collector option on all non-Windows platforms.&lt;div class="blogger-post-footer"&gt;&lt;img alt="" height="1" src="https://blogger.googleusercontent.com/tracker/1741914028175070563-6917986972794197936?l=blog.lycus.org" width="1" /&gt;&lt;/div&gt;</content>
		<author>
			<name>Alex Rønne Petersen</name>
			<email>noreply@blogger.com</email>
			<uri>http://blog.lycus.org/search/label/PlanetD</uri>
		</author>
		<source>
			<title type="html">The Lycus Foundation</title>
			<link rel="self" href="http://blog.lycus.org/feeds/posts/default/-/PlanetD" />
			<id>tag:blogger.com,1999:blog-1741914028175070563</id>
			<updated>2012-05-20T04:00:30+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">Setting Thread Affinity on Windows in D</title>
		<link href="http://www.gamedev.net/blog/1140/entry-2254424-setting-thread-affinity-on-windows-in-d/" />
		<id>http://www.gamedev.net/blog/1140/entry-2254424-setting-thread-affinity-on-windows-in-d/</id>
		<updated>2012-04-03T13:15:00+00:00</updated>
		<content type="html">When working with D's standard library, it is sometimes necessary to work around missing declarations in the core.sys.windows.windows module. It's a fairly big module as is, but it isn't all-inclusive. If you are doing any heavy-duty Windows development, you'll likely want  a...</content>
		<author>
			<name>D Bits</name>
			<uri>http://www.gamedev.net/blog/1140-d-bits/</uri>
		</author>
		<source>
			<title type="html">D Bits</title>
			<subtitle type="html">D Bits Syndication</subtitle>
			<link rel="self" href="http://feeds.feedburner.com/DBits" />
			<id>http://feeds.feedburner.com/DBits</id>
			<updated>2012-05-19T12:00:21+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Library News Roundup</title>
		<link href="http://feedproxy.google.com/~r/TheOneWithD/~3/ioEeEs6h344/" />
		<id>http://dblog.aldacron.net/?p=1034</id>
		<updated>2012-04-02T07:04:36+00:00</updated>
		<content type="html">&lt;p&gt;There&amp;#8217;s been a sudden burst of announcements regarding D libraries &amp;#8212; one native lib and three bindings. So I&amp;#8217;ve collected them all here for your benefit. Thank me later.&lt;/p&gt;
&lt;p&gt;First up, long-time D user Stewart Gordon, a D1 stalwart, has finally made the move to D2. That&amp;#8217;s news in and of itself, but the reason I&amp;#8217;m posting about it here is that it has resulted in his utility library being updated to D2. I&amp;#8217;ve never used it, but you might &lt;a href="http://pr.stewartsplace.org.uk/d/sutil/" target="_blank"&gt;find something useful there&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Daniel Kolesa has put together a binding to the &lt;a href="http://www.ode.org/" target="_blank"&gt;Open Dynamics Engine&lt;/a&gt;, a rigid-body physics engine for games. Actually, he&amp;#8217;s made two bindings. One, a static binding (meaning you can link statically or dynamically to ODE), has been &lt;a href="https://github.com/D-Programming-Deimos/ODE" target="_blank"&gt;created for the Deimos project&lt;/a&gt;. The second, a dynamic binding (meaning ODE must be loaded manually and static linking is not possible) has been ported from Derelict 2 and &lt;a href="https://github.com/aldacron/Derelict3" target="_blank"&gt;merged into Derelict 3&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Artur Skawina has announced an update for the native GTK bindings for D. I think the best place to send you is to &lt;a href="http://forum.dlang.org/thread/mailman.1277.1333310103.4860.digitalmars-d-announce@puremagic.com" target="_blank"&gt;the announcement itself&lt;/a&gt;, so you can get all the information you need before visiting &lt;a href="http://repo.or.cz/w/girtod.git" target="_blank"&gt;the repository&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Finally, dnewbie has put together &lt;a href="http://my.opera.com/run3/blog/2012/04/02/d-oracle" target="_blank"&gt;a binding for ocilib&lt;/a&gt; so that you can use Oracle databases from D. In my memory, this may be the first Oracle binding I&amp;#8217;ve seen for D.&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TheOneWithD?a=ioEeEs6h344:5i1-qxL258A:yIl2AUoC8zA"&gt;&lt;img border="0" src="http://feeds.feedburner.com/~ff/TheOneWithD?d=yIl2AUoC8zA" /&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheOneWithD?a=ioEeEs6h344:5i1-qxL258A:F7zBnMyn0Lo"&gt;&lt;img border="0" src="http://feeds.feedburner.com/~ff/TheOneWithD?i=ioEeEs6h344:5i1-qxL258A:F7zBnMyn0Lo" /&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheOneWithD?a=ioEeEs6h344:5i1-qxL258A:cGdyc7Q-1BI"&gt;&lt;img border="0" src="http://feeds.feedburner.com/~ff/TheOneWithD?d=cGdyc7Q-1BI" /&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img height="1" src="http://feeds.feedburner.com/~r/TheOneWithD/~4/ioEeEs6h344" width="1" /&gt;</content>
		<author>
			<name>Aldacron</name>
			<uri>http://dblog.aldacron.net</uri>
		</author>
		<source>
			<title type="html">The One With D</title>
			<subtitle type="html">News and Opinions Regarding the D Programming Language</subtitle>
			<link rel="self" href="http://feeds.feedburner.com/TheOneWithD" />
			<id>http://feeds.feedburner.com/TheOneWithD</id>
			<updated>2012-05-21T14:00:43+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en-us">
		<title type="html">Uniform Function Call Syntax</title>
		<link href="http://www.drdobbs.com/blogs/cpp/232700394" />
		<id>http://www.drdobbs.com/blogs/cpp/232700394</id>
		<updated>2012-03-28T10:31:00+00:00</updated>
		<content type="html">I have become more and more convinced that the key to code reusability and scalability is encapsulation &amp;mdash; having subsystems communicate through small, well-defined interfaces and letting them hide their own implementation details.</content>
		<author>
			<name>Walter Bright</name>
			<uri>http://www.drdobbs.com//author/6839</uri>
		</author>
		<source>
			<title type="html">Dr. Dobb's Blogs</title>
			<subtitle type="html">Dr. Dobb's</subtitle>
			<link rel="self" href="http://www.drdobbs.com/rss/blogs/author/6839" />
			<id>http://www.drdobbs.com/rss/blogs/author/6839</id>
			<updated>2012-05-27T18:00:12+00:00</updated>
			<rights type="html">Copyright 2012, United Business Media.</rights>
		</source>
	</entry>

	<entry>
		<title type="html">Thrift now officially supports D!</title>
		<link href="http://klickverbot.at/blog/2012/03/thrift-now-officially-supports-d" />
		<id>http://klickverbot.at/blog/2012/03/thrift-now-officially-supports-d</id>
		<updated>2012-03-26T22:00:00+00:00</updated>
		<content type="html">&lt;p class="lead"&gt;&lt;a href="http://thrift.apache.org"&gt;Thrift&lt;/a&gt; is a cross-language serialization and RPC framework, originally developed for internal use at Facebook, and now an &lt;a href="http://apache.org"&gt;Apache Software Foundation&lt;/a&gt; project. I started working on support for the &lt;a href="http://dlang.org"&gt;D programming language&lt;/a&gt; during &lt;a href="http://www.klickverbot.at/code/gsoc/thrift/"&gt;Google Summer of Code 2011&lt;/a&gt;, and at the end of last week, the implementation was finally incorporated into the main project.&lt;/p&gt;
&lt;p&gt;First, let me thank Jake Farrell and everybody else on the Thrift team who was involved in &lt;a href="https://issues.apache.org/jira/browse/THRIFT-1500"&gt;THRIFT-1500&lt;/a&gt;; reviewing a ~719&amp;thinsp;kB patch certainly isn&amp;#8217;t an easy thing to do. But now that the work is in, what can you (as a Thrift user) expect from the implementation?&lt;/p&gt;

&lt;p&gt;Feature-wise, the library should roughly be up to par with the other major implementations (i.e. C++ and Java):&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;p&gt;&lt;em&gt;Protocols:&lt;/em&gt; Binary, Compact and JSON. The Dense protocol has not been implemented yet – it is only supported by the C++ implementation and I am not sure about its relevance nowadays (but if you are at a certain well-known company and it turns out that you still need the feature for new projects, let me know; adding support for it should not be hard).&lt;/p&gt;&lt;/li&gt;
  &lt;li&gt;&lt;p&gt;&lt;em&gt;Transports:&lt;/em&gt; Socket, SSL, HTTP and log file reader/writer implementations (plus your familiar helpers, i.e. buffered/framed/memory-buffer/piped/zlib...)&lt;/p&gt;&lt;/li&gt;
  &lt;li&gt;&lt;p&gt;&lt;em&gt;Servers:&lt;/em&gt; several single- and multithreaded variants (including a libevent-based non-blocking implementation)&lt;/p&gt;&lt;/li&gt;
  &lt;li&gt;&lt;p&gt;&lt;em&gt;Clients:&lt;/em&gt; Both a synchronous and an asynchronous (future-based interface with one or more libevent-backed worker threads) implementation are provided. Additionally, several pooling implementations for redundancy as well as aggregation use cases are available.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The implementation makes heavy use of D&amp;#8217;s metaprogramming capatibilties and is also able to work without code generated off-line from &lt;code&gt;.thrift&lt;/code&gt; files, if so desired. There are also a few experimental gimmicks, such as the capatibility to generate Thrift IDL files from existing D types at compile time. Soon to come:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;p&gt;&lt;em&gt;Unix domain sockets:&amp;#160;&lt;/em&gt;Currently, the D implementation only supports IPv4 and IPv6 TCP sockets, because that is what the D standard library does, but starting with the next release, it will also support Unix domain sockets (if really needed, the lack of support in &lt;code&gt;std.socket&lt;/code&gt; could be worked around without much effort, though).&lt;/p&gt;&lt;/li&gt;
  &lt;li&gt;&lt;p&gt;&lt;code&gt;@safe&lt;/code&gt;&lt;em&gt;-ty annotations:&amp;#160;&lt;/em&gt;The D language features built-in memory safety annotations. The majority of the methods in the D Thrift library should be memory safe (except for e.g. &lt;code&gt;TTransport.borrow&lt;/code&gt;), so marking it as such allowed Thrift to be used in D programs where safety is enforced without requiring the user to mark the Thrift calls as &lt;code&gt;@trusted&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So, how to get started? As said above, the source code has been mergerd from my &lt;a href="https://github.com/klickverbot/thrift"&gt;personal GitHub repo&lt;/a&gt; to the &lt;code&gt;trunk&lt;/code&gt; of the &lt;a href="http://thrift.apache.org/developers/"&gt;main ASF repo&lt;/a&gt;, and as soon as the currently ongoing rework of the official Thrift site is completed, the &lt;a href="https://github.com/klickverbot/thrift/wiki/Getting-Started-with-Thrift-and-D"&gt;Getting Started with Thrift and D&lt;/a&gt; and &lt;a href="https://github.com/klickverbot/thrift/wiki/Building-Thrift-D-on-Windows"&gt;Building Thrift/D on Windows&lt;/a&gt; pages will follow along. A recent build of the &lt;a href="http://www.klickverbot.at/code/gsoc/thrift/docs/"&gt;API docs&lt;/a&gt; is currently available here on my website. If you find any bugs, be sure to file them at the &lt;a href="https://issues.apache.org/jira/browse/THRIFT"&gt;Thrift JIRA&lt;/a&gt;.&lt;/p&gt;</content>
		<author>
			<name>David Nadlinger</name>
			<email>atom@klickverbot.at</email>
			<uri>http://klickverbot.at/</uri>
		</author>
		<source>
			<title type="html">David Nadlinger</title>
			<link rel="self" href="http://klickverbot.at/blog/tags/D/atom.xml" />
			<id>http://klickverbot.at/blog/tags/D/</id>
			<updated>2012-03-28T09:00:25+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Get an exception from a segfault on linux (x86 and x86_64), using some black magic !</title>
		<link href="http://www.deadalnix.me/2012/03/24/get-an-exception-from-a-segfault-on-linux-x86-and-x86_64-using-some-black-magic/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=get-an-exception-from-a-segfault-on-linux-x86-and-x86_64-using-some-black-magic" />
		<id>http://www.deadalnix.me/?p=169</id>
		<updated>2012-03-24T17:05:51+00:00</updated>
		<content type="html">&lt;p&gt;Linux (as other UNIXes) allow you to register handlers for signals. Here we are interested in SIGSEGV. This signal is sent to your program when you try to use a memory location you shouldn&amp;#8217;t. Typically, when deferencing null.&lt;/p&gt;
&lt;p&gt;Language like Java send a NullPointerException, that can be caught and you can recover from it. However, in a system language, you usually get a cryptic « segmentation fault », you cannot recover from it and cannot have any information about it outside a debugger. Let&amp;#8217;s see how we can fix this.&lt;/p&gt;
&lt;p&gt;As C++ and D are system languages that support exceptions, we will use this mechanism to handle SIGSEGV. I&amp;#8217;ll do it in D in this post, but the same is doable in C++. If you understand why it work, it shouldn&amp;#8217;t be a problem.&lt;/p&gt;
&lt;p&gt;&lt;span id="more-169"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h1&gt;It is not that simple&lt;/h1&gt;
&lt;div class="codecolorer-container d railscasts"&gt;&lt;table cellpadding="0" cellspacing="0"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;div&gt;1&lt;br /&gt;2&lt;br /&gt;3&lt;br /&gt;4&lt;br /&gt;5&lt;br /&gt;6&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;div class="d codecolorer"&gt;shared &lt;span&gt;static&lt;/span&gt; &lt;span&gt;this&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; sigaction_t action&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; action.&lt;span&gt;sa_sigaction&lt;/span&gt; &lt;span&gt;=&lt;/span&gt; &lt;span&gt;&amp;amp;&lt;/span&gt;handleSignal&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; action.&lt;span&gt;sa_flags&lt;/span&gt; &lt;span&gt;=&lt;/span&gt; SA_SIGINFO&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; sigaction&lt;span&gt;&amp;#40;&lt;/span&gt;SIGSEGV&lt;span&gt;,&lt;/span&gt; &lt;span&gt;&amp;amp;&lt;/span&gt;action&lt;span&gt;,&lt;/span&gt; &lt;span&gt;null&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span&gt;&amp;#125;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;
&lt;p&gt;With this simple sample code, we can register our handler, called handleSignal. But this isn&amp;#8217;t as simple as this. When you get into handleSignal, you are not in a standard execution mode. Linux stored the whole state of you application, then called you code, and then will restore thats state when you return. It makes it impossible to throw or get a correct stack trace.&lt;/p&gt;
&lt;h1&gt;Let&amp;#8217;s fool linux into calling our code when returning from the handler !&lt;/h1&gt;
&lt;p&gt;Well, if we are not able to do whatever we want within the signal handler, then let&amp;#8217;s modify the stored context, so linux will restore something different that execute the code we want.&lt;/p&gt;
&lt;div class="codecolorer-container d railscasts"&gt;&lt;table cellpadding="0" cellspacing="0"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;div&gt;1&lt;br /&gt;2&lt;br /&gt;3&lt;br /&gt;4&lt;br /&gt;5&lt;br /&gt;6&lt;br /&gt;7&lt;br /&gt;8&lt;br /&gt;9&lt;br /&gt;10&lt;br /&gt;11&lt;br /&gt;12&lt;br /&gt;13&lt;br /&gt;14&lt;br /&gt;15&lt;br /&gt;16&lt;br /&gt;17&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;div class="d codecolorer"&gt;&lt;span&gt;static&lt;/span&gt; REG_TYPE saved_EAX&lt;span&gt;,&lt;/span&gt; saved_EDX&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span&gt;extern&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;C&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;br /&gt;
&lt;span&gt;void&lt;/span&gt; handleSignal&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;int&lt;/span&gt; signum&lt;span&gt;,&lt;/span&gt; siginfo_t&lt;span&gt;*&lt;/span&gt; info&lt;span&gt;,&lt;/span&gt; &lt;span&gt;void&lt;/span&gt;&lt;span&gt;*&lt;/span&gt; contextPtr&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;auto&lt;/span&gt; context &lt;span&gt;=&lt;/span&gt; &lt;span&gt;cast&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;ucontext_t&lt;span&gt;*&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;contextPtr&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;// Save registers into global thread local, to allow recovery.&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; saved_EAX &lt;span&gt;=&lt;/span&gt; context.&lt;span&gt;uc_mcontext&lt;/span&gt;.&lt;span&gt;gregs&lt;/span&gt;&lt;span&gt;&amp;#91;&lt;/span&gt;REG_EAX&lt;span&gt;&amp;#93;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; saved_EDX &lt;span&gt;=&lt;/span&gt; context.&lt;span&gt;uc_mcontext&lt;/span&gt;.&lt;span&gt;gregs&lt;/span&gt;&lt;span&gt;&amp;#91;&lt;/span&gt;REG_EDX&lt;span&gt;&amp;#93;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;// Hijack current context so we call our handler.&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;auto&lt;/span&gt; eip &lt;span&gt;=&lt;/span&gt; context.&lt;span&gt;uc_mcontext&lt;/span&gt;.&lt;span&gt;gregs&lt;/span&gt;&lt;span&gt;&amp;#91;&lt;/span&gt;REG_EIP&lt;span&gt;&amp;#93;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;auto&lt;/span&gt; addr &lt;span&gt;=&lt;/span&gt; &lt;span&gt;cast&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;REG_TYPE&lt;span&gt;&amp;#41;&lt;/span&gt; info._sifields._sigfault.&lt;span&gt;si_addr&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; context.&lt;span&gt;uc_mcontext&lt;/span&gt;.&lt;span&gt;gregs&lt;/span&gt;&lt;span&gt;&amp;#91;&lt;/span&gt;REG_EAX&lt;span&gt;&amp;#93;&lt;/span&gt; &lt;span&gt;=&lt;/span&gt; addr&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; context.&lt;span&gt;uc_mcontext&lt;/span&gt;.&lt;span&gt;gregs&lt;/span&gt;&lt;span&gt;&amp;#91;&lt;/span&gt;REG_EDX&lt;span&gt;&amp;#93;&lt;/span&gt; &lt;span&gt;=&lt;/span&gt; eip&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; context.&lt;span&gt;uc_mcontext&lt;/span&gt;.&lt;span&gt;gregs&lt;/span&gt;&lt;span&gt;&amp;#91;&lt;/span&gt;REG_EIP&lt;span&gt;&amp;#93;&lt;/span&gt; &lt;span&gt;=&lt;/span&gt; &lt;span&gt;&amp;amp;&lt;/span&gt;sigsegv_userspace_handler&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span&gt;&amp;#125;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;
&lt;p&gt;OK, so what is happening here ? First of all, linux is passing us a structure or type ucontext_t, that contains system dependent information about the context in which the segfault happened. This context is used by linux to restore the program state after we executed our signal handler. So let&amp;#8217;s modify it to call the code we want.&lt;/p&gt;
&lt;p&gt;On x86, EIP is the register that store the address of the instruction that is executed. If we modify the value of this register then the code placed at the new value will be executed when linux restore the program state. This is good, but not good enough.&lt;/p&gt;
&lt;p&gt;It is also mandatory that we store the old EIP value. If we don&amp;#8217;t, then we loose the information about where does the segfault happened. So we store the value of EAX and EDX into thread local global variables. And we put the address that cause the fault into EAX and the old EIP value into EDX. Now our handler have everything needed to generate a stack trace and react according to the faulting address.&lt;/p&gt;
&lt;h1&gt;Our userspace handler cannot be a regular function, that would be too easy&lt;/h1&gt;
&lt;p&gt;Our userspace handler will not be called like a regular function. The program will jump start execution its instruction directly into the context of the faulting code, except EAX, EDX ans EIP. We need to manipulate the stack to simulate a function call and save all this state before doing anything.&lt;/p&gt;
&lt;div class="codecolorer-container d railscasts"&gt;&lt;table cellpadding="0" cellspacing="0"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;div&gt;1&lt;br /&gt;2&lt;br /&gt;3&lt;br /&gt;4&lt;br /&gt;5&lt;br /&gt;6&lt;br /&gt;7&lt;br /&gt;8&lt;br /&gt;9&lt;br /&gt;10&lt;br /&gt;11&lt;br /&gt;12&lt;br /&gt;13&lt;br /&gt;14&lt;br /&gt;15&lt;br /&gt;16&lt;br /&gt;17&lt;br /&gt;18&lt;br /&gt;19&lt;br /&gt;20&lt;br /&gt;21&lt;br /&gt;22&lt;br /&gt;23&lt;br /&gt;24&lt;br /&gt;25&lt;br /&gt;26&lt;br /&gt;27&lt;br /&gt;28&lt;br /&gt;29&lt;br /&gt;30&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;div class="d codecolorer"&gt;&lt;span&gt;void&lt;/span&gt; sigsegv_userspace_handler&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;asm&lt;/span&gt; &lt;span&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; naked&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; push EDX&lt;span&gt;;&lt;/span&gt; &amp;nbsp; &lt;span&gt;// return address (original EIP).&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; push EBP&lt;span&gt;;&lt;/span&gt; &amp;nbsp; &lt;span&gt;// old EBP&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; mov EBP&lt;span&gt;,&lt;/span&gt; ESP&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; pushf&lt;span&gt;;&lt;/span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;// Save flags.&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; push ECX&lt;span&gt;;&lt;/span&gt; &amp;nbsp; &lt;span&gt;// ECX is a trash register and must be preserved as local variable.&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;// Parameter address is already set as EAX.&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; call sigsegv_userspace_process&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;// Restore register values and return.&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; call restore_registers&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; pop ECX&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; popf&lt;span&gt;;&lt;/span&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;// Restore flags.&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;// Return&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; pop EBP&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ret&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;&amp;#125;&lt;/span&gt;&lt;br /&gt;
&lt;span&gt;&amp;#125;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span&gt;// The return value is stored in EAX and EDX, so this function restore the correct value for theses registers.&lt;/span&gt;&lt;br /&gt;
REG_TYPE&lt;span&gt;&amp;#91;&lt;/span&gt;&lt;span&gt;2&lt;/span&gt;&lt;span&gt;&amp;#93;&lt;/span&gt; restore_registers&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;return&lt;/span&gt; &lt;span&gt;&amp;#91;&lt;/span&gt;saved_EAX&lt;span&gt;,&lt;/span&gt; saved_EDX&lt;span&gt;&amp;#93;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span&gt;&amp;#125;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;
&lt;p&gt;The first 3 instruction are here to simulate a standard function call : the return address is pushed on the stack, then the base pointer (EBP) for the previous function, and finally, the base pointer is modified to reflect the new state of the stack.&lt;/p&gt;
&lt;p&gt;Then ECX and flags are stored on he stack. On x86, EAX, ECX and EDX are trash register. It means that a function isn&amp;#8217;t required to preserve their content. So, we need to same them before calling anything. And we call sigsegv_userspace_process, a function that will process the segfault into what ever we want.&lt;/p&gt;
&lt;p&gt;In case our function do not throw, the assembly code bellow will restore the state of the CPU and return to the faulting address. This is useful in case we want to play with page protection, but I will not explains details of this in this post.&lt;/p&gt;
&lt;p&gt;Now we have a routine that make the segfault appear just like a regular function call.&lt;/p&gt;
&lt;h1&gt;Wait a minute. And what if EIP is causing the segfault ?&lt;/h1&gt;
&lt;p&gt;One case isn&amp;#8217;t handled by our code. We can decide to call or to jump into a memory that is page protected. And now, what do we do ? First of all, unless you do it manually in assembly code, the jump case can&amp;#8217;t appear, so let&amp;#8217;s not handle it. After all, if you do assembly by yourself, you are supposed to know what you are doing. But, with function pointers, it is possible to call an invalid piece of memory.&lt;/p&gt;
&lt;div class="codecolorer-container d railscasts"&gt;&lt;table cellpadding="0" cellspacing="0"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;div&gt;1&lt;br /&gt;2&lt;br /&gt;3&lt;br /&gt;4&lt;br /&gt;5&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;div class="d codecolorer"&gt;&lt;span&gt;void&lt;/span&gt; &lt;span&gt;function&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt; fun &lt;span&gt;=&lt;/span&gt; &lt;span&gt;null&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span&gt;void&lt;/span&gt; main&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; fun&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span&gt;&amp;#125;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;
&lt;p&gt;In this case, the CPU will push the return address on the stack, but then nothing happen, because it will try to execute what is at an illegal address in memory. Let&amp;#8217;s add this extra case in our sigsegv_userspace_handler.&lt;/p&gt;
&lt;div class="codecolorer-container d railscasts"&gt;&lt;table cellpadding="0" cellspacing="0"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;div&gt;1&lt;br /&gt;2&lt;br /&gt;3&lt;br /&gt;4&lt;br /&gt;5&lt;br /&gt;6&lt;br /&gt;7&lt;br /&gt;8&lt;br /&gt;9&lt;br /&gt;10&lt;br /&gt;11&lt;br /&gt;12&lt;br /&gt;13&lt;br /&gt;14&lt;br /&gt;15&lt;br /&gt;16&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;div class="d codecolorer"&gt;&lt;span&gt;void&lt;/span&gt; sigsegv_userspace_handler&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;asm&lt;/span&gt; &lt;span&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; naked&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;// Handle the stack for an invalid function call (segfault at EIP).&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; push EBP&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; mov EBP&lt;span&gt;,&lt;/span&gt; ESP&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;// We jump directly here if we are in a valid function call case.&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; push EDX&lt;span&gt;;&lt;/span&gt; &amp;nbsp; &lt;span&gt;// return address (original EIP).&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; push EBP&lt;span&gt;;&lt;/span&gt; &amp;nbsp; &lt;span&gt;// old EBP&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; mov EBP&lt;span&gt;,&lt;/span&gt; ESP&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;// Same code here, not repeated for brevity.&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;&amp;#125;&lt;/span&gt;&lt;br /&gt;
&lt;span&gt;&amp;#125;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;
&lt;p&gt;And we also need to modify our signal handler, to jump at the right address depending on the case.&lt;/p&gt;
&lt;div class="codecolorer-container d railscasts"&gt;&lt;table cellpadding="0" cellspacing="0"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;div&gt;1&lt;br /&gt;2&lt;br /&gt;3&lt;br /&gt;4&lt;br /&gt;5&lt;br /&gt;6&lt;br /&gt;7&lt;br /&gt;8&lt;br /&gt;9&lt;br /&gt;10&lt;br /&gt;11&lt;br /&gt;12&lt;br /&gt;13&lt;br /&gt;14&lt;br /&gt;15&lt;br /&gt;16&lt;br /&gt;17&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;div class="d codecolorer"&gt;&lt;span&gt;static&lt;/span&gt; REG_TYPE saved_EAX&lt;span&gt;,&lt;/span&gt; saved_EDX&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span&gt;extern&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;C&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;br /&gt;
&lt;span&gt;void&lt;/span&gt; handleSignal&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;int&lt;/span&gt; signum&lt;span&gt;,&lt;/span&gt; siginfo_t&lt;span&gt;*&lt;/span&gt; info&lt;span&gt;,&lt;/span&gt; &lt;span&gt;void&lt;/span&gt;&lt;span&gt;*&lt;/span&gt; contextPtr&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;auto&lt;/span&gt; context &lt;span&gt;=&lt;/span&gt; &lt;span&gt;cast&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;ucontext_t&lt;span&gt;*&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;contextPtr&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;// Save registers into global thread local, to allow recovery.&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; saved_EAX &lt;span&gt;=&lt;/span&gt; context.&lt;span&gt;uc_mcontext&lt;/span&gt;.&lt;span&gt;gregs&lt;/span&gt;&lt;span&gt;&amp;#91;&lt;/span&gt;REG_EAX&lt;span&gt;&amp;#93;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; saved_EDX &lt;span&gt;=&lt;/span&gt; context.&lt;span&gt;uc_mcontext&lt;/span&gt;.&lt;span&gt;gregs&lt;/span&gt;&lt;span&gt;&amp;#91;&lt;/span&gt;REG_EDX&lt;span&gt;&amp;#93;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;// Hijack current context so we call our handler.&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;auto&lt;/span&gt; eip &lt;span&gt;=&lt;/span&gt; context.&lt;span&gt;uc_mcontext&lt;/span&gt;.&lt;span&gt;gregs&lt;/span&gt;&lt;span&gt;&amp;#91;&lt;/span&gt;REG_EIP&lt;span&gt;&amp;#93;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;auto&lt;/span&gt; addr &lt;span&gt;=&lt;/span&gt; &lt;span&gt;cast&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;REG_TYPE&lt;span&gt;&amp;#41;&lt;/span&gt; info._sifields._sigfault.&lt;span&gt;si_addr&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; context.&lt;span&gt;uc_mcontext&lt;/span&gt;.&lt;span&gt;gregs&lt;/span&gt;&lt;span&gt;&amp;#91;&lt;/span&gt;REG_EAX&lt;span&gt;&amp;#93;&lt;/span&gt; &lt;span&gt;=&lt;/span&gt; addr&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; context.&lt;span&gt;uc_mcontext&lt;/span&gt;.&lt;span&gt;gregs&lt;/span&gt;&lt;span&gt;&amp;#91;&lt;/span&gt;REG_EDX&lt;span&gt;&amp;#93;&lt;/span&gt; &lt;span&gt;=&lt;/span&gt; eip&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; context.&lt;span&gt;uc_mcontext&lt;/span&gt;.&lt;span&gt;gregs&lt;/span&gt;&lt;span&gt;&amp;#91;&lt;/span&gt;REG_EIP&lt;span&gt;&amp;#93;&lt;/span&gt; &lt;span&gt;=&lt;/span&gt; &lt;span&gt;&amp;#40;&lt;/span&gt;eip &lt;span&gt;!=&lt;/span&gt; addr&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;?&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;cast&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;REG_TYPE&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;&amp;amp;&lt;/span&gt;sigsegv_userspace_handler &lt;span&gt;+&lt;/span&gt; &lt;span&gt;0x03&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;cast&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;REG_TYPE&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;&amp;amp;&lt;/span&gt;sigsegv_userspace_handler&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span&gt;&amp;#125;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;
&lt;p&gt;So, if the value of EIP is th same as the segfaulting address, then we are in the case where an illegal address is called. If not, then 0&amp;#215;03 is added to EIP to skip the instructions that handle this case. When I said black magic, I meant it !&lt;/p&gt;
&lt;p&gt;Note that no restoring is done for such a case : this is impossible anyway and the only exit solution is to throw.&lt;/p&gt;
&lt;h1&gt;So we finally get somewhere to handle that segfault !&lt;/h1&gt;
&lt;p&gt;Yes, and now is is easy.&lt;/p&gt;
&lt;div class="codecolorer-container d railscasts"&gt;&lt;table cellpadding="0" cellspacing="0"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;div&gt;1&lt;br /&gt;2&lt;br /&gt;3&lt;br /&gt;4&lt;br /&gt;5&lt;br /&gt;6&lt;br /&gt;7&lt;br /&gt;8&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;div class="d codecolorer"&gt;&lt;span&gt;void&lt;/span&gt; sigsegv_userspace_process&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;void&lt;/span&gt;&lt;span&gt;*&lt;/span&gt; address&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;// The first page is protected to detect null deference.&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;if&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;cast&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;size_t&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt; address&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;&amp;lt;&lt;/span&gt; MEMORY_RESERVED_FOR_NULL_DEFERENCE&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;throw&lt;/span&gt; &lt;span&gt;new&lt;/span&gt; NullPointerError&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;&amp;#125;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;throw&lt;/span&gt; &lt;span&gt;new&lt;/span&gt; &lt;span&gt;Error&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;quot;SIGSEGV&amp;quot;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span&gt;&amp;#125;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;
&lt;h1&gt;What about x86_64 ? What about recovering ?&lt;/h1&gt;
&lt;p&gt;You have all required data to understand the code, so I&amp;#8217;ll just let you read it : &lt;a href="http://www.deadalnix.me/wp-content/uploads/2012/03/sigsegv.d.txt"&gt;sigsegv.d&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;x86_64 assembly code is different, due to different architecture and calling convention. The example also show how you can recover without throwing by protecting a page, and unprotecting it within the userspace handler.&lt;/p&gt;
&lt;p&gt;A pull request have been done to include that into the runtime of D : https://github.com/D-Programming-Language/druntime/pull/187&lt;/p&gt;
&lt;p&gt;Special thank to &lt;a href="http://thecybershadow.net/"&gt;Vladimir Panteleev&lt;/a&gt; and FeepingCreature for ideas that produces this code and blog post.&lt;/p&gt;</content>
		<author>
			<name>deadalnix</name>
			<uri>http://www.deadalnix.me</uri>
		</author>
		<source>
			<title type="html">Deadalnix's den » D programming</title>
			<subtitle type="html">Just another WordPress site</subtitle>
			<link rel="self" href="http://www.deadalnix.me/category/software-and-devellopement/d-programming/feed/" />
			<id>http://www.deadalnix.me/category/software-and-devellopement/d-programming/feed/</id>
			<updated>2012-04-06T19:00:13+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">GDC Now on GitHub</title>
		<link href="http://feedproxy.google.com/~r/TheOneWithD/~3/vtLY4l8CIpA/" />
		<id>http://dblog.aldacron.net/?p=1030</id>
		<updated>2012-03-19T03:26:36+00:00</updated>
		<content type="html">&lt;p&gt;Like so many other D-related projects, &lt;a href="https://github.com/D-Programming-GDC" target="_blank"&gt;GDC has been migrated to github&lt;/a&gt;. I suspect this will up the participation level by a significant factor.&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TheOneWithD?a=vtLY4l8CIpA:Et7v-u7gGLk:yIl2AUoC8zA"&gt;&lt;img border="0" src="http://feeds.feedburner.com/~ff/TheOneWithD?d=yIl2AUoC8zA" /&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheOneWithD?a=vtLY4l8CIpA:Et7v-u7gGLk:F7zBnMyn0Lo"&gt;&lt;img border="0" src="http://feeds.feedburner.com/~ff/TheOneWithD?i=vtLY4l8CIpA:Et7v-u7gGLk:F7zBnMyn0Lo" /&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheOneWithD?a=vtLY4l8CIpA:Et7v-u7gGLk:cGdyc7Q-1BI"&gt;&lt;img border="0" src="http://feeds.feedburner.com/~ff/TheOneWithD?d=cGdyc7Q-1BI" /&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img height="1" src="http://feeds.feedburner.com/~r/TheOneWithD/~4/vtLY4l8CIpA" width="1" /&gt;</content>
		<author>
			<name>Aldacron</name>
			<uri>http://dblog.aldacron.net</uri>
		</author>
		<source>
			<title type="html">The One With D</title>
			<subtitle type="html">News and Opinions Regarding the D Programming Language</subtitle>
			<link rel="self" href="http://feeds.feedburner.com/TheOneWithD" />
			<id>http://feeds.feedburner.com/TheOneWithD</id>
			<updated>2012-05-21T14:00:43+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Pegged</title>
		<link href="http://feedproxy.google.com/~r/TheOneWithD/~3/1y-8a3IxnHE/" />
		<id>http://dblog.aldacron.net/?p=1028</id>
		<updated>2012-03-15T04:20:18+00:00</updated>
		<content type="html">&lt;p&gt;Philippe Sigaud recently announced &lt;a href="https://github.com/PhilippeSigaud/Pegged" target="_blank"&gt;Pegged&lt;/a&gt;, a parsing expression grammar generator written in D. I have no background at all in this sort of thing, so talk about EBNF grammars and PEGs go way over my head. But if that&amp;#8217;s your thing, there&amp;#8217;s &lt;a href="http://forum.dlang.org/thread/wrxicxjhafssqldsgknh@forum.dlang.org" target="_blank"&gt;an ongoing thread &lt;/a&gt;in the D.announce forum you may want to drop in on.&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TheOneWithD?a=1y-8a3IxnHE:9HDKy_HKdp4:yIl2AUoC8zA"&gt;&lt;img border="0" src="http://feeds.feedburner.com/~ff/TheOneWithD?d=yIl2AUoC8zA" /&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheOneWithD?a=1y-8a3IxnHE:9HDKy_HKdp4:F7zBnMyn0Lo"&gt;&lt;img border="0" src="http://feeds.feedburner.com/~ff/TheOneWithD?i=1y-8a3IxnHE:9HDKy_HKdp4:F7zBnMyn0Lo" /&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheOneWithD?a=1y-8a3IxnHE:9HDKy_HKdp4:cGdyc7Q-1BI"&gt;&lt;img border="0" src="http://feeds.feedburner.com/~ff/TheOneWithD?d=cGdyc7Q-1BI" /&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img height="1" src="http://feeds.feedburner.com/~r/TheOneWithD/~4/1y-8a3IxnHE" width="1" /&gt;</content>
		<author>
			<name>Aldacron</name>
			<uri>http://dblog.aldacron.net</uri>
		</author>
		<source>
			<title type="html">The One With D</title>
			<subtitle type="html">News and Opinions Regarding the D Programming Language</subtitle>
			<link rel="self" href="http://feeds.feedburner.com/TheOneWithD" />
			<id>http://feeds.feedburner.com/TheOneWithD</id>
			<updated>2012-05-21T14:00:43+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Visual D 0.3.31</title>
		<link href="http://feedproxy.google.com/~r/TheOneWithD/~3/5M2OAUARRCw/" />
		<id>http://dblog.aldacron.net/?p=1026</id>
		<updated>2012-03-15T04:13:03+00:00</updated>
		<content type="html">&lt;p&gt;Big news from Rainer Schuetze. The latest release of &lt;a href="http://www.dsource.org/projects/visuald/wiki/" target="_blank"&gt;Visual D&lt;/a&gt; adds support for GDC. There&amp;#8217;s &lt;a href="http://www.dsource.org/projects/visuald/wiki/Installation#UsingGDC" target="_blank"&gt;a page on the project wiki&lt;/a&gt; that explains how to get it set up. This release also fixes one of my pet peeves. You can now edit the properties of multiple build configurations at once. Previously, any common properties had to be entered repeated for each configuration. Thank you, Rainer!&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TheOneWithD?a=5M2OAUARRCw:_YRC3iFw5Cw:yIl2AUoC8zA"&gt;&lt;img border="0" src="http://feeds.feedburner.com/~ff/TheOneWithD?d=yIl2AUoC8zA" /&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheOneWithD?a=5M2OAUARRCw:_YRC3iFw5Cw:F7zBnMyn0Lo"&gt;&lt;img border="0" src="http://feeds.feedburner.com/~ff/TheOneWithD?i=5M2OAUARRCw:_YRC3iFw5Cw:F7zBnMyn0Lo" /&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheOneWithD?a=5M2OAUARRCw:_YRC3iFw5Cw:cGdyc7Q-1BI"&gt;&lt;img border="0" src="http://feeds.feedburner.com/~ff/TheOneWithD?d=cGdyc7Q-1BI" /&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img height="1" src="http://feeds.feedburner.com/~r/TheOneWithD/~4/5M2OAUARRCw" width="1" /&gt;</content>
		<author>
			<name>Aldacron</name>
			<uri>http://dblog.aldacron.net</uri>
		</author>
		<source>
			<title type="html">The One With D</title>
			<subtitle type="html">News and Opinions Regarding the D Programming Language</subtitle>
			<link rel="self" href="http://feeds.feedburner.com/TheOneWithD" />
			<id>http://feeds.feedburner.com/TheOneWithD</id>
			<updated>2012-05-21T14:00:43+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">Putting D's Array Slices to Use</title>
		<link href="http://www.gamedev.net/blog/1140/entry-2254327-putting-ds-array-slices-to-use/" />
		<id>http://www.gamedev.net/blog/1140/entry-2254327-putting-ds-array-slices-to-use/</id>
		<updated>2012-03-08T15:50:00+00:00</updated>
		<content type="html">I've been working on &lt;a class="bbc_url" href="http://www.gamedev.net/blog/1140/entry-2254305-borderwatch/" title=""&gt;BorderWatch&lt;/a&gt; a little bit every day. My focus has been on getting the ASCII engine, Arthur, into a state that will let me get a game up and running. With the few modules that I've implemented so far, I believe I'm there. One of the D features that has...</content>
		<author>
			<name>D Bits</name>
			<uri>http://www.gamedev.net/blog/1140-d-bits/</uri>
		</author>
		<source>
			<title type="html">D Bits</title>
			<subtitle type="html">D Bits Syndication</subtitle>
			<link rel="self" href="http://feeds.feedburner.com/DBits" />
			<id>http://feeds.feedburner.com/DBits</id>
			<updated>2012-05-19T12:00:21+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">BorderWatch</title>
		<link href="http://www.gamedev.net/blog/1140/entry-2254305-borderwatch/" />
		<id>http://www.gamedev.net/blog/1140/entry-2254305-borderwatch/</id>
		<updated>2012-03-05T14:26:00+00:00</updated>
		<content type="html">I'm afraid I'm going to be waving goodbye to &lt;a class="bbc_url" href="http://www.gamedev.net/blog/1140/entry-2250025-got-the-bug-again/" title=""&gt;Dolce&lt;/a&gt;. It's been sitting, bit rotting, for a while now. Some time ago I encountered two major issues with my Allegro binding in &lt;a class="bbc_url" href="http://www.dsource.org/projects/derelict/" rel="nofollow external" title="External link"&gt;Derelict 2&lt;/a&gt;. One, a random (and I mean...</content>
		<author>
			<name>D Bits</name>
			<uri>http://www.gamedev.net/blog/1140-d-bits/</uri>
		</author>
		<source>
			<title type="html">D Bits</title>
			<subtitle type="html">D Bits Syndication</subtitle>
			<link rel="self" href="http://feeds.feedburner.com/DBits" />
			<id>http://feeds.feedburner.com/DBits</id>
			<updated>2012-05-19T12:00:21+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Impact of 64bits vs 32bits when using non precise GC.</title>
		<link href="http://www.deadalnix.me/2012/03/05/impact-of-64bits-vs-32bits-when-using-non-precise-gc/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=impact-of-64bits-vs-32bits-when-using-non-precise-gc" />
		<id>http://www.deadalnix.me/?p=134</id>
		<updated>2012-03-04T23:00:27+00:00</updated>
		<content type="html">&lt;p&gt;As ARM release its intention to go 64bits, we can be pretty much sure that almost every device will be 64bits soon, except the one on which it is unrealistic to run a garbage collector.&lt;/p&gt;
&lt;p&gt;A garbage collector can be precise like in Java, or not, like D&amp;#8217;s GC or Boehm&amp;#8217;s GC for C++. It means that theses GC don&amp;#8217;t know what it a pointer and what isn&amp;#8217;t. Non precise GC cannot move data to compact the heap, and are also prone to false positive. On a theoretical perspective, switching from 32 bits to 64 bits should improve things, but what it is in practice ?&lt;/p&gt;
&lt;p&gt;&lt;span id="more-134"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h1&gt;Non precise GC, and how false positive happens&lt;/h1&gt;
&lt;p&gt;When you use a non precise GC, the GC is not aware of what is a pointer and what isn&amp;#8217;t. It has to suppose that any data it encounter may be a pointer. Pointers are just a numbers stored in memory, and storing the address of something else in the memory. If you have data in memory, even if theses data aren&amp;#8217;t pointers, they may have the value of an existing memory address, where something else is stored. This something else will be marked as « alive » by the GC, even if it is actually garbage. This is a false positive. Thing can cascade, because that memory marked as alive can also keep alive some other pieces of memory, and so on.&lt;/p&gt;
&lt;p&gt;The bigger the block of memory are, the worse the problem becomes. A large chunk of memory is more likely to be kept as a false positive, because if it is bigger, more address point to it, and so more data can eventually have the same value of one of theses addresses. So the bigger the block is, the more likely it will become a false positive but it get worse ! If the block is bigger, it has more data in it, so it will also cascade more. Finally, the block is bigger, so the direct consequence of the false positive is bigger.&lt;/p&gt;
&lt;p&gt;On a 64 bits system, memory addresses are 64 bits long. As the memory address space is way larger, it is less likely that false positive happen.&lt;/p&gt;
&lt;h1&gt;A program that generate garbage and store how much memory it use&lt;/h1&gt;
&lt;p&gt;To get numbers, lets generate garbage !&lt;/p&gt;
&lt;div class="codecolorer-container d railscasts"&gt;&lt;table cellpadding="0" cellspacing="0"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;div&gt;1&lt;br /&gt;2&lt;br /&gt;3&lt;br /&gt;4&lt;br /&gt;5&lt;br /&gt;6&lt;br /&gt;7&lt;br /&gt;8&lt;br /&gt;9&lt;br /&gt;10&lt;br /&gt;11&lt;br /&gt;12&lt;br /&gt;13&lt;br /&gt;14&lt;br /&gt;15&lt;br /&gt;16&lt;br /&gt;17&lt;br /&gt;18&lt;br /&gt;19&lt;br /&gt;20&lt;br /&gt;21&lt;br /&gt;22&lt;br /&gt;23&lt;br /&gt;24&lt;br /&gt;25&lt;br /&gt;26&lt;br /&gt;27&lt;br /&gt;28&lt;br /&gt;29&lt;br /&gt;30&lt;br /&gt;31&lt;br /&gt;32&lt;br /&gt;33&lt;br /&gt;34&lt;br /&gt;35&lt;br /&gt;36&lt;br /&gt;37&lt;br /&gt;38&lt;br /&gt;39&lt;br /&gt;40&lt;br /&gt;41&lt;br /&gt;42&lt;br /&gt;43&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;div class="d codecolorer"&gt;&lt;span&gt;void&lt;/span&gt; main&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;import&lt;/span&gt; std.&lt;span&gt;random&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; Mt19937 gen&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;import&lt;/span&gt; std.&lt;span&gt;process&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;import&lt;/span&gt; std.&lt;span&gt;conv&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; string cmd &lt;span&gt;=&lt;/span&gt; &lt;span&gt;&amp;quot;cat /proc/&amp;quot;&lt;/span&gt; &lt;span&gt;~&lt;/span&gt; to&lt;span&gt;!&lt;/span&gt;string&lt;span&gt;&amp;#40;&lt;/span&gt;getpid&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;~&lt;/span&gt; &lt;span&gt;&amp;quot;/statm | cut -d ' ' -f 2&amp;quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;//*&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;alias&lt;/span&gt; &lt;span&gt;void&lt;/span&gt;&lt;span&gt;*&lt;/span&gt; T&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;/*/&lt;br /&gt;
&amp;nbsp; &amp;nbsp; alias uint T;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; //*/&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;// Variable block size.&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;enum&lt;/span&gt; BLOCK_SIZE &lt;span&gt;=&lt;/span&gt; &lt;span&gt;32&lt;/span&gt; &lt;span&gt;*&lt;/span&gt; &lt;span&gt;1024&lt;/span&gt; &lt;span&gt;*&lt;/span&gt; &lt;span&gt;1024&lt;/span&gt; &lt;span&gt;/&lt;/span&gt; T.&lt;span&gt;sizeof&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;br /&gt;
&amp;nbsp; &amp;nbsp; T&lt;span&gt;&amp;#91;&lt;/span&gt;&lt;span&gt;&amp;#93;&lt;/span&gt; prevdatas&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; T&lt;span&gt;&amp;#91;&lt;/span&gt;&lt;span&gt;&amp;#93;&lt;/span&gt; datas &lt;span&gt;=&lt;/span&gt; &lt;span&gt;new&lt;/span&gt; T&lt;span&gt;&amp;#91;&lt;/span&gt;BLOCK_SIZE&lt;span&gt;&amp;#93;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; T&lt;span&gt;&amp;#91;&lt;/span&gt;&lt;span&gt;&amp;#93;&lt;/span&gt; crap&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;for&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;uint&lt;/span&gt; i &lt;span&gt;=&lt;/span&gt; &lt;span&gt;0&lt;/span&gt;&lt;span&gt;;&lt;/span&gt; i &lt;span&gt;&amp;lt;&lt;/span&gt; &lt;span&gt;8192&lt;/span&gt;&lt;span&gt;;&lt;/span&gt; i&lt;span&gt;++&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;foreach&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;ref&lt;/span&gt; data&lt;span&gt;;&lt;/span&gt; datas&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;static&lt;/span&gt; &lt;span&gt;if&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;T.&lt;span&gt;sizeof&lt;/span&gt; &lt;span&gt;&amp;gt;&lt;/span&gt; &lt;span&gt;4&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; data &lt;span&gt;=&lt;/span&gt; &lt;span&gt;cast&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;T&lt;span&gt;&amp;#41;&lt;/span&gt; gen.&lt;span&gt;front&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; gen.&lt;span&gt;popFront&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; data &lt;span&gt;=&lt;/span&gt; &lt;span&gt;cast&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;T&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;cast&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;long&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt; data &lt;span&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span&gt;32&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;|&lt;/span&gt; gen.&lt;span&gt;front&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;&amp;#125;&lt;/span&gt; &lt;span&gt;else&lt;/span&gt; &lt;span&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; data &lt;span&gt;=&lt;/span&gt; &lt;span&gt;cast&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;T&lt;span&gt;&amp;#41;&lt;/span&gt; gen.&lt;span&gt;front&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;&amp;#125;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; gen.&lt;span&gt;popFront&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;&amp;#125;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; crap &lt;span&gt;=&lt;/span&gt; prevdatas &lt;span&gt;~&lt;/span&gt; datas&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; prevdatas &lt;span&gt;=&lt;/span&gt; datas&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; datas &lt;span&gt;=&lt;/span&gt; &lt;span&gt;new&lt;/span&gt; T&lt;span&gt;&amp;#91;&lt;/span&gt;BLOCK_SIZE&lt;span&gt;&amp;#93;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;if&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;i &lt;span&gt;%&lt;/span&gt; &lt;span&gt;16&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;==&lt;/span&gt; &lt;span&gt;0&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;import&lt;/span&gt; std.&lt;span&gt;stdio&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; write&lt;span&gt;&amp;#40;&lt;/span&gt;shell&lt;span&gt;&amp;#40;&lt;/span&gt;cmd&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;&amp;#125;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;&amp;#125;&lt;/span&gt;&lt;br /&gt;
&lt;span&gt;&amp;#125;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;
&lt;p&gt;This program allocate arrays, and put random value in them. And start again and again. At some point, it does measure how much memory it use.&lt;/p&gt;
&lt;p&gt;This program doesn&amp;#8217;t keep any reference to the old arrays, so it should generate a lot of garbage but if the memory usage grow, we have a leak (so false positives).&lt;/p&gt;
&lt;h1&gt;Result on 32 bits&lt;/h1&gt;
&lt;p&gt;The results on a 32bits system are scary. I did measure the memory consumption of this program with different block sizes. First of all, I could not run it on block larger than 128Kb. At this point, the amount of false positive is that high that the program end up early because it can&amp;#8217;t allocate anymore.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.deadalnix.me/wp-content/uploads/2012/03/mem32.png"&gt;&lt;img alt="" class="aligncenter size-full wp-image-141" height="347" src="http://www.deadalnix.me/wp-content/uploads/2012/03/mem32.png" title="mem32" width="540" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;It is clear that the memory usage isn&amp;#8217;t stable at all. We have a massive leak when the block size is 16Kb and bigger. To know how many blocks did leak, I have rendered the same graph, but with the number of page used divided by the size of the block.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.deadalnix.me/wp-content/uploads/2012/03/mem32normalized.png"&gt;&lt;img alt="" class="aligncenter size-full wp-image-146" height="347" src="http://www.deadalnix.me/wp-content/uploads/2012/03/mem32normalized.png" title="mem32normalized" width="540" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This graph tells us that the amount of false positive is the same for 16, 32 and 64Kb, but then the number of false positive increase when the block size is 128Kb. As the block is bigger, and may itself lead to more false positives, this cascade and put the system over its limits.&lt;/p&gt;
&lt;h1&gt;Lets switch to 64 bits !&lt;/h1&gt;
&lt;p&gt;With 64 bits, the situation is much nicer. I did run the tests to block size up to 32Mb.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.deadalnix.me/wp-content/uploads/2012/03/mem64.png"&gt;&lt;img alt="" class="aligncenter size-full wp-image-147" height="347" src="http://www.deadalnix.me/wp-content/uploads/2012/03/mem64.png" title="mem64" width="540" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;In 64bits, the program quickly reach a point where its memory doesn&amp;#8217;t grow anymore. It means the the amount of false positive is negligible.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.deadalnix.me/wp-content/uploads/2012/03/mem64block.png"&gt;&lt;img alt="" class="aligncenter size-full wp-image-149" height="347" src="http://www.deadalnix.me/wp-content/uploads/2012/03/mem64block.png" title="mem64block" width="540" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;In the first part, the amount of data allocated is negligible compared to the size of the code itself and data from the standard lib and runtime. Then, the memory consumption grow linearly with he memory block size. This second graph confirms that the program is not leaking, and that the amount of floating garbage is proportional with the total amount of data.&lt;/p&gt;
&lt;h1&gt;Conclusion&lt;/h1&gt;
&lt;p&gt;Switching to 64 bits solved the issue of false positive in the test program. These data must be confirmed with real world software, but I think it is safe to assume that the situation is way better in the 64 bits case.&lt;/p&gt;
&lt;p&gt;As 64 bits is the future, it is unreasonable to invest into precise GC unless some very strong short term incitations comes up. However, precise GC has some other advantages that we may want to exploit. This also tells us that semi precise GC &amp;#8211; for example a GC that is precise on the heap, but not on the stack &amp;#8211; is a very valid solution and is compliant with hardware of the future. This also means that GC in system language get way more interesting that it used to be.&lt;/p&gt;
&lt;p&gt;Additionally, this tells us that the support of 64 bits in DMD is a key feature, and a lot of attention should be put on it, especially on windows. 64 bit is, to this regard, a key feature when it comes to non precise GC.&lt;/p&gt;
&lt;p&gt;At some point, false positive will be a problem even in 64bits, but I could not reach the point where it is in a reasonable time and efforts. If someone have data about this limit, please tell me. You&amp;#8217;ll find the raw results, if someone want to study them throw this link : &lt;a href="http://www.deadalnix.me/wp-content/uploads/2012/03/gc_measures_d2.058.ods"&gt;gc_measures_d2.058&lt;/a&gt;&lt;/p&gt;</content>
		<author>
			<name>deadalnix</name>
			<uri>http://www.deadalnix.me</uri>
		</author>
		<source>
			<title type="html">Deadalnix's den » D programming</title>
			<subtitle type="html">Just another WordPress site</subtitle>
			<link rel="self" href="http://www.deadalnix.me/category/software-and-devellopement/d-programming/feed/" />
			<id>http://www.deadalnix.me/category/software-and-devellopement/d-programming/feed/</id>
			<updated>2012-04-06T19:00:13+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">Compiling Data into a D Executable</title>
		<link href="http://www.gamedev.net/blog/1140/entry-2254294-compiling-data-into-a-d-executable/" />
		<id>http://www.gamedev.net/blog/1140/entry-2254294-compiling-data-into-a-d-executable/</id>
		<updated>2012-03-03T14:22:00+00:00</updated>
		<content type="html">I'm supposed to be posting part three of my series on binding D to C. It's going to be boring to write, so I keep putting it off. But I *will* get to it eventually. In the meantime, I wanted to blog about a neat feature of D that I'd sort of forgotten about until I needed it.&lt;br /&gt;
&lt;br /&gt;
I'm working on an ASCII-based strategy/simulation game in the...</content>
		<author>
			<name>D Bits</name>
			<uri>http://www.gamedev.net/blog/1140-d-bits/</uri>
		</author>
		<source>
			<title type="html">D Bits</title>
			<subtitle type="html">D Bits Syndication</subtitle>
			<link rel="self" href="http://feeds.feedburner.com/DBits" />
			<id>http://feeds.feedburner.com/DBits</id>
			<updated>2012-05-19T12:00:21+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Mono-D 0.3.0</title>
		<link href="http://feedproxy.google.com/~r/TheOneWithD/~3/yXECci0H8_4/" />
		<id>http://dblog.aldacron.net/?p=1021</id>
		<updated>2012-02-29T18:47:39+00:00</updated>
		<content type="html">&lt;p&gt;A new version of &lt;a href="http://mono-d.sourceforge.net/?p=303" target="_blank"&gt;Mono-D&lt;/a&gt;, the D Language Add-in for &lt;a href="http://monodevelop.com/Download" target="_blank"&gt;MonoDevelop&lt;/a&gt;, has been announced. This version sports a total overhaul of the code completion engine. There have been several releases of the add-in this month, but I hadn&amp;#8217;t covered them all here. If you&amp;#8217;ve not checked it out yet, you should. It&amp;#8217;s shaping up better and better with each release.&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TheOneWithD?a=yXECci0H8_4:568e2U9pZ4w:yIl2AUoC8zA"&gt;&lt;img border="0" src="http://feeds.feedburner.com/~ff/TheOneWithD?d=yIl2AUoC8zA" /&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheOneWithD?a=yXECci0H8_4:568e2U9pZ4w:F7zBnMyn0Lo"&gt;&lt;img border="0" src="http://feeds.feedburner.com/~ff/TheOneWithD?i=yXECci0H8_4:568e2U9pZ4w:F7zBnMyn0Lo" /&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheOneWithD?a=yXECci0H8_4:568e2U9pZ4w:cGdyc7Q-1BI"&gt;&lt;img border="0" src="http://feeds.feedburner.com/~ff/TheOneWithD?d=cGdyc7Q-1BI" /&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img height="1" src="http://feeds.feedburner.com/~r/TheOneWithD/~4/yXECci0H8_4" width="1" /&gt;</content>
		<author>
			<name>Aldacron</name>
			<uri>http://dblog.aldacron.net</uri>
		</author>
		<source>
			<title type="html">The One With D</title>
			<subtitle type="html">News and Opinions Regarding the D Programming Language</subtitle>
			<link rel="self" href="http://feeds.feedburner.com/TheOneWithD" />
			<id>http://feeds.feedburner.com/TheOneWithD</id>
			<updated>2012-05-21T14:00:43+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en-us">
		<title type="html">Inheriting Purity</title>
		<link href="http://www.drdobbs.com/blogs/cpp/232601305" />
		<id>http://www.drdobbs.com/blogs/cpp/232601305</id>
		<updated>2012-02-22T23:16:00+00:00</updated>
		<content type="html">Pure functions are an essential characteristic of functional programming, and their value is widely recognized.</content>
		<author>
			<name>Walter Bright</name>
			<uri>http://www.drdobbs.com//author/6839</uri>
		</author>
		<source>
			<title type="html">Dr. Dobb's Blogs</title>
			<subtitle type="html">Dr. Dobb's</subtitle>
			<link rel="self" href="http://www.drdobbs.com/rss/blogs/author/6839" />
			<id>http://www.drdobbs.com/rss/blogs/author/6839</id>
			<updated>2012-05-27T18:00:12+00:00</updated>
			<rights type="html">Copyright 2012, United Business Media.</rights>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">A review of D2 – constness and immutablility</title>
		<link href="http://www.deadalnix.me/2012/02/18/a-review-of-d2-constness-and-immutablility/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=a-review-of-d2-constness-and-immutablility" />
		<id>http://www.deadalnix.42/?p=110</id>
		<updated>2012-02-18T17:00:10+00:00</updated>
		<content type="html">&lt;p&gt;The D programming language is a very promising language. I propose here to do a quick review of some problems it is facing (or at least problems I&amp;#8217;m facing when using it) and propose some solutions.&lt;/p&gt;
&lt;h1&gt;Immutability and constness in D2&lt;/h1&gt;
&lt;p&gt;I wanted to to a single, but writing it, it kept getting longer and longer. The point wasn&amp;#8217;t to rant randomly, but also to make some proposal to improve things. So I did split it into smaller articles, and here the first one. We will discuss constness and immutability in D2.&lt;/p&gt;
&lt;p&gt;&lt;span id="more-110"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h2&gt;Immutability&lt;/h2&gt;
&lt;p&gt;D2 has several types qualifier (immutable, shared) and they are transitive. It means that any reference or pointer cannot point to anything depending on its type qualifier and cast cannot be done in all directions.&lt;/p&gt;
&lt;p&gt;immutable data are data that can only be set once and never redefined again. This ensure that immutable data can be shared without any synchronization process. By default, data are thread local storage, and immutable is a way to share data across threads (with some limitations).&lt;/p&gt;
&lt;p&gt;immutable data can point to immutable data only.&lt;br /&gt;
mutable data can point to mutable or immutable data.&lt;/p&gt;
&lt;p&gt;This ensure that immutable data can never point to thread local data, so it avoid sharing data that isn&amp;#8217;t supposed to by mistake.&lt;/p&gt;
&lt;h2&gt;Conciliate mutable and immutable world : const&lt;/h2&gt;
&lt;p&gt;Theses qualifiers are completed by const. const is a wild-card, because both immutable and mutable data can cast implicitly to it. It allow the programmer to write code that will work with both mutable and immutable data without duplication when modifying data isn&amp;#8217;t required.&lt;/p&gt;
&lt;p&gt;So you can cast immutable and mutable to const, but not the other way around.&lt;br /&gt;
mutable data can point to const but not the other way around.&lt;br /&gt;
const data can point to const or immutable data.&lt;br /&gt;
immutable data cannot point to const.&lt;/p&gt;
&lt;p&gt;Theses rules ensure that previously expressed rules still apply.&lt;/p&gt;
&lt;p&gt;Consider the simple exemple :&lt;/p&gt;
&lt;div class="codecolorer-container d railscasts"&gt;&lt;table cellpadding="0" cellspacing="0"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;div&gt;1&lt;br /&gt;2&lt;br /&gt;3&lt;br /&gt;4&lt;br /&gt;5&lt;br /&gt;6&lt;br /&gt;7&lt;br /&gt;8&lt;br /&gt;9&lt;br /&gt;10&lt;br /&gt;11&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;div class="d codecolorer"&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;*&lt;/span&gt; fun&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;const&lt;/span&gt; &lt;span&gt;int&lt;/span&gt;&lt;span&gt;*&lt;/span&gt; p&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;return&lt;/span&gt; p&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span&gt;&amp;#125;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span&gt;void&lt;/span&gt; main&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;int&lt;/span&gt; a &lt;span&gt;=&lt;/span&gt; &lt;span&gt;3&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; immutable &lt;span&gt;int&lt;/span&gt; b &lt;span&gt;=&lt;/span&gt; &lt;span&gt;5&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; fun&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;amp;&lt;/span&gt;a&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt; &amp;nbsp; &amp;nbsp;&lt;span&gt;// Works&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; fun&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;amp;&lt;/span&gt;b&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt; &amp;nbsp; &amp;nbsp;&lt;span&gt;// Works too !&lt;/span&gt;&lt;br /&gt;
&lt;span&gt;&amp;#125;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;
&lt;p&gt;Great, now we have a function that will work both with mutable and immutable.&lt;/p&gt;
&lt;h2&gt;Going further with inout, a scope defined type qualifier&lt;/h2&gt;
&lt;p&gt;Sometime, returning const just doesn&amp;#8217;t make it. Because if you pass an immutable as argument, you may want to return an immutable, and not a const. This is explained in &lt;a href="http://drdobbs.com/blogs/cpp/231902461" target="_blank"&gt;this article about inout&lt;/a&gt; very nicely.&lt;/p&gt;
&lt;p&gt;Consider the simple example from previous part of the article :&lt;/p&gt;
&lt;div class="codecolorer-container d railscasts"&gt;&lt;table cellpadding="0" cellspacing="0"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;div&gt;1&lt;br /&gt;2&lt;br /&gt;3&lt;br /&gt;4&lt;br /&gt;5&lt;br /&gt;6&lt;br /&gt;7&lt;br /&gt;8&lt;br /&gt;9&lt;br /&gt;10&lt;br /&gt;11&lt;br /&gt;12&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;div class="d codecolorer"&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;*&lt;/span&gt; fun&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;const&lt;/span&gt; &lt;span&gt;int&lt;/span&gt;&lt;span&gt;*&lt;/span&gt; p&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;return&lt;/span&gt; p&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span&gt;&amp;#125;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span&gt;void&lt;/span&gt; main&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;int&lt;/span&gt; a &lt;span&gt;=&lt;/span&gt; &lt;span&gt;3&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; immutable &lt;span&gt;int&lt;/span&gt; b &lt;span&gt;=&lt;/span&gt; &lt;span&gt;5&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;const&lt;/span&gt; &lt;span&gt;int&lt;/span&gt;&lt;span&gt;*&lt;/span&gt; c &amp;nbsp; &amp;nbsp; &lt;span&gt;=&lt;/span&gt; fun&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;amp;&lt;/span&gt;a&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt; &amp;nbsp; &amp;nbsp;&lt;span&gt;// Works&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;int&lt;/span&gt;&lt;span&gt;*&lt;/span&gt; d &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;=&lt;/span&gt; fun&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;amp;&lt;/span&gt;a&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt; &amp;nbsp; &amp;nbsp;&lt;span&gt;// Fails ! However, with cut paste of the function code, it works.&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; immutable &lt;span&gt;int&lt;/span&gt;&lt;span&gt;*&lt;/span&gt; e &lt;span&gt;=&lt;/span&gt; fun&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;amp;&lt;/span&gt;b&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt; &amp;nbsp; &amp;nbsp;&lt;span&gt;// Fails ! But will also be correct with cut paste programming skills.&lt;/span&gt;&lt;br /&gt;
&lt;span&gt;&amp;#125;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;
&lt;p&gt;If you call fun with a immutable parameter, you&amp;#8217;ll loose this qualifier for a weaker one : const. A solution is to duplicate the code for immutable and mutable, or to make the compiler duplicate the code using metaprogramming. But it is not required here. We need a way to express the return type according to the parameter type.&lt;/p&gt;
&lt;p&gt;Then come inout. inout is a local type qualifier that can refers to mutable, immutable or const data depending on the case. Locally, inout data are considered as const, but outside this scope, data will get its original type qualifier back. It goes like :&lt;/p&gt;
&lt;div class="codecolorer-container d railscasts"&gt;&lt;table cellpadding="0" cellspacing="0"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;div&gt;1&lt;br /&gt;2&lt;br /&gt;3&lt;br /&gt;4&lt;br /&gt;5&lt;br /&gt;6&lt;br /&gt;7&lt;br /&gt;8&lt;br /&gt;9&lt;br /&gt;10&lt;br /&gt;11&lt;br /&gt;12&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;div class="d codecolorer"&gt;&lt;span&gt;inout&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;*&lt;/span&gt; fun&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;inout&lt;/span&gt; &lt;span&gt;int&lt;/span&gt;&lt;span&gt;*&lt;/span&gt; p&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;return&lt;/span&gt; p&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span&gt;&amp;#125;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span&gt;void&lt;/span&gt; main&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;int&lt;/span&gt; a &lt;span&gt;=&lt;/span&gt; &lt;span&gt;3&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; immutable &lt;span&gt;int&lt;/span&gt; b &lt;span&gt;=&lt;/span&gt; &lt;span&gt;5&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;const&lt;/span&gt; &lt;span&gt;int&lt;/span&gt;&lt;span&gt;*&lt;/span&gt; c &amp;nbsp; &amp;nbsp; &lt;span&gt;=&lt;/span&gt; fun&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;amp;&lt;/span&gt;a&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt; &amp;nbsp; &amp;nbsp;&lt;span&gt;// Works&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;int&lt;/span&gt;&lt;span&gt;*&lt;/span&gt; d &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;=&lt;/span&gt; fun&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;amp;&lt;/span&gt;a&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt; &amp;nbsp; &amp;nbsp;&lt;span&gt;// Works&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; immutable &lt;span&gt;int&lt;/span&gt;&lt;span&gt;*&lt;/span&gt; e &lt;span&gt;=&lt;/span&gt; fun&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;amp;&lt;/span&gt;b&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt; &amp;nbsp; &amp;nbsp;&lt;span&gt;// Works&lt;/span&gt;&lt;br /&gt;
&lt;span&gt;&amp;#125;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;
&lt;p&gt;The addition of this functionality was a great step forward to reduce the type qualifier mess. But some problems remains.&lt;/p&gt;
&lt;h2&gt;Existing code that has been written without const or immutable in mind.&lt;/h2&gt;
&lt;p&gt;Phobos, the standard lib of D, is full of code that isn&amp;#8217;t const compliant. To begin with, the toString member function of Objects isn&amp;#8217;t const, so cannot be called on const/immutable objects. This is problematic for such a feature, that is required everywhere.&lt;/p&gt;
&lt;p&gt;Another example is invariant. Both feature are not supposed to modify the object they ran on (it would even be a huge mistake in invariant).&lt;/p&gt;
&lt;p&gt;The sames goes for toHash, opCmp, opEquals, and so many others all over the place !&lt;/p&gt;
&lt;p&gt;The current situation is very problematic. In the current state of things, const is broken. It is one a most important problem a beginner encounter and scared beginner isn&amp;#8217;t what we want to make that language successful.&lt;/p&gt;
&lt;p&gt;This will require breaking API changes. We have no choice, we&amp;#8217;d better admit it and plan the change. No easy solutions here, just painful ones. The sooner we do that, the smaller the codebase will, the smaller the impact will. Let&amp;#8217;s not be afraid and break our code !&lt;/p&gt;
&lt;h2&gt;A widely spread misconception in the D community : const cannot qualify a function&lt;/h2&gt;
&lt;p&gt;In this part, I&amp;#8217;ll use const everywhere. However, the whole thing apply to immutable as well. I just omit it to avoid repeating everywhere that the same goes for immutable.&lt;/p&gt;
&lt;p&gt;Let&amp;#8217;s look at the code below :&lt;/p&gt;
&lt;div class="codecolorer-container d railscasts"&gt;&lt;table cellpadding="0" cellspacing="0"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;div&gt;1&lt;br /&gt;2&lt;br /&gt;3&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;div class="d codecolorer"&gt;&lt;span&gt;const&lt;/span&gt; &lt;span&gt;int&lt;/span&gt;&lt;span&gt;*&lt;/span&gt; fun&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;const&lt;/span&gt; &lt;span&gt;int&lt;/span&gt;&lt;span&gt;*&lt;/span&gt; p&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;return&lt;/span&gt; p&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span&gt;&amp;#125;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;
&lt;p&gt;Know what it does ? It does not compile ! « Error: function fun.fun without &amp;#8216;this&amp;#8217; cannot be const/immutable » is saying the compiler. Thank you dude !&lt;/p&gt;
&lt;p&gt;It trigger an error because the compiler try to qualify not the return type, but the function. What is a const function ? In fact it make sense in a very specific case : non static class member functions. In all other case, expect if you put parenthesis, as in previous code samples, it will not compile. Want to scare beginners ? Here is a good solution !&lt;/p&gt;
&lt;p&gt;Note that this specification is even against D design principle « if it look like C, it should behave as expected by a C developer ».&lt;/p&gt;
&lt;p&gt;Ok, that being said, and considering it is just annoying for most function, let&amp;#8217;s consider the case of non static class member function :&lt;/p&gt;
&lt;div class="codecolorer-container d railscasts"&gt;&lt;table cellpadding="0" cellspacing="0"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;div&gt;1&lt;br /&gt;2&lt;br /&gt;3&lt;br /&gt;4&lt;br /&gt;5&lt;br /&gt;6&lt;br /&gt;7&lt;br /&gt;8&lt;br /&gt;9&lt;br /&gt;10&lt;br /&gt;11&lt;br /&gt;12&lt;br /&gt;13&lt;br /&gt;14&lt;br /&gt;15&lt;br /&gt;16&lt;br /&gt;17&lt;br /&gt;18&lt;br /&gt;19&lt;br /&gt;20&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;div class="d codecolorer"&gt;&lt;span&gt;class&lt;/span&gt; Foo &lt;span&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;int&lt;/span&gt;&lt;span&gt;*&lt;/span&gt; x&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;// Error: cannot implicitly convert expression (this.x) of type const(int*) to int*&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;// Excaclty the reverse of what you would expect of such a code at a first look.&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;const&lt;/span&gt; &lt;span&gt;int&lt;/span&gt;&lt;span&gt;*&lt;/span&gt; getX&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;return&lt;/span&gt; x&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;&amp;#125;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;// Error: cast(int)*this.x is not an lvalue&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;// Yes ! ref is qualifying the return type (int), but const is qualifying the hidden parameter this. How convenient and intuitive !&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;ref&lt;/span&gt; &lt;span&gt;const&lt;/span&gt; &lt;span&gt;int&lt;/span&gt; getX2&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;return&lt;/span&gt; &lt;span&gt;*&lt;/span&gt;x&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;&amp;#125;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;// Hopefully this is working as expected. The postfix const syntax is what what is often preferred in current D code, because the other way is too confusing. The parenthesis ensure that the first const is qualifying the return type.&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;const&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;*&lt;/span&gt; getX3&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;const&lt;/span&gt; &lt;span&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;return&lt;/span&gt; x&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;&amp;#125;&lt;/span&gt;&lt;br /&gt;
&lt;span&gt;&amp;#125;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;
&lt;p&gt;I think we could simply admit that const isn&amp;#8217;t qualifying the function, but the hidden parameter this. This has no advantages whatsoever and just confuse newcomers. Additionally, this break readers automatisms, because reading const int* doesn&amp;#8217;t mean always the same thing.&lt;/p&gt;
&lt;p&gt;The worse case being the « ref const » joke in the return type.&lt;/p&gt;
&lt;p&gt;D aims to break patterns of error, and by mistake introduced one that didn&amp;#8217;t existed in its predecessors. It has to be fixed.&lt;/p&gt;
&lt;p&gt;This pattern can be encountered in 3 cases :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Standard functions, or static member functions.&lt;/li&gt;
&lt;li&gt;Non static member functions.&lt;/li&gt;
&lt;li&gt;Function pointers and delegates types.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;And we want to qualify different things as being const :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;The return type.&lt;/li&gt;
&lt;li&gt;The hidden parameter &amp;#8211; this or context execution of a delegate.&lt;/li&gt;
&lt;li&gt;In case of function pointers and delegates types, the pointed memory location.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Let consider the most simple example : a function. The only things that make sens in this case is const qualifying the return type. So why overcomplicating ourselves ? Let&amp;#8217;s make const in the return type qualify the return type itself instead of outputing error. It is what most people will expect.&lt;/p&gt;
&lt;div class="codecolorer-container d railscasts"&gt;&lt;table cellpadding="0" cellspacing="0"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;div&gt;1&lt;br /&gt;2&lt;br /&gt;3&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;div class="d codecolorer"&gt;&lt;span&gt;const&lt;/span&gt; &lt;span&gt;int&lt;/span&gt;&lt;span&gt;*&lt;/span&gt; fun&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;const&lt;/span&gt; &lt;span&gt;int&lt;/span&gt;&lt;span&gt;*&lt;/span&gt; p&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;return&lt;/span&gt; p&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span&gt;&amp;#125;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;
&lt;p&gt;Then, comes hidden parameter. I strongly suggest postfix notation for that, so it cannot be confused with return type qualifier, and would break the confusion about const qualifying the function. This is already know as a good practice in most D project, and shouldn&amp;#8217;t break too many code. However, it should be possible to put that const anywhere &lt;b&gt;after&lt;/b&gt; the return type.&lt;/p&gt;
&lt;div class="codecolorer-container d railscasts"&gt;&lt;table cellpadding="0" cellspacing="0"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;div&gt;1&lt;br /&gt;2&lt;br /&gt;3&lt;br /&gt;4&lt;br /&gt;5&lt;br /&gt;6&lt;br /&gt;7&lt;br /&gt;8&lt;br /&gt;9&lt;br /&gt;10&lt;br /&gt;11&lt;br /&gt;12&lt;br /&gt;13&lt;br /&gt;14&lt;br /&gt;15&lt;br /&gt;16&lt;br /&gt;17&lt;br /&gt;18&lt;br /&gt;19&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;div class="d codecolorer"&gt;&lt;span&gt;class&lt;/span&gt; Foo &lt;span&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;int&lt;/span&gt;&lt;span&gt;*&lt;/span&gt; x&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;const&lt;/span&gt; &lt;span&gt;int&lt;/span&gt;&lt;span&gt;*&lt;/span&gt; fun&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;&amp;#123;&lt;/span&gt; &amp;nbsp;&lt;span&gt;// OK&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;return&lt;/span&gt; x&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;&amp;#125;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;const&lt;/span&gt; &lt;span&gt;int&lt;/span&gt;&lt;span&gt;*&lt;/span&gt; &lt;span&gt;const&lt;/span&gt; fun&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;&amp;#123;&lt;/span&gt; &lt;span&gt;// OK&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;return&lt;/span&gt; x&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;&amp;#125;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;int&lt;/span&gt;&lt;span&gt;*&lt;/span&gt; &lt;span&gt;const&lt;/span&gt; fun&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;&amp;#123;&lt;/span&gt; &lt;span&gt;// Fail : const int* cannot be casted as int*&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;return&lt;/span&gt; x&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;&amp;#125;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;const&lt;/span&gt; &lt;span&gt;int&lt;/span&gt;&lt;span&gt;*&lt;/span&gt; fun&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;const&lt;/span&gt; &lt;span&gt;&amp;#123;&lt;/span&gt; &lt;span&gt;// OK. Equivalent to proposal 2.&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;return&lt;/span&gt; p&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;&amp;#125;&lt;/span&gt;&lt;br /&gt;
&lt;span&gt;&amp;#125;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;
&lt;p&gt;Then we need to be able to qualify function pointer and delegate. Let&amp;#8217;s start with function pointer, because it doesn&amp;#8217;t have transitivity issue. In such a case, the same as previously exposed apply : const qualify return type if it part of it, and qualify function pointer after that. Note that member function are delegate (they have hidden parameter) so this will not conflict. For delegate, transitivity impose us that the type qualifier of the delegate qualify also the hidden parameter. In such a case, const after return type will qualify both delegate and hidden parameter, and postfix const will qualify only the hidden parameter.&lt;/p&gt;
&lt;p&gt;Let&amp;#8217;s put that into some code so it&amp;#8217;s easier to understand :&lt;/p&gt;
&lt;div class="codecolorer-container d railscasts"&gt;&lt;table cellpadding="0" cellspacing="0"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;div&gt;1&lt;br /&gt;2&lt;br /&gt;3&lt;br /&gt;4&lt;br /&gt;5&lt;br /&gt;6&lt;br /&gt;7&lt;br /&gt;8&lt;br /&gt;9&lt;br /&gt;10&lt;br /&gt;11&lt;br /&gt;12&lt;br /&gt;13&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;div class="d codecolorer"&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt;*&lt;/span&gt; &lt;span&gt;function&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt; fp&lt;span&gt;;&lt;/span&gt; &lt;span&gt;// A function pointer that return an int*.&lt;/span&gt;&lt;br /&gt;
&lt;span&gt;const&lt;/span&gt; &lt;span&gt;int&lt;/span&gt;&lt;span&gt;*&lt;/span&gt; &lt;span&gt;function&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt; fp&lt;span&gt;;&lt;/span&gt; &lt;span&gt;// A function pointer that return a const int*.&lt;/span&gt;&lt;br /&gt;
&lt;span&gt;int&lt;/span&gt;&lt;span&gt;*&lt;/span&gt; &lt;span&gt;const&lt;/span&gt; &lt;span&gt;function&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt; fp&lt;span&gt;;&lt;/span&gt; &lt;span&gt;// A constant function pointer that return an int*.&lt;/span&gt;&lt;br /&gt;
&lt;span&gt;const&lt;/span&gt; &lt;span&gt;int&lt;/span&gt;&lt;span&gt;*&lt;/span&gt; &lt;span&gt;const&lt;/span&gt; &lt;span&gt;function&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt; fp&lt;span&gt;;&lt;/span&gt; &lt;span&gt;// A constant function pointer that return a const int*.&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span&gt;int&lt;/span&gt;&lt;span&gt;*&lt;/span&gt; &lt;span&gt;delegate&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt; dg&lt;span&gt;;&lt;/span&gt; &lt;span&gt;// A delegate that return an int* using a mutable hidden parameter.&lt;/span&gt;&lt;br /&gt;
&lt;span&gt;const&lt;/span&gt; &lt;span&gt;int&lt;/span&gt;&lt;span&gt;*&lt;/span&gt; &lt;span&gt;delegate&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt; dg&lt;span&gt;;&lt;/span&gt; &lt;span&gt;// A delegate that return a const int* using a mutable hidden parameter.&lt;/span&gt;&lt;br /&gt;
&lt;span&gt;int&lt;/span&gt;&lt;span&gt;*&lt;/span&gt; &lt;span&gt;const&lt;/span&gt; &lt;span&gt;delegate&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt; dg&lt;span&gt;;&lt;/span&gt; &lt;span&gt;// A constant delegate that return an int* using a const hidden parameter (because of transitivity).&lt;/span&gt;&lt;br /&gt;
&lt;span&gt;const&lt;/span&gt; &lt;span&gt;int&lt;/span&gt;&lt;span&gt;*&lt;/span&gt; &lt;span&gt;const&lt;/span&gt; &lt;span&gt;delegate&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt; dg&lt;span&gt;;&lt;/span&gt; &lt;span&gt;// A constant delegate that return a const int* using a const hidden parameter (because of transitivity).&lt;/span&gt;&lt;br /&gt;
&lt;span&gt;int&lt;/span&gt;&lt;span&gt;*&lt;/span&gt; &lt;span&gt;delegate&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;const&lt;/span&gt; dg&lt;span&gt;;&lt;/span&gt; &lt;span&gt;// A delegate that return an int* using a const hidden parameter.&lt;/span&gt;&lt;br /&gt;
&lt;span&gt;const&lt;/span&gt; &lt;span&gt;int&lt;/span&gt;&lt;span&gt;*&lt;/span&gt; &lt;span&gt;delegate&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;const&lt;/span&gt; dg&lt;span&gt;;&lt;/span&gt; &lt;span&gt;// A delegate that return a const int* using a const hidden parameter.&lt;/span&gt;&lt;br /&gt;
&lt;span&gt;int&lt;/span&gt;&lt;span&gt;*&lt;/span&gt; &lt;span&gt;const&lt;/span&gt; &lt;span&gt;delegate&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt; immutable dg&lt;span&gt;;&lt;/span&gt; &lt;span&gt;// A constant delegate that return an int* using an immutable hidden parameter.&lt;/span&gt;&lt;br /&gt;
&lt;span&gt;const&lt;/span&gt; &lt;span&gt;int&lt;/span&gt;&lt;span&gt;*&lt;/span&gt; &lt;span&gt;const&lt;/span&gt; &lt;span&gt;delegate&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt; immutable dg&lt;span&gt;;&lt;/span&gt; &lt;span&gt;// A constant delegate that return a const int* using an immutable hidden parameter.&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;
&lt;p&gt;In last cases, I used immutable because const was implied by transitivity. So something stronger was required.&lt;/p&gt;
&lt;p&gt;In all cases, parenthesis can be used to explicitly use const as a prefix. This would also make this modification auto compliant. Basically, auto should behave as if it as parenthesis around it.&lt;/p&gt;
&lt;div class="codecolorer-container d railscasts"&gt;&lt;table cellpadding="0" cellspacing="0"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;div&gt;1&lt;br /&gt;2&lt;br /&gt;3&lt;br /&gt;4&lt;br /&gt;5&lt;br /&gt;6&lt;br /&gt;7&lt;br /&gt;8&lt;br /&gt;9&lt;br /&gt;10&lt;br /&gt;11&lt;br /&gt;12&lt;br /&gt;13&lt;br /&gt;14&lt;br /&gt;15&lt;br /&gt;16&lt;br /&gt;17&lt;br /&gt;18&lt;br /&gt;19&lt;br /&gt;20&lt;br /&gt;21&lt;br /&gt;22&lt;br /&gt;23&lt;br /&gt;24&lt;br /&gt;25&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;div class="d codecolorer"&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt;*&lt;/span&gt; &lt;span&gt;function&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt; fp&lt;span&gt;;&lt;/span&gt; &lt;span&gt;// A constant function pointer that return an int*.&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span&gt;const&lt;/span&gt; &lt;span&gt;auto&lt;/span&gt; fp &lt;span&gt;=&lt;/span&gt; &lt;span&gt;function&lt;/span&gt; &lt;span&gt;int&lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;&amp;#123;&lt;/span&gt; &lt;span&gt;// A constant function pointer that return an int* as well.&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;return&lt;/span&gt; &lt;span&gt;null&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span&gt;&amp;#125;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span&gt;const&lt;/span&gt; &lt;span&gt;auto&lt;/span&gt; fp &lt;span&gt;=&lt;/span&gt; &lt;span&gt;delegate&lt;/span&gt; &lt;span&gt;int&lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;&amp;#123;&lt;/span&gt; &lt;span&gt;// A constant delegate that return an int* as well using a const hidden parameter.&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;return&lt;/span&gt; &lt;span&gt;null&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span&gt;&amp;#125;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span&gt;auto&lt;/span&gt; fp &lt;span&gt;=&lt;/span&gt; &lt;span&gt;delegate&lt;/span&gt; &lt;span&gt;int&lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;const&lt;/span&gt; &lt;span&gt;&amp;#123;&lt;/span&gt; &lt;span&gt;// A constant delegate to a function that return an int* using a const hidden parameter.&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;return&lt;/span&gt; &lt;span&gt;null&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span&gt;&amp;#125;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span&gt;auto&lt;/span&gt; &lt;span&gt;const&lt;/span&gt; fp &lt;span&gt;=&lt;/span&gt; &lt;span&gt;delegate&lt;/span&gt; &lt;span&gt;int&lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;const&lt;/span&gt; &lt;span&gt;&amp;#123;&lt;/span&gt; &lt;span&gt;// A constant delegate to a function that return an int* using a const hidden parameter.&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;return&lt;/span&gt; &lt;span&gt;null&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span&gt;&amp;#125;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span&gt;auto&lt;/span&gt; fp &lt;span&gt;=&lt;/span&gt; &lt;span&gt;delegate&lt;/span&gt; &lt;span&gt;int&lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt; immutable &lt;span&gt;&amp;#123;&lt;/span&gt; &lt;span&gt;// A delegate to a function that return an int* using a immutable hidden parameter.&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;return&lt;/span&gt; &lt;span&gt;null&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span&gt;&amp;#125;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span&gt;const&lt;/span&gt; &lt;span&gt;auto&lt;/span&gt; fp &lt;span&gt;=&lt;/span&gt; &lt;span&gt;delegate&lt;/span&gt; &lt;span&gt;int&lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt; immutable &lt;span&gt;&amp;#123;&lt;/span&gt; &lt;span&gt;// A constant delegate to a function that return an int* using a immutable hidden parameter.&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;return&lt;/span&gt; &lt;span&gt;null&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span&gt;&amp;#125;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;I hope I didn&amp;#8217;t scarred you. D2 type system is really nice and address many issue that exists in other languages, introducing the tools required to handle functional and concurrent programming style.&lt;/p&gt;
&lt;p&gt;However, this type system is really something new and some work has to be done to make it as powerful and as easy to use as it is on the paper.&lt;/p&gt;</content>
		<author>
			<name>deadalnix</name>
			<uri>http://www.deadalnix.me</uri>
		</author>
		<source>
			<title type="html">Deadalnix's den » D programming</title>
			<subtitle type="html">Just another WordPress site</subtitle>
			<link rel="self" href="http://www.deadalnix.me/category/software-and-devellopement/d-programming/feed/" />
			<id>http://www.deadalnix.me/category/software-and-devellopement/d-programming/feed/</id>
			<updated>2012-04-06T19:00:13+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Mono-D 0.2.9</title>
		<link href="http://feedproxy.google.com/~r/TheOneWithD/~3/xc52MrwKMtM/" />
		<id>http://dblog.aldacron.net/?p=1019</id>
		<updated>2012-02-17T05:15:58+00:00</updated>
		<content type="html">&lt;p&gt;&lt;a href="http://mono-d.sourceforge.net/"&gt;Mono-D&lt;/a&gt; is a plugin for &lt;a href="http://monodevelop.com/"&gt;MonoDevelop&lt;/a&gt; that allows for D support. Version 0.2.9 is now available for download.&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TheOneWithD?a=xc52MrwKMtM:_QXh7TDaMi4:yIl2AUoC8zA"&gt;&lt;img border="0" src="http://feeds.feedburner.com/~ff/TheOneWithD?d=yIl2AUoC8zA" /&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheOneWithD?a=xc52MrwKMtM:_QXh7TDaMi4:F7zBnMyn0Lo"&gt;&lt;img border="0" src="http://feeds.feedburner.com/~ff/TheOneWithD?i=xc52MrwKMtM:_QXh7TDaMi4:F7zBnMyn0Lo" /&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheOneWithD?a=xc52MrwKMtM:_QXh7TDaMi4:cGdyc7Q-1BI"&gt;&lt;img border="0" src="http://feeds.feedburner.com/~ff/TheOneWithD?d=cGdyc7Q-1BI" /&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img height="1" src="http://feeds.feedburner.com/~r/TheOneWithD/~4/xc52MrwKMtM" width="1" /&gt;</content>
		<author>
			<name>Aldacron</name>
			<uri>http://dblog.aldacron.net</uri>
		</author>
		<source>
			<title type="html">The One With D</title>
			<subtitle type="html">News and Opinions Regarding the D Programming Language</subtitle>
			<link rel="self" href="http://feeds.feedburner.com/TheOneWithD" />
			<id>http://feeds.feedburner.com/TheOneWithD</id>
			<updated>2012-05-21T14:00:43+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">DMD 1.073 and 2.058</title>
		<link href="http://feedproxy.google.com/~r/TheOneWithD/~3/AWKQrnx4OD0/" />
		<id>http://dblog.aldacron.net/?p=1017</id>
		<updated>2012-02-15T05:35:49+00:00</updated>
		<content type="html">&lt;p&gt;There&amp;#8217;s a lot to be happy about in the two new DMD releases. Both version &lt;a href="http://www.digitalmars.com/d/1.0/changelog.html#new1_073" target="_blank"&gt;1.073&lt;/a&gt; and &lt;a href="http://www.d-programming-language.org/changelog.html#new2_058" target="_blank"&gt;2.058&lt;/a&gt; are loaded with bugfixes. The 2.x release even sports a new lambda syntax. I was very happy that &lt;a href="http://d.puremagic.com/issues/show_bug.cgi?id=314" target="_blank"&gt;my &amp;#8220;favorite&amp;#8221; D bug&lt;/a&gt; was finally getting fixed in this release. Unfortunately, it was reverted during beta due to some serious regressions. My fingers are crossed for the next release.&lt;/p&gt;
&lt;p&gt;Thanks to every one who helped make these fantastic releases possible. Your hard work is always appreciated!&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TheOneWithD?a=AWKQrnx4OD0:dP-O2Ug-fek:yIl2AUoC8zA"&gt;&lt;img border="0" src="http://feeds.feedburner.com/~ff/TheOneWithD?d=yIl2AUoC8zA" /&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheOneWithD?a=AWKQrnx4OD0:dP-O2Ug-fek:F7zBnMyn0Lo"&gt;&lt;img border="0" src="http://feeds.feedburner.com/~ff/TheOneWithD?i=AWKQrnx4OD0:dP-O2Ug-fek:F7zBnMyn0Lo" /&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheOneWithD?a=AWKQrnx4OD0:dP-O2Ug-fek:cGdyc7Q-1BI"&gt;&lt;img border="0" src="http://feeds.feedburner.com/~ff/TheOneWithD?d=cGdyc7Q-1BI" /&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img height="1" src="http://feeds.feedburner.com/~r/TheOneWithD/~4/AWKQrnx4OD0" width="1" /&gt;</content>
		<author>
			<name>Aldacron</name>
			<uri>http://dblog.aldacron.net</uri>
		</author>
		<source>
			<title type="html">The One With D</title>
			<subtitle type="html">News and Opinions Regarding the D Programming Language</subtitle>
			<link rel="self" href="http://feeds.feedburner.com/TheOneWithD" />
			<id>http://feeds.feedburner.com/TheOneWithD</id>
			<updated>2012-05-21T14:00:43+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">D Forums</title>
		<link href="http://feedproxy.google.com/~r/TheOneWithD/~3/DQ03J22qq7s/" />
		<id>http://dblog.aldacron.net/?p=1014</id>
		<updated>2012-02-15T02:48:05+00:00</updated>
		<content type="html">&lt;p&gt;Vladimir Panteleev&amp;#8217;s awesome web interface to the D newsgroups has now gone &lt;a href="http://forum.dlang.org/" target="_blank"&gt;live on the D site&lt;/a&gt; to replace the clunky old web interface that used to be there. I still prefer my newsreader, but now I finally have a nice, permanent place to link to D announcements and such from this blog.&lt;/p&gt;
&lt;p&gt;Vladimir used D to create the whole thing, making it a nice demonstration of D usage in the web sphere. As with many other open source D projects these days, there is &lt;a href="https://github.com/CyberShadow/DFeed" target="_blank"&gt;a repository over at GitHub&lt;/a&gt; for your hacking pleasure.&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TheOneWithD?a=DQ03J22qq7s:NHqveQxsGkw:yIl2AUoC8zA"&gt;&lt;img border="0" src="http://feeds.feedburner.com/~ff/TheOneWithD?d=yIl2AUoC8zA" /&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheOneWithD?a=DQ03J22qq7s:NHqveQxsGkw:F7zBnMyn0Lo"&gt;&lt;img border="0" src="http://feeds.feedburner.com/~ff/TheOneWithD?i=DQ03J22qq7s:NHqveQxsGkw:F7zBnMyn0Lo" /&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheOneWithD?a=DQ03J22qq7s:NHqveQxsGkw:cGdyc7Q-1BI"&gt;&lt;img border="0" src="http://feeds.feedburner.com/~ff/TheOneWithD?d=cGdyc7Q-1BI" /&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img height="1" src="http://feeds.feedburner.com/~r/TheOneWithD/~4/DQ03J22qq7s" width="1" /&gt;</content>
		<author>
			<name>Aldacron</name>
			<uri>http://dblog.aldacron.net</uri>
		</author>
		<source>
			<title type="html">The One With D</title>
			<subtitle type="html">News and Opinions Regarding the D Programming Language</subtitle>
			<link rel="self" href="http://feeds.feedburner.com/TheOneWithD" />
			<id>http://feeds.feedburner.com/TheOneWithD</id>
			<updated>2012-05-21T14:00:43+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Comments Temporarily Moderated</title>
		<link href="http://feedproxy.google.com/~r/TheOneWithD/~3/BLrOpXcVGWg/" />
		<id>http://dblog.aldacron.net/?p=1010</id>
		<updated>2012-02-09T12:58:22+00:00</updated>
		<content type="html">&lt;p&gt;Unfortunately, some spam comments have been getting past the filter and posted to some old posts. It&amp;#8217;s the first time it&amp;#8217;s happened on this blog since I&amp;#8217;ve been running it. But it&amp;#8217;s starting to annoy me. I&amp;#8217;ve deleted several today. So, until it dies down, I&amp;#8217;m turning on comment moderation. Don&amp;#8217;t let that stop you from commenting, though, if you have something to say!&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TheOneWithD?a=BLrOpXcVGWg:6IFHjEUkx1w:yIl2AUoC8zA"&gt;&lt;img border="0" src="http://feeds.feedburner.com/~ff/TheOneWithD?d=yIl2AUoC8zA" /&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheOneWithD?a=BLrOpXcVGWg:6IFHjEUkx1w:F7zBnMyn0Lo"&gt;&lt;img border="0" src="http://feeds.feedburner.com/~ff/TheOneWithD?i=BLrOpXcVGWg:6IFHjEUkx1w:F7zBnMyn0Lo" /&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheOneWithD?a=BLrOpXcVGWg:6IFHjEUkx1w:cGdyc7Q-1BI"&gt;&lt;img border="0" src="http://feeds.feedburner.com/~ff/TheOneWithD?d=cGdyc7Q-1BI" /&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img height="1" src="http://feeds.feedburner.com/~r/TheOneWithD/~4/BLrOpXcVGWg" width="1" /&gt;</content>
		<author>
			<name>Aldacron</name>
			<uri>http://dblog.aldacron.net</uri>
		</author>
		<source>
			<title type="html">The One With D</title>
			<subtitle type="html">News and Opinions Regarding the D Programming Language</subtitle>
			<link rel="self" href="http://feeds.feedburner.com/TheOneWithD" />
			<id>http://feeds.feedburner.com/TheOneWithD</id>
			<updated>2012-05-21T14:00:43+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Getting Started With D</title>
		<link href="http://feedproxy.google.com/~r/TheOneWithD/~3/M4pHCQOOI0A/" />
		<id>http://dblog.aldacron.net/?p=1007</id>
		<updated>2012-02-09T05:36:30+00:00</updated>
		<content type="html">&lt;p&gt;There&amp;#8217;s &lt;a href="https://docs.google.com/viewer?a=v&amp;pid=explorer&amp;chrome=true&amp;srcid=0B5foKDsk1cd-ZTgxMTA0NDgtNjUyZS00MTRlLWI5MWUtN2ZlOWIyNWYzNGEz&amp;hl&amp;pli=1"&gt;a nifty little guide online&lt;/a&gt; now that explains how to get set up with the D Programming Language and (ahem) Vim on Windows. It looks to be a great intro for those coming to D for the first time. One of these days, I&amp;#8217;ll have to take the time to try (again) to get comfortable with Vim.&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TheOneWithD?a=M4pHCQOOI0A:WLQp5oxiqbA:yIl2AUoC8zA"&gt;&lt;img border="0" src="http://feeds.feedburner.com/~ff/TheOneWithD?d=yIl2AUoC8zA" /&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheOneWithD?a=M4pHCQOOI0A:WLQp5oxiqbA:F7zBnMyn0Lo"&gt;&lt;img border="0" src="http://feeds.feedburner.com/~ff/TheOneWithD?i=M4pHCQOOI0A:WLQp5oxiqbA:F7zBnMyn0Lo" /&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheOneWithD?a=M4pHCQOOI0A:WLQp5oxiqbA:cGdyc7Q-1BI"&gt;&lt;img border="0" src="http://feeds.feedburner.com/~ff/TheOneWithD?d=cGdyc7Q-1BI" /&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img height="1" src="http://feeds.feedburner.com/~r/TheOneWithD/~4/M4pHCQOOI0A" width="1" /&gt;</content>
		<author>
			<name>Aldacron</name>
			<uri>http://dblog.aldacron.net</uri>
		</author>
		<source>
			<title type="html">The One With D</title>
			<subtitle type="html">News and Opinions Regarding the D Programming Language</subtitle>
			<link rel="self" href="http://feeds.feedburner.com/TheOneWithD" />
			<id>http://feeds.feedburner.com/TheOneWithD</id>
			<updated>2012-05-21T14:00:43+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">The hashtable closure pattern</title>
		<link href="http://www.deadalnix.me/2012/02/02/the-hashtable-closure-pattern/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=the-hashtable-closure-pattern" />
		<id>http://www.deadalnix.42/?p=81</id>
		<updated>2012-02-02T15:45:05+00:00</updated>
		<content type="html">&lt;p&gt;I noticed that I was using a pattern of my own more and more. It is actually very usefull, for several reasons. It may have been used by other before me, but never saw a name for it.&lt;/p&gt;
&lt;p&gt;This pattern is useful when you have to apply an operation dependent on parameters several times. for example when you want to apply a calculation on all elements of an array, the calculation depending on some parameters. This article will explain you that pattern and demonstrate how it can be used in Javascript, PHP and D.&lt;/p&gt;
&lt;p&gt;This pattern can be used in any language that support first class function and hashtable, that is becoming more and more common (closure support was added in PHP as of version 5.3).&lt;/p&gt;
&lt;p&gt;&lt;span id="more-81"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h1&gt;An explanation of the pattern and when it can be used&lt;/h1&gt;
&lt;p&gt;As an example is often more clear than a lot of theoretical chit chat, let&amp;#8217;s talk about a concrete case. You want to create a function that present a set of data in different format (pie chart, histograms, etc . . .). We will use Javascript in the first place.&lt;/p&gt;
&lt;div class="codecolorer-container javascript railscasts"&gt;&lt;table cellpadding="0" cellspacing="0"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;div&gt;1&lt;br /&gt;2&lt;br /&gt;3&lt;br /&gt;4&lt;br /&gt;5&lt;br /&gt;6&lt;br /&gt;7&lt;br /&gt;8&lt;br /&gt;9&lt;br /&gt;10&lt;br /&gt;11&lt;br /&gt;12&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;div class="javascript codecolorer"&gt;&lt;span&gt;function&lt;/span&gt; create_chart&lt;span&gt;&amp;#40;&lt;/span&gt;type&lt;span&gt;,&lt;/span&gt; datas&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;for&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;var&lt;/span&gt; i &lt;span&gt;=&lt;/span&gt; &lt;span&gt;0&lt;/span&gt;&lt;span&gt;;&lt;/span&gt; i &lt;span&gt;&amp;lt;&lt;/span&gt; datas.&lt;span&gt;length&lt;/span&gt;&lt;span&gt;;&lt;/span&gt; i&lt;span&gt;++&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;switch&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;type&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;case&lt;/span&gt; &lt;span&gt;'pie'&lt;/span&gt; &lt;span&gt;:&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;// Draw the data in a way.&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;break&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;case&lt;/span&gt; &lt;span&gt;'histogram'&lt;/span&gt; &lt;span&gt;:&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;// Draw data another way.&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;break&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;&amp;#125;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;&amp;#125;&lt;/span&gt;&lt;br /&gt;
&lt;span&gt;&amp;#125;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;
&lt;p&gt;Ok the point was not to show how we can draw a chart, but show what is the structure of the code. This code have a problem : the switch is performed for every data in the chart. This is obvious that the result of the switch is always the same and that it doesn&amp;#8217;t belong into the loop. You don&amp;#8217;t want calculation to be made for nothing. So let&amp;#8217;s put that test outside the loop :&lt;/p&gt;
&lt;div class="codecolorer-container javascript railscasts"&gt;&lt;table cellpadding="0" cellspacing="0"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;div&gt;1&lt;br /&gt;2&lt;br /&gt;3&lt;br /&gt;4&lt;br /&gt;5&lt;br /&gt;6&lt;br /&gt;7&lt;br /&gt;8&lt;br /&gt;9&lt;br /&gt;10&lt;br /&gt;11&lt;br /&gt;12&lt;br /&gt;13&lt;br /&gt;14&lt;br /&gt;15&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;div class="javascript codecolorer"&gt;&lt;span&gt;function&lt;/span&gt; create_chart&lt;span&gt;&amp;#40;&lt;/span&gt;type&lt;span&gt;,&lt;/span&gt; datas&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;switch&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;type&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;case&lt;/span&gt; &lt;span&gt;'pie'&lt;/span&gt; &lt;span&gt;:&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;for&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;var&lt;/span&gt; i &lt;span&gt;=&lt;/span&gt; &lt;span&gt;0&lt;/span&gt;&lt;span&gt;;&lt;/span&gt; i &lt;span&gt;&amp;lt;&lt;/span&gt; datas.&lt;span&gt;length&lt;/span&gt;&lt;span&gt;;&lt;/span&gt; i&lt;span&gt;++&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span&gt;// Draw the data in a way.&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;&amp;#125;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;break&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;case&lt;/span&gt; &lt;span&gt;'histogram'&lt;/span&gt; &lt;span&gt;:&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;for&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;var&lt;/span&gt; i &lt;span&gt;=&lt;/span&gt; &lt;span&gt;0&lt;/span&gt;&lt;span&gt;;&lt;/span&gt; i &lt;span&gt;&amp;lt;&lt;/span&gt; datas.&lt;span&gt;length&lt;/span&gt;&lt;span&gt;;&lt;/span&gt; i&lt;span&gt;++&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span&gt;// Draw data another way.&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;&amp;#125;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;break&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;&amp;#125;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;&amp;#125;&lt;/span&gt;&lt;br /&gt;
&lt;span&gt;&amp;#125;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;
&lt;p&gt;Now the computer isn&amp;#8217;t repeating itself, but YOU are. And it is even worse. After all, the computer is done to do some work for you, not the other way around. Additionally, duplicating code is known as a bad practice. This is called the DRY principle : Don&amp;#8217;t Repeat Yourself. Experience have showed us that duplicated code is harder to maintain, and is more bug prone. If you find a bug in the duplicated code, it have to be fixed at several place. You&amp;#8217;ll sometime forget to correct it in one of the places. Eventually, the 2 duplication will evolve in 2 different implementation that require both to be maintained.&lt;/p&gt;
&lt;p&gt;Here comes another good principle in programming : separation of concerns. Here we don&amp;#8217;t want to care how to we traverse all our datastructure to apply our code on each data. Let&amp;#8217;s delegate that work to another piece of code. This has 2 advantages : you avoid duplication of the loop, and by improving that traversal function, you&amp;#8217;ll improve your whole codebase. You can improve it to make it faster, or to support new datastructures, or whatever your software will need in the future.&lt;/p&gt;
&lt;p&gt;I&amp;#8217;ll use the &lt;a href="http://api.jquery.com/jQuery.each/" target="_blank"&gt;$.each function of jQuery&lt;/a&gt; here.&lt;/p&gt;
&lt;div class="codecolorer-container javascript railscasts"&gt;&lt;table cellpadding="0" cellspacing="0"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;div&gt;1&lt;br /&gt;2&lt;br /&gt;3&lt;br /&gt;4&lt;br /&gt;5&lt;br /&gt;6&lt;br /&gt;7&lt;br /&gt;8&lt;br /&gt;9&lt;br /&gt;10&lt;br /&gt;11&lt;br /&gt;12&lt;br /&gt;13&lt;br /&gt;14&lt;br /&gt;15&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;div class="javascript codecolorer"&gt;&lt;span&gt;function&lt;/span&gt; create_chart&lt;span&gt;&amp;#40;&lt;/span&gt;type&lt;span&gt;,&lt;/span&gt; datas&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;switch&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;type&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;case&lt;/span&gt; &lt;span&gt;'pie'&lt;/span&gt; &lt;span&gt;:&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $.&lt;span&gt;each&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;datas&lt;span&gt;,&lt;/span&gt; &lt;span&gt;function&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;i&lt;span&gt;,&lt;/span&gt; data&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span&gt;// Draw the data in a way.&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;&amp;#125;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;break&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;case&lt;/span&gt; &lt;span&gt;'histogram'&lt;/span&gt; &lt;span&gt;:&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $.&lt;span&gt;each&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;datas&lt;span&gt;,&lt;/span&gt; &lt;span&gt;function&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;i&lt;span&gt;,&lt;/span&gt; data&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span&gt;// Draw data another way.&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;&amp;#125;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;break&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;&amp;#125;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;&amp;#125;&lt;/span&gt;&lt;br /&gt;
&lt;span&gt;&amp;#125;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;
&lt;p&gt;Maybe this doesn&amp;#8217;t look like a win to you, but it is, I can assure you. Now you have clearly separated the fact of traversing you datastructure and the action you&amp;#8217;ll apply on it. But still we have some repetition, we have 2 identical calls to $.each . I&amp;#8217;d say that is better but still not perfect.&lt;/p&gt;
&lt;p&gt;Here, the whole point of our code is reduced to associate a closure with a keyword (pie or histogram) and pass this closure to $.each . To create this association, we will use an hashtable, and « TADAA ! » the Hashtable &amp;#8211; closure pattern is born.&lt;/p&gt;
&lt;p&gt;In javascript, every object is an hashtable, so let&amp;#8217;s write some code :&lt;/p&gt;
&lt;div class="codecolorer-container javascript railscasts"&gt;&lt;table cellpadding="0" cellspacing="0"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;div&gt;1&lt;br /&gt;2&lt;br /&gt;3&lt;br /&gt;4&lt;br /&gt;5&lt;br /&gt;6&lt;br /&gt;7&lt;br /&gt;8&lt;br /&gt;9&lt;br /&gt;10&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;div class="javascript codecolorer"&gt;&lt;span&gt;function&lt;/span&gt; create_chart&lt;span&gt;&amp;#40;&lt;/span&gt;type&lt;span&gt;,&lt;/span&gt; datas&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; $.&lt;span&gt;each&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;datas&lt;span&gt;,&lt;/span&gt; &lt;span&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; pie &lt;span&gt;:&lt;/span&gt; &lt;span&gt;function&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;i&lt;span&gt;,&lt;/span&gt; data&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;// Draw the data in a way.&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;&amp;#125;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; histogram &lt;span&gt;:&lt;/span&gt; &lt;span&gt;function&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;i&lt;span&gt;,&lt;/span&gt; data&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;// Draw data another way.&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;&amp;#125;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;&amp;#125;&lt;/span&gt;&lt;span&gt;&amp;#91;&lt;/span&gt;type&lt;span&gt;&amp;#93;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span&gt;&amp;#125;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;
&lt;h1&gt;Implementation in PHP and D&lt;/h1&gt;
&lt;p&gt;You know everything, let&amp;#8217;s go directly to code :&lt;/p&gt;
&lt;div class="codecolorer-container php railscasts"&gt;&lt;table cellpadding="0" cellspacing="0"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;div&gt;1&lt;br /&gt;2&lt;br /&gt;3&lt;br /&gt;4&lt;br /&gt;5&lt;br /&gt;6&lt;br /&gt;7&lt;br /&gt;8&lt;br /&gt;9&lt;br /&gt;10&lt;br /&gt;11&lt;br /&gt;12&lt;br /&gt;13&lt;br /&gt;14&lt;br /&gt;15&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;div class="php codecolorer"&gt;&lt;span&gt;function&lt;/span&gt; create_chart&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;$type&lt;/span&gt;&lt;span&gt;,&lt;/span&gt; &lt;span&gt;$datas&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;$closures&lt;/span&gt; &lt;span&gt;=&lt;/span&gt; &lt;a href="http://www.php.net/array"&gt;&lt;span&gt;array&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;'pie'&lt;/span&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;=&amp;gt;&lt;/span&gt; &lt;span&gt;function&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;$i&lt;/span&gt;&lt;span&gt;,&lt;/span&gt; &lt;span&gt;$data&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;// Do stuff . . .&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;&amp;#125;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;'histogram'&lt;/span&gt; &lt;span&gt;=&amp;gt;&lt;/span&gt; &lt;span&gt;function&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;$i&lt;/span&gt;&lt;span&gt;,&lt;/span&gt; &lt;span&gt;$data&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;// Do other stuff . . .&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;&amp;#125;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;$closure&lt;/span&gt; &lt;span&gt;=&lt;/span&gt; &lt;span&gt;$closures&lt;/span&gt;&lt;span&gt;&amp;#91;&lt;/span&gt;&lt;span&gt;$type&lt;/span&gt;&lt;span&gt;&amp;#93;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;foreach&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;$datas&lt;/span&gt; &lt;span&gt;as&lt;/span&gt; &lt;span&gt;$i&lt;/span&gt; &lt;span&gt;=&amp;gt;&lt;/span&gt; &lt;span&gt;$data&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;$closure&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;$i&lt;/span&gt;&lt;span&gt;,&lt;/span&gt; &lt;span&gt;$data&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;&amp;#125;&lt;/span&gt;&lt;br /&gt;
&lt;span&gt;&amp;#125;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;
&lt;div class="codecolorer-container d railscasts"&gt;&lt;table cellpadding="0" cellspacing="0"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;div&gt;1&lt;br /&gt;2&lt;br /&gt;3&lt;br /&gt;4&lt;br /&gt;5&lt;br /&gt;6&lt;br /&gt;7&lt;br /&gt;8&lt;br /&gt;9&lt;br /&gt;10&lt;br /&gt;11&lt;br /&gt;12&lt;br /&gt;13&lt;br /&gt;14&lt;br /&gt;15&lt;br /&gt;16&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;div class="d codecolorer"&gt;&lt;span&gt;void&lt;/span&gt; create_chart&lt;span&gt;&amp;#40;&lt;/span&gt;R&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;string type&lt;span&gt;,&lt;/span&gt; R datas&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;if&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;isInputRange&lt;span&gt;!&lt;/span&gt;R&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;alias&lt;/span&gt; &lt;span&gt;typeof&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;datas.&lt;span&gt;front&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt; T&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;auto&lt;/span&gt; closure &lt;span&gt;=&lt;/span&gt; &lt;span&gt;&amp;#91;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;&amp;quot;pie&amp;quot;&lt;/span&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;:&lt;/span&gt; &lt;span&gt;function&lt;/span&gt; &lt;span&gt;void&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;size_t&lt;/span&gt; i&lt;span&gt;,&lt;/span&gt; T data&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;// Do stuff . . .&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;&amp;#125;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;&amp;quot;histogram&amp;quot;&lt;/span&gt; &lt;span&gt;:&lt;/span&gt; &lt;span&gt;function&lt;/span&gt; &lt;span&gt;void&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;size_t&lt;/span&gt; i&lt;span&gt;,&lt;/span&gt; T data&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;// Do other stuff . . .&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;&amp;#125;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;&amp;#93;&lt;/span&gt;&lt;span&gt;&amp;#91;&lt;/span&gt;type&lt;span&gt;&amp;#93;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;size_t&lt;/span&gt; i &lt;span&gt;=&lt;/span&gt; &lt;span&gt;0&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;foreach&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;data&lt;span&gt;;&lt;/span&gt; datas&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; closure&lt;span&gt;&amp;#40;&lt;/span&gt;i&lt;span&gt;++,&lt;/span&gt; data&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;&amp;#125;&lt;/span&gt;&lt;br /&gt;
&lt;span&gt;&amp;#125;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;
&lt;p&gt;Both in PHP and D, foreach is a very extensible feature of the language. It will allow us to travers almost any datastructure.&lt;/p&gt;
&lt;h1&gt;Building on that pattern&lt;/h1&gt;
&lt;p&gt;In all our example, we use a string as a key for our hashtable. This is nice, but we can use actually anything. For performance reasons, an int is preferred. With an int, you can simply use an array (which is a special hashtable with identity as an hash function).&lt;/p&gt;
&lt;p&gt;This pattern has another advantage, is make your code very extensible. In all presented examples, the hashtable is predefined. But you can perfectly store the hashtable outside the function and provide a way for third party code to add closure in it. Now you have a very nice design with a core library that can accept plugins to extends its functionality easily.&lt;/p&gt;</content>
		<author>
			<name>deadalnix</name>
			<uri>http://www.deadalnix.me</uri>
		</author>
		<source>
			<title type="html">Deadalnix's den » D programming</title>
			<subtitle type="html">Just another WordPress site</subtitle>
			<link rel="self" href="http://www.deadalnix.me/category/software-and-devellopement/d-programming/feed/" />
			<id>http://www.deadalnix.me/category/software-and-devellopement/d-programming/feed/</id>
			<updated>2012-04-06T19:00:13+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Derelict on GitHub</title>
		<link href="http://feedproxy.google.com/~r/TheOneWithD/~3/2ntUveTRKCk/" />
		<id>http://dblog.aldacron.net/?p=1003</id>
		<updated>2012-02-01T11:38:57+00:00</updated>
		<content type="html">&lt;p&gt;I&amp;#8217;ve finally got Derelict &lt;a href="https://github.com/aldacron/Derelict3" target="_blank"&gt;all set up on GitHub&lt;/a&gt;. But if you haven&amp;#8217;t kept up with the Derelict forum, you may be surprised at the Derelict3 label. The short version is that my decision to move to GitHub coupled with the recent announcement by Andrei that D1 would be phased out this year led me to believe this was a good time to overhaul the code base. Read more about that &lt;a href="http://www.dsource.org/forums/viewtopic.php?t=6214" target="_blank"&gt;in my forum post&lt;/a&gt; on the topic.&lt;/p&gt;
&lt;p&gt;You can consider it in an alpha state. Currently, there are three packages: DerelictUtil, DerelictGL3 and DerelictGLFW3. The readme in the repository explains most of what you need to know to get started. Two things to note. First, if you aren&amp;#8217;t using modern OpenGL, stick with Derelict2. Second, if you are using D1, stick with Derelict2. Otherwise, consider this an opportunity to easily get up and running with Modern OpenGL in D.&lt;/p&gt;
&lt;p&gt;If you do want to dive in, you&amp;#8217;ll likely want to get your hands on GLFW 3 if you haven&amp;#8217;t got a framework already. I do intend to add bindings for SDL 2, but for now GLFW 3 is it.  You&amp;#8217;ll have to check out the source from &lt;a href="http://sourceforge.net/scm/?type=git&amp;group_id=72569" target="_blank"&gt;the Sourceforge git repository&lt;/a&gt; (the Subversion repository is the 2.7 branch &amp;#8212; not what you want). You&amp;#8217;ll then need &lt;a href="http://www.google.com/url?sa=t&amp;rct=j&amp;q=&amp;esrc=s&amp;source=web&amp;cd=1&amp;ved=0CDUQFjAA&amp;url=http%3A%2F%2Fwww.cmake.org%2F&amp;ei=dSMpT_DjLueViAeW353WAg&amp;usg=AFQjCNEmd4p8aUoUmYlZxJdYtwYJnn1-cw" target="_blank"&gt;CMake&lt;/a&gt; to build.&lt;/p&gt;
&lt;p&gt;As I explain in the readme, non-Windows and/or non-DMD users will need to modify the Derelict build script to actually build Derelict3. It is currently set up only for Windows and is not in a final, configurable form yet. I just hacked it together, though I did put just a little bit of structure in it with an eye to the future. It shouldn&amp;#8217;t take too much effort to get it going.&lt;/p&gt;
&lt;p&gt;Enjoy!&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TheOneWithD?a=2ntUveTRKCk:ELuTetiic3U:yIl2AUoC8zA"&gt;&lt;img border="0" src="http://feeds.feedburner.com/~ff/TheOneWithD?d=yIl2AUoC8zA" /&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheOneWithD?a=2ntUveTRKCk:ELuTetiic3U:F7zBnMyn0Lo"&gt;&lt;img border="0" src="http://feeds.feedburner.com/~ff/TheOneWithD?i=2ntUveTRKCk:ELuTetiic3U:F7zBnMyn0Lo" /&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheOneWithD?a=2ntUveTRKCk:ELuTetiic3U:cGdyc7Q-1BI"&gt;&lt;img border="0" src="http://feeds.feedburner.com/~ff/TheOneWithD?d=cGdyc7Q-1BI" /&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img height="1" src="http://feeds.feedburner.com/~r/TheOneWithD/~4/2ntUveTRKCk" width="1" /&gt;</content>
		<author>
			<name>Aldacron</name>
			<uri>http://dblog.aldacron.net</uri>
		</author>
		<source>
			<title type="html">The One With D</title>
			<subtitle type="html">News and Opinions Regarding the D Programming Language</subtitle>
			<link rel="self" href="http://feeds.feedburner.com/TheOneWithD" />
			<id>http://feeds.feedburner.com/TheOneWithD</id>
			<updated>2012-05-21T14:00:43+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Tango For D2</title>
		<link href="http://feedproxy.google.com/~r/TheOneWithD/~3/kLKiuHmQPGM/" />
		<id>http://dblog.aldacron.net/?p=998</id>
		<updated>2012-02-01T09:52:25+00:00</updated>
		<content type="html">&lt;p&gt;There has been an ongoing effort to port &lt;a href="http://www.dsource.org/projects/tango" target="_blank"&gt;Tango&lt;/a&gt; to D2 for some time now. I remember hearing the first whispers of such a project a couple of years ago. Well, it&amp;#8217;s definitely more than whispers now.&lt;/p&gt;
&lt;p&gt;I don&amp;#8217;t know the history behind this particular branch, but SiegeLord has finished &lt;a href="https://github.com/SiegeLord/Tango-D2" target="_blank"&gt;an initial port of Tango&lt;/a&gt; to D2. &lt;a href="http://dfeed.kimsufi.thecybershadow.net/discussion/thread/jgagrl$1ta5$1@digitalmars.com#post-jgagrl:241ta5:241:40digitalmars.com" target="_blank"&gt;The announcement&lt;/a&gt; says it works fine alongside Phobos, a serious validation of one of the reasons behind D2&amp;#8242;s adoption of DRuntime. This means that, as long as they use D2, library developers can make use of either Phobos or Tango without care. And app developers can use any library that suits their app, regardless of whether it&amp;#8217;s using Phobos or Tango under the hood. Awesome stuff.&lt;/p&gt;
&lt;p&gt;To be sure, the old religious Phobos/Tango divide has not been a problem for quite some time, as it&amp;#8217;s been pretty much settled that you use Tango with D1 and Phobos with D2. Well, for those in the know at least. There are a lot of unenlightened people out there who go on hearsay. Now, with D2, you can get the best of both worlds. Use whichever suits your style, or both at once, and no guilty feelings. Hopefully, this will put the old infamous legend to rest once and for all.&lt;/p&gt;
&lt;p&gt;I&amp;#8217;ve rarely looked at Tango since moving to D2 some time ago, except for an occasional compile to make sure Derelict still builds with it. From a practical point of view, I think it&amp;#8217;s useful to make use of both libraries. So now that we have the ability to do so, I&amp;#8217;m more excited than I expected to be. There are certain features one has that the other lacks, or that are more complete in one than the other. There I can see great benefit. It all depends on how well they play together. From what I&amp;#8217;ve heard so far, they seem to get along swimmingly.&lt;/p&gt;
&lt;p&gt;Of course, I&amp;#8217;ll have to investigate this more to see if it really is as useful for me as it appears on the surface. In the meantime, thanks for the effort, SiegeLord, Jacob Calrborg, Igor Stepanov, and whomever else contributed!&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TheOneWithD?a=kLKiuHmQPGM:JQLX7gRgixM:yIl2AUoC8zA"&gt;&lt;img border="0" src="http://feeds.feedburner.com/~ff/TheOneWithD?d=yIl2AUoC8zA" /&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheOneWithD?a=kLKiuHmQPGM:JQLX7gRgixM:F7zBnMyn0Lo"&gt;&lt;img border="0" src="http://feeds.feedburner.com/~ff/TheOneWithD?i=kLKiuHmQPGM:JQLX7gRgixM:F7zBnMyn0Lo" /&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheOneWithD?a=kLKiuHmQPGM:JQLX7gRgixM:cGdyc7Q-1BI"&gt;&lt;img border="0" src="http://feeds.feedburner.com/~ff/TheOneWithD?d=cGdyc7Q-1BI" /&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img height="1" src="http://feeds.feedburner.com/~r/TheOneWithD/~4/kLKiuHmQPGM" width="1" /&gt;</content>
		<author>
			<name>Aldacron</name>
			<uri>http://dblog.aldacron.net</uri>
		</author>
		<source>
			<title type="html">The One With D</title>
			<subtitle type="html">News and Opinions Regarding the D Programming Language</subtitle>
			<link rel="self" href="http://feeds.feedburner.com/TheOneWithD" />
			<id>http://feeds.feedburner.com/TheOneWithD</id>
			<updated>2012-05-21T14:00:43+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">Binding D to C Part Two</title>
		<link href="http://www.gamedev.net/blog/1140/entry-2254108-binding-d-to-c-part-two/" />
		<id>http://www.gamedev.net/blog/1140/entry-2254108-binding-d-to-c-part-two/</id>
		<updated>2012-01-31T03:16:00+00:00</updated>
		<content type="html">This is part two of a series on creating bindings to C libraries for the D programming language.&lt;br /&gt;
&lt;br /&gt;
In &lt;a class="bbc_url" href="http://www.gamedev.net/blog/1140/entry-2254003-binding-d-to-c/" title=""&gt;part one&lt;/a&gt;, I discussed the difference between dynamic and static bindings and some of the considerations to take into account when deciding which way to go. Here in part two, I'm...</content>
		<author>
			<name>D Bits</name>
			<uri>http://www.gamedev.net/blog/1140-d-bits/</uri>
		</author>
		<source>
			<title type="html">D Bits</title>
			<subtitle type="html">D Bits Syndication</subtitle>
			<link rel="self" href="http://feeds.feedburner.com/DBits" />
			<id>http://feeds.feedburner.com/DBits</id>
			<updated>2012-05-19T12:00:21+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">A Tutorial on Templates</title>
		<link href="http://feedproxy.google.com/~r/TheOneWithD/~3/VLeEJa8swz4/" />
		<id>http://dblog.aldacron.net/?p=994</id>
		<updated>2012-01-31T03:12:38+00:00</updated>
		<content type="html">&lt;p&gt;Phillipe Sigaud has put together &lt;a href="https://docs.google.com/viewer?url=https://github.com/PhilippeSigaud/D-templates-tutorial/blob/master/dtemplates.pdf?raw%3Dtrue" target="_blank"&gt;a tutorial on D templates&lt;/a&gt;. Well worth the read if you haven&amp;#8217;t yet familiarized yourself with them. It&amp;#8217;s great to see this stuff popping up these days. It makes getting into advanced D features easier than ever.&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TheOneWithD?a=VLeEJa8swz4:cvYfKezaQLE:yIl2AUoC8zA"&gt;&lt;img border="0" src="http://feeds.feedburner.com/~ff/TheOneWithD?d=yIl2AUoC8zA" /&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheOneWithD?a=VLeEJa8swz4:cvYfKezaQLE:F7zBnMyn0Lo"&gt;&lt;img border="0" src="http://feeds.feedburner.com/~ff/TheOneWithD?i=VLeEJa8swz4:cvYfKezaQLE:F7zBnMyn0Lo" /&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheOneWithD?a=VLeEJa8swz4:cvYfKezaQLE:cGdyc7Q-1BI"&gt;&lt;img border="0" src="http://feeds.feedburner.com/~ff/TheOneWithD?d=cGdyc7Q-1BI" /&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img height="1" src="http://feeds.feedburner.com/~r/TheOneWithD/~4/VLeEJa8swz4" width="1" /&gt;</content>
		<author>
			<name>Aldacron</name>
			<uri>http://dblog.aldacron.net</uri>
		</author>
		<source>
			<title type="html">The One With D</title>
			<subtitle type="html">News and Opinions Regarding the D Programming Language</subtitle>
			<link rel="self" href="http://feeds.feedburner.com/TheOneWithD" />
			<id>http://feeds.feedburner.com/TheOneWithD</id>
			<updated>2012-05-21T14:00:43+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">&lt;code&gt;getaddrinfo&lt;/code&gt; cross-platform edge case behavior</title>
		<link href="http://klickverbot.at/blog/2012/01/getaddrinfo-edge-case-behavior-on-windows-linux-and-osx" />
		<id>http://klickverbot.at/blog/2012/01/getaddrinfo-edge-case-behavior-on-windows-linux-and-osx</id>
		<updated>2012-01-30T23:00:00+00:00</updated>
		<content type="html">&lt;p&gt;The POSIX and Windows &lt;code&gt;getaddrinfo&lt;/code&gt; function returns a list of IP addresses and port numbers for a given hostname and service (resp. port), superseding &lt;code&gt;gethostbyname&lt;/code&gt; and &lt;code&gt;getservbyname&lt;/code&gt;. Besides some flags, it accepts two string parameters. Either one of them is allowed to be &lt;code&gt;null&lt;/code&gt;, representing localhost (or rather 0.0.0.0, depending on &lt;code&gt;AI_PASSIVE&lt;/code&gt;) respectively an automatically assigned port. Both parameters being &lt;code&gt;null&lt;/code&gt; at the same time, however, is forbidden, and leads to a &lt;code&gt;EAI_NONAME&lt;/code&gt; error (&lt;code&gt;WSAHOST_NOT_FOUND&lt;/code&gt; on Windows). What happens if the strings are empty (&lt;code&gt;&amp;quot;\0&amp;quot;&lt;/code&gt;) instead of &lt;code&gt;null&lt;/code&gt;, however, is not covered by the spec and not really documented anywhere.&lt;/p&gt;

&lt;p&gt;It turns out that there are quite a few differences there between the various operating systems, which is obviously likely to cause issues for &lt;a href="http://winehq.org"&gt;Wine&lt;/a&gt; (an implementation of the Windows API on Posix/X systems). To get a clear understanding of how the different cases are handled, I put together a little &lt;a href="http://dlang.org"&gt;D&lt;/a&gt; program which tests a few combinations of host name, port, and flag parameters (see end of post). The snippet could be written in C just the same, as &lt;code&gt;getAddressInfo&lt;/code&gt; directly maps to &lt;code&gt;getaddrinfo&lt;/code&gt;, I just chose D to avoid platform dependencies and writing an unduly large amount of more boilerplate code.&lt;/p&gt;

&lt;p&gt;The results are summarized in the following table, where »loopback« means that the IP addresses returned were &lt;code&gt;127.0.0.1&lt;/code&gt; and &lt;code&gt;::1&lt;/code&gt;, »catchall« refers to &lt;code&gt;0.0.0.0&lt;/code&gt; and &lt;code&gt;::&lt;/code&gt;, »public« means that the actual IP addresses of all available network interfaces were returned, and &lt;code&gt;NONAME&lt;/code&gt; refers to a lookup error. »hostname« means that the actual fully qualified name of the host that ran the test was used (care: the host part of the FQDN only does usually &lt;em&gt;not&lt;/em&gt; resolve on OS X).&lt;/p&gt;

  &lt;table&gt;
    &lt;thead&gt;
      &lt;tr&gt;
        &lt;th&gt;Host&lt;/th&gt;
        &lt;th&gt;Port&lt;/th&gt;
        &lt;th&gt;Flags&lt;/th&gt;
        &lt;th&gt;Windows&lt;/th&gt;
        &lt;th&gt;Linux&lt;/th&gt;
        &lt;th&gt;OS X&lt;/th&gt;
      &lt;/tr&gt;
    &lt;/thead&gt;
    &lt;tbody&gt;
      &lt;tr class="odd"&gt;
        &lt;td&gt;&lt;code&gt;null&lt;/code&gt;&lt;/td&gt;
        &lt;td&gt;&lt;code&gt;null&lt;/code&gt;&lt;/td&gt;
        &lt;td&gt;-&lt;/td&gt;
        &lt;td&gt;&lt;code&gt;NONAME&lt;/code&gt;&lt;/td&gt;
        &lt;td&gt;&lt;code&gt;NONAME&lt;/code&gt;&lt;/td&gt;
        &lt;td&gt;&lt;code&gt;NONAME&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr class="odd"&gt;
        &lt;td colspan="2"&gt;&amp;nbsp;&lt;/td&gt;
        &lt;td&gt;&lt;code&gt;AI_PASSIVE&lt;/code&gt;&lt;/td&gt;
        &lt;td&gt;&lt;code&gt;NONAME&lt;/code&gt;&lt;/td&gt;
        &lt;td&gt;&lt;code&gt;NONAME&lt;/code&gt;&lt;/td&gt;
        &lt;td&gt;&lt;code&gt;NONAME&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;&amp;nbsp;&lt;/td&gt;
        &lt;td&gt;&lt;code&gt;""&lt;/code&gt;&lt;/td&gt;
        &lt;td&gt;-&lt;/td&gt;
        &lt;td&gt;loopback&lt;/td&gt;
        &lt;td&gt;loopback&lt;/td&gt;
        &lt;td&gt;&lt;code&gt;NONAME&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td colspan="2"&gt;&amp;nbsp;&lt;/td&gt;
        &lt;td&gt;&lt;code&gt;AI_PASSIVE&lt;/code&gt;&lt;/td&gt;
        &lt;td&gt;catchall&lt;/td&gt;
        &lt;td&gt;catchall&lt;/td&gt;
        &lt;td&gt;&lt;code&gt;NONAME&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr class="odd"&gt;
        &lt;td&gt;&amp;nbsp;&lt;/td&gt;
        &lt;td&gt;&lt;code&gt;"0"&lt;/code&gt;&lt;/td&gt;
        &lt;td&gt;-&lt;/td&gt;
        &lt;td&gt;loopback&lt;/td&gt;
        &lt;td&gt;loopback&lt;/td&gt;
        &lt;td&gt;loopback&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr class="odd"&gt;
        &lt;td colspan="2"&gt;&amp;nbsp;&lt;/td&gt;
        &lt;td&gt;&lt;code&gt;AI_PASSIVE&lt;/code&gt;&lt;/td&gt;
        &lt;td&gt;catchall&lt;/td&gt;
        &lt;td&gt;catchall&lt;/td&gt;
        &lt;td&gt;catchall&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;&amp;nbsp;&lt;/td&gt;
        &lt;td&gt;&lt;code&gt;"80"&lt;/code&gt;&lt;/td&gt;
        &lt;td&gt;-&lt;/td&gt;
        &lt;td&gt;loopback&lt;/td&gt;
        &lt;td&gt;loopback&lt;/td&gt;
        &lt;td&gt;loopback&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td colspan="2"&gt;&amp;nbsp;&lt;/td&gt;
        &lt;td&gt;&lt;code&gt;AI_PASSIVE&lt;/code&gt;&lt;/td&gt;
        &lt;td&gt;catchall&lt;/td&gt;
        &lt;td&gt;catchall&lt;/td&gt;
        &lt;td&gt;catchall&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr class="odd"&gt;
        &lt;td&gt;&lt;code&gt;""&lt;/code&gt;&lt;/td&gt;
        &lt;td&gt;&lt;code&gt;null&lt;/code&gt;&lt;/td&gt;
        &lt;td&gt;-&lt;/td&gt;
        &lt;td&gt;public&lt;/td&gt;
        &lt;td&gt;&lt;code&gt;NONAME&lt;/code&gt;&lt;/td&gt;
        &lt;td&gt;&lt;code&gt;NONAME&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr class="odd"&gt;
        &lt;td colspan="2"&gt;&amp;nbsp;&lt;/td&gt;
        &lt;td&gt;&lt;code&gt;AI_PASSIVE&lt;/code&gt;&lt;/td&gt;
        &lt;td&gt;public&lt;/td&gt;
        &lt;td&gt;&lt;code&gt;NONAME&lt;/code&gt;&lt;/td&gt;
        &lt;td&gt;&lt;code&gt;NONAME&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;&amp;nbsp;&lt;/td&gt;
        &lt;td&gt;&lt;code&gt;""&lt;/code&gt;&lt;/td&gt;
        &lt;td&gt;-&lt;/td&gt;
        &lt;td&gt;public&lt;/td&gt;
        &lt;td&gt;&lt;code&gt;NONAME&lt;/code&gt;&lt;/td&gt;
        &lt;td&gt;&lt;code&gt;NONAME&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td colspan="2"&gt;&amp;nbsp;&lt;/td&gt;
        &lt;td&gt;&lt;code&gt;AI_PASSIVE&lt;/code&gt;&lt;/td&gt;
        &lt;td&gt;public&lt;/td&gt;
        &lt;td&gt;&lt;code&gt;NONAME&lt;/code&gt;&lt;/td&gt;
        &lt;td&gt;&lt;code&gt;NONAME&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr class="odd"&gt;
        &lt;td&gt;&amp;nbsp;&lt;/td&gt;
        &lt;td&gt;&lt;code&gt;"0"&lt;/code&gt;&lt;/td&gt;
        &lt;td&gt;-&lt;/td&gt;
        &lt;td&gt;public&lt;/td&gt;
        &lt;td&gt;&lt;code&gt;NONAME&lt;/code&gt;&lt;/td&gt;
        &lt;td&gt;loopback&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr class="odd"&gt;
        &lt;td colspan="2"&gt;&amp;nbsp;&lt;/td&gt;
        &lt;td&gt;&lt;code&gt;AI_PASSIVE&lt;/code&gt;&lt;/td&gt;
        &lt;td&gt;public&lt;/td&gt;
        &lt;td&gt;&lt;code&gt;NONAME&lt;/code&gt;&lt;/td&gt;
        &lt;td&gt;catchall&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;&amp;nbsp;&lt;/td&gt;
        &lt;td&gt;&lt;code&gt;"80"&lt;/code&gt;&lt;/td&gt;
        &lt;td&gt;-&lt;/td&gt;
        &lt;td&gt;public&lt;/td&gt;
        &lt;td&gt;&lt;code&gt;NONAME&lt;/code&gt;&lt;/td&gt;
        &lt;td&gt;loopback&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td colspan="2"&gt;&amp;nbsp;&lt;/td&gt;
        &lt;td&gt;&lt;code&gt;AI_PASSIVE&lt;/code&gt;&lt;/td&gt;
        &lt;td&gt;public&lt;/td&gt;
        &lt;td&gt;&lt;code&gt;NONAME&lt;/code&gt;&lt;/td&gt;
        &lt;td&gt;catchall&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr class="odd"&gt;
        &lt;td&gt;&lt;code&gt;"localhost"&lt;/code&gt;&lt;/td&gt;
        &lt;td&gt;&lt;code&gt;null&lt;/code&gt;&lt;/td&gt;
        &lt;td&gt;-&lt;/td&gt;
        &lt;td&gt;loopback&lt;/td&gt;
        &lt;td&gt;loopback (v4)&lt;/td&gt;
        &lt;td&gt;loopback&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr class="odd"&gt;
        &lt;td colspan="2"&gt;&amp;nbsp;&lt;/td&gt;
        &lt;td&gt;&lt;code&gt;AI_PASSIVE&lt;/code&gt;&lt;/td&gt;
        &lt;td&gt;loopback&lt;/td&gt;
        &lt;td&gt;loopback (v4)&lt;/td&gt;
        &lt;td&gt;loopback&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;&amp;nbsp;&lt;/td&gt;
        &lt;td&gt;&lt;code&gt;""&lt;/code&gt;&lt;/td&gt;
        &lt;td&gt;-&lt;/td&gt;
        &lt;td&gt;loopback&lt;/td&gt;
        &lt;td&gt;loopback (v4)&lt;/td&gt;
        &lt;td&gt;loopback&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td colspan="2"&gt;&amp;nbsp;&lt;/td&gt;
        &lt;td&gt;&lt;code&gt;AI_PASSIVE&lt;/code&gt;&lt;/td&gt;
        &lt;td&gt;loopback&lt;/td&gt;
        &lt;td&gt;loopback (v4)&lt;/td&gt;
        &lt;td&gt;loopback&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr class="odd"&gt;
        &lt;td&gt;&amp;nbsp;&lt;/td&gt;
        &lt;td&gt;&lt;code&gt;"0"&lt;/code&gt;&lt;/td&gt;
        &lt;td&gt;-&lt;/td&gt;
        &lt;td&gt;loopback&lt;/td&gt;
        &lt;td&gt;loopback (v4)&lt;/td&gt;
        &lt;td&gt;loopback&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr class="odd"&gt;
        &lt;td colspan="2"&gt;&amp;nbsp;&lt;/td&gt;
        &lt;td&gt;&lt;code&gt;AI_PASSIVE&lt;/code&gt;&lt;/td&gt;
        &lt;td&gt;loopback&lt;/td&gt;
        &lt;td&gt;loopback (v4)&lt;/td&gt;
        &lt;td&gt;loopback&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;&amp;nbsp;&lt;/td&gt;
        &lt;td&gt;&lt;code&gt;"80"&lt;/code&gt;&lt;/td&gt;
        &lt;td&gt;-&lt;/td&gt;
        &lt;td&gt;loopback&lt;/td&gt;
        &lt;td&gt;loopback (v4)&lt;/td&gt;
        &lt;td&gt;loopback&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td colspan="2"&gt;&amp;nbsp;&lt;/td&gt;
        &lt;td&gt;&lt;code&gt;AI_PASSIVE&lt;/code&gt;&lt;/td&gt;
        &lt;td&gt;loopback&lt;/td&gt;
        &lt;td&gt;loopback (v4)&lt;/td&gt;
        &lt;td&gt;loopback&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr class="odd"&gt;
        &lt;td&gt;hostname&lt;/td&gt;
        &lt;td&gt;&lt;code&gt;null&lt;/code&gt;&lt;/td&gt;
        &lt;td&gt;-&lt;/td&gt;
        &lt;td&gt;public&lt;/td&gt;
        &lt;td&gt;loopback (v4)&lt;/td&gt;
        &lt;td&gt;public&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr class="odd"&gt;
        &lt;td colspan="2"&gt;&amp;nbsp;&lt;/td&gt;
        &lt;td&gt;&lt;code&gt;AI_PASSIVE&lt;/code&gt;&lt;/td&gt;
        &lt;td&gt;public&lt;/td&gt;
        &lt;td&gt;loopback (v4)&lt;/td&gt;
        &lt;td&gt;public&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;&amp;nbsp;&lt;/td&gt;
        &lt;td&gt;&lt;code&gt;""&lt;/code&gt;&lt;/td&gt;
        &lt;td&gt;-&lt;/td&gt;
        &lt;td&gt;public&lt;/td&gt;
        &lt;td&gt;loopback (v4)&lt;/td&gt;
        &lt;td&gt;public&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td colspan="2"&gt;&amp;nbsp;&lt;/td&gt;
        &lt;td&gt;&lt;code&gt;AI_PASSIVE&lt;/code&gt;&lt;/td&gt;
        &lt;td&gt;public&lt;/td&gt;
        &lt;td&gt;loopback (v4)&lt;/td&gt;
        &lt;td&gt;public&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr class="odd"&gt;
        &lt;td&gt;&amp;nbsp;&lt;/td&gt;
        &lt;td&gt;&lt;code&gt;"0"&lt;/code&gt;&lt;/td&gt;
        &lt;td&gt;-&lt;/td&gt;
        &lt;td&gt;public&lt;/td&gt;
        &lt;td&gt;loopback (v4)&lt;/td&gt;
        &lt;td&gt;public&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr class="odd"&gt;
        &lt;td colspan="2"&gt;&amp;nbsp;&lt;/td&gt;
        &lt;td&gt;&lt;code&gt;AI_PASSIVE&lt;/code&gt;&lt;/td&gt;
        &lt;td&gt;public&lt;/td&gt;
        &lt;td&gt;loopback (v4)&lt;/td&gt;
        &lt;td&gt;public&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;&amp;nbsp;&lt;/td&gt;
        &lt;td&gt;&lt;code&gt;"80"&lt;/code&gt;&lt;/td&gt;
        &lt;td&gt;-&lt;/td&gt;
        &lt;td&gt;public&lt;/td&gt;
        &lt;td&gt;loopback (v4)&lt;/td&gt;
        &lt;td&gt;public&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td colspan="2"&gt;&amp;nbsp;&lt;/td&gt;
        &lt;td&gt;&lt;code&gt;AI_PASSIVE&lt;/code&gt;&lt;/td&gt;
        &lt;td&gt;public&lt;/td&gt;
        &lt;td&gt;loopback (v4)&lt;/td&gt;
        &lt;td&gt;public&lt;/td&gt;
      &lt;/tr&gt;
    &lt;/tbody&gt;
  &lt;/table&gt;
  &lt;code&gt;getaddrinfo()&lt;/code&gt; behavior on Windows Server 2008 R2, Arch Linux (Kernel 3.1.4, glibc 2.14.1), and OS X 10.7.2 (Lion).

&lt;p&gt;What caused me to investigate the issue in the first place is the behavior when given an empty, non-null host string: Windows returns the public addresses of the present interfaces, while OS X resolves them to &lt;code&gt;::1&lt;/code&gt;/&lt;code&gt;::&lt;/code&gt;, but only if a port is given, and Linux doesn&amp;#8217;t resolve them at all! Windows generally accepts the most combinations, returning an error only for the explicitly disallowed combination, which is relied on by some applications (e.g. the game &lt;em&gt;League of Legends&lt;/em&gt;).&lt;/p&gt;

&lt;p&gt;There were also some less significant differences in behavior which are mostly not listed in the table. First, in both of the Linux VMs I tried (an up-to-date Arch box and Ubuntu Oneric), only the IPv4 address of the loopback interface was returned. Second, as in the test no address family, socket type or protocol hints were passed to &lt;code&gt;getaddrinfo()&lt;/code&gt;, each address was returned twice on OS X, once with &lt;code&gt;SOCK_STREAM&lt;/code&gt;/&lt;code&gt;IPPROTO_TCP&lt;/code&gt; and once with &lt;code&gt;SOCK_DGRAM&lt;/code&gt;/&lt;code&gt;IPPROTO_UDP&lt;/code&gt; set. Linux returned three copies of each address, for &lt;code&gt;STREAM&lt;/code&gt;, &lt;code&gt;DGRAM&lt;/code&gt; and &lt;code&gt;RAW&lt;/code&gt;, with the according protocol types set, whereas Windows only returned a single copy with protocol type &lt;code&gt;IPPROTO_IP&lt;/code&gt; and socket type set to 0.&lt;/p&gt;

&lt;p&gt;In any case, as a result I have prepared a patch for Wine to emulate at least the succeeding/failing behavior of the Winsock incarnation of &lt;code&gt;getaddrinfo&lt;/code&gt; on Linux and OS X, which should solve the bigger part of the related problems. There ideally shouldn&amp;#8217;t be any Windows software relying on details beyond that (such as the actual number/layout of addresses returned), but who knows…&lt;/p&gt;
 &lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;algorithm&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;conv&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;range&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;socket&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;stdio&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;alias&lt;/span&gt; &lt;span class="n"&gt;AddressInfoFlags&lt;/span&gt; &lt;span class="n"&gt;AIF&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;foreach&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;host&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;localhost&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Socket&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;hostName&lt;/span&gt;&lt;span class="p"&gt;()])&lt;/span&gt;
  &lt;span class="k"&gt;foreach&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;port&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;0&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;80&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
  &lt;span class="k"&gt;foreach&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;flags&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="k"&gt;cast&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;AIF&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;AIF&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;PASSIVE&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="n"&gt;host&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;'&amp;quot;&lt;/span&gt; &lt;span class="p"&gt;~&lt;/span&gt; &lt;span class="n"&gt;host&lt;/span&gt; &lt;span class="p"&gt;~&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;'&amp;quot;&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;null&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;:&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="n"&gt;port&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;'&amp;quot;&lt;/span&gt; &lt;span class="p"&gt;~&lt;/span&gt; &lt;span class="n"&gt;port&lt;/span&gt; &lt;span class="p"&gt;~&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;'&amp;quot;&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;null&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;quot; (&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;flags&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;): &amp;quot;&lt;/span&gt;
    &lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="n"&gt;writeln&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
          &lt;span class="n"&gt;map&lt;/span&gt;&lt;span class="p"&gt;!&lt;/span&gt;&lt;span class="s"&gt;q{&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;address&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;quot; (&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;protocol&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;)&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="s"&gt;}&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="n"&gt;sort&lt;/span&gt;&lt;span class="p"&gt;!&lt;/span&gt;&lt;span class="s"&gt;q{&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;family&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;family&lt;/span&gt;&lt;span class="s"&gt;}&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
              &lt;span class="n"&gt;getAddressInfo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;host&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;port&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;flags&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="p"&gt;)&lt;/span&gt;
          &lt;span class="p"&gt;),&lt;/span&gt;
          &lt;span class="s"&gt;&amp;quot;, &amp;quot;&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Exception&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="n"&gt;writefln&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;[%s]&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;
&lt;/div&gt;
&lt;span&gt;D program used for gathering the data (longer than necessary to get semi-nice output). &lt;/span&gt;</content>
		<author>
			<name>David Nadlinger</name>
			<email>atom@klickverbot.at</email>
			<uri>http://klickverbot.at/</uri>
		</author>
		<source>
			<title type="html">David Nadlinger</title>
			<link rel="self" href="http://klickverbot.at/blog/tags/D/atom.xml" />
			<id>http://klickverbot.at/blog/tags/D/</id>
			<updated>2012-03-28T09:00:25+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">D:GamesVFS</title>
		<link href="http://feedproxy.google.com/~r/TheOneWithD/~3/3gyCPUHrcHQ/" />
		<id>http://dblog.aldacron.net/?p=990</id>
		<updated>2012-01-20T04:50:51+00:00</updated>
		<content type="html">&lt;p&gt;kith-sa &lt;a href="http://dfeed.kimsufi.thecybershadow.net/discussion/thread/jfa9dd$1veh$1@digitalmars.com" target="_blank"&gt;has announced&lt;/a&gt; a virtual file system aimed at D game developers. D:GameVFS isn&amp;#8217;t fully featured (can&amp;#8217;t delete directories, lacks security), doesn&amp;#8217;t support archives, and has an unstable API. But it&amp;#8217;s licensed under the Boost Software License and is available for you to snatch at github for you to use and/or improve upon. For details of what it can and can&amp;#8217;t do, see &lt;a href="https://github.com/kiith-sa/D-GameVFS" target="_blank"&gt;the intro page at github&lt;/a&gt;.&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TheOneWithD?a=3gyCPUHrcHQ:3EG2R9lCtKg:yIl2AUoC8zA"&gt;&lt;img border="0" src="http://feeds.feedburner.com/~ff/TheOneWithD?d=yIl2AUoC8zA" /&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheOneWithD?a=3gyCPUHrcHQ:3EG2R9lCtKg:F7zBnMyn0Lo"&gt;&lt;img border="0" src="http://feeds.feedburner.com/~ff/TheOneWithD?i=3gyCPUHrcHQ:3EG2R9lCtKg:F7zBnMyn0Lo" /&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheOneWithD?a=3gyCPUHrcHQ:3EG2R9lCtKg:cGdyc7Q-1BI"&gt;&lt;img border="0" src="http://feeds.feedburner.com/~ff/TheOneWithD?d=cGdyc7Q-1BI" /&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img height="1" src="http://feeds.feedburner.com/~r/TheOneWithD/~4/3gyCPUHrcHQ" width="1" /&gt;</content>
		<author>
			<name>Aldacron</name>
			<uri>http://dblog.aldacron.net</uri>
		</author>
		<source>
			<title type="html">The One With D</title>
			<subtitle type="html">News and Opinions Regarding the D Programming Language</subtitle>
			<link rel="self" href="http://feeds.feedburner.com/TheOneWithD" />
			<id>http://feeds.feedburner.com/TheOneWithD</id>
			<updated>2012-05-21T14:00:43+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">A Tutorial on Ranges</title>
		<link href="http://feedproxy.google.com/~r/TheOneWithD/~3/GLj4GhdU994/" />
		<id>http://dblog.aldacron.net/?p=988</id>
		<updated>2012-01-16T13:24:37+00:00</updated>
		<content type="html">&lt;p&gt;Ali Çehreli wrote a book on D in Turkish. He has been translating it into English chapter-by-chapter. In the newsgroups, he recently posted a link to &lt;a href="http://ddili.org/ders/d.en/ranges.html" target="_blank"&gt;the English translation of the chapter on ranges&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The topic of ranges is, in my opinion, the single most difficult concept for D newcomers to wrap their heads around. I know I&amp;#8217;ve had my fair share of head-scratching moments when functions in std.algorithm or std.range didn&amp;#8217;t work the way I expected them to. This chapter definitely goes a long way to reducing them.&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TheOneWithD?a=GLj4GhdU994:YnbI2VN6jmU:yIl2AUoC8zA"&gt;&lt;img border="0" src="http://feeds.feedburner.com/~ff/TheOneWithD?d=yIl2AUoC8zA" /&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheOneWithD?a=GLj4GhdU994:YnbI2VN6jmU:F7zBnMyn0Lo"&gt;&lt;img border="0" src="http://feeds.feedburner.com/~ff/TheOneWithD?i=GLj4GhdU994:YnbI2VN6jmU:F7zBnMyn0Lo" /&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheOneWithD?a=GLj4GhdU994:YnbI2VN6jmU:cGdyc7Q-1BI"&gt;&lt;img border="0" src="http://feeds.feedburner.com/~ff/TheOneWithD?d=cGdyc7Q-1BI" /&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img height="1" src="http://feeds.feedburner.com/~r/TheOneWithD/~4/GLj4GhdU994" width="1" /&gt;</content>
		<author>
			<name>Aldacron</name>
			<uri>http://dblog.aldacron.net</uri>
		</author>
		<source>
			<title type="html">The One With D</title>
			<subtitle type="html">News and Opinions Regarding the D Programming Language</subtitle>
			<link rel="self" href="http://feeds.feedburner.com/TheOneWithD" />
			<id>http://feeds.feedburner.com/TheOneWithD</id>
			<updated>2012-05-21T14:00:43+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">DWT Moved to GitHub</title>
		<link href="http://feedproxy.google.com/~r/TheOneWithD/~3/zzQKDoSiZtY/" />
		<id>http://dblog.aldacron.net/?p=984</id>
		<updated>2012-01-09T13:14:46+00:00</updated>
		<content type="html">&lt;p&gt;I had intended to post about this when I first saw it in the DWT newsgroup, but it slipped my mind. Luckily, Jacob reposted it in the announce newsgroup. He has picked up DWT and &lt;a href="https://github.com/d-widget-toolkit/dwt" target="_blank"&gt;lugged it over to github&lt;/a&gt;, breaking the packages up into submodules in the process. From the announcement:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;Use these commands to clone the repository and get all submodules:&lt;/p&gt;
&lt;p&gt;$ git clone git://github.com/d-widget-toolkit/dwt.git&lt;br /&gt;
$ git submodule init&lt;br /&gt;
$ git submodule update&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;In another post, he mentioned that he has no time for DWT development himself at the moment, but will happily accept pull requests. So those of you with the wherewithal to do some work on DWT , your country (that would be D Land) needs you.&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TheOneWithD?a=zzQKDoSiZtY:QhbfSeWAtO0:yIl2AUoC8zA"&gt;&lt;img border="0" src="http://feeds.feedburner.com/~ff/TheOneWithD?d=yIl2AUoC8zA" /&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheOneWithD?a=zzQKDoSiZtY:QhbfSeWAtO0:F7zBnMyn0Lo"&gt;&lt;img border="0" src="http://feeds.feedburner.com/~ff/TheOneWithD?i=zzQKDoSiZtY:QhbfSeWAtO0:F7zBnMyn0Lo" /&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheOneWithD?a=zzQKDoSiZtY:QhbfSeWAtO0:cGdyc7Q-1BI"&gt;&lt;img border="0" src="http://feeds.feedburner.com/~ff/TheOneWithD?d=cGdyc7Q-1BI" /&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img height="1" src="http://feeds.feedburner.com/~r/TheOneWithD/~4/zzQKDoSiZtY" width="1" /&gt;</content>
		<author>
			<name>Aldacron</name>
			<uri>http://dblog.aldacron.net</uri>
		</author>
		<source>
			<title type="html">The One With D</title>
			<subtitle type="html">News and Opinions Regarding the D Programming Language</subtitle>
			<link rel="self" href="http://feeds.feedburner.com/TheOneWithD" />
			<id>http://feeds.feedburner.com/TheOneWithD</id>
			<updated>2012-05-21T14:00:43+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">Binding D to C</title>
		<link href="http://www.gamedev.net/blog/1140/entry-2254003-binding-d-to-c/" />
		<id>http://www.gamedev.net/blog/1140/entry-2254003-binding-d-to-c/</id>
		<updated>2012-01-08T08:12:00+00:00</updated>
		<content type="html">This is part one of a series on creating bindings to C libraries for the D programming language.&lt;br /&gt;
&lt;br /&gt;
This is a topic that has become near and dear to my heart. &lt;a class="bbc_url" href="http://www.dsource.org/forums/viewforum.php?f=19" rel="nofollow external" title="External link"&gt;Derelict&lt;/a&gt; is the first, and only, open source project I've ever maintained. It's not a complicated thing. There's very little...</content>
		<author>
			<name>D Bits</name>
			<uri>http://www.gamedev.net/blog/1140-d-bits/</uri>
		</author>
		<source>
			<title type="html">D Bits</title>
			<subtitle type="html">D Bits Syndication</subtitle>
			<link rel="self" href="http://feeds.feedburner.com/DBits" />
			<id>http://feeds.feedburner.com/DBits</id>
			<updated>2012-05-19T12:00:21+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Visual D 0.3.30</title>
		<link href="http://feedproxy.google.com/~r/TheOneWithD/~3/jNtABQKcLZM/" />
		<id>http://dblog.aldacron.net/?p=981</id>
		<updated>2012-01-07T15:02:12+00:00</updated>
		<content type="html">&lt;p&gt;&lt;a href="http://www.dsource.org/projects/visuald" target="_blank"&gt;A new release of Visual D&lt;/a&gt;, the plugin for Visual Studio, has been uncaged. I&amp;#8217;ve already installed it. Rather than quote the announcement, I&amp;#8217;ll just point you over to DFeed so you can &lt;a href="http://dfeed.kimsufi.thecybershadow.net/discussion/thread/je9ljg$1rh6$1@digitalmars.com" target="_blank"&gt;read it in full&lt;/a&gt;. Gotta love &lt;a href="http://dfeed.kimsufi.thecybershadow.net/discussion/" target="_blank"&gt;DFeed&lt;/a&gt;.&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TheOneWithD?a=jNtABQKcLZM:rz9VWtmpGG0:yIl2AUoC8zA"&gt;&lt;img border="0" src="http://feeds.feedburner.com/~ff/TheOneWithD?d=yIl2AUoC8zA" /&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheOneWithD?a=jNtABQKcLZM:rz9VWtmpGG0:F7zBnMyn0Lo"&gt;&lt;img border="0" src="http://feeds.feedburner.com/~ff/TheOneWithD?i=jNtABQKcLZM:rz9VWtmpGG0:F7zBnMyn0Lo" /&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheOneWithD?a=jNtABQKcLZM:rz9VWtmpGG0:cGdyc7Q-1BI"&gt;&lt;img border="0" src="http://feeds.feedburner.com/~ff/TheOneWithD?d=cGdyc7Q-1BI" /&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img height="1" src="http://feeds.feedburner.com/~r/TheOneWithD/~4/jNtABQKcLZM" width="1" /&gt;</content>
		<author>
			<name>Aldacron</name>
			<uri>http://dblog.aldacron.net</uri>
		</author>
		<source>
			<title type="html">The One With D</title>
			<subtitle type="html">News and Opinions Regarding the D Programming Language</subtitle>
			<link rel="self" href="http://feeds.feedburner.com/TheOneWithD" />
			<id>http://feeds.feedburner.com/TheOneWithD</id>
			<updated>2012-05-21T14:00:43+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">D Version Manager 0.4.0</title>
		<link href="http://feedproxy.google.com/~r/TheOneWithD/~3/ItiBUhq6B8s/" />
		<id>http://dblog.aldacron.net/?p=978</id>
		<updated>2012-01-07T03:10:45+00:00</updated>
		<content type="html">&lt;p&gt;&lt;a href="https://bitbucket.org/doob/dvm/wiki/Home" target="_blank"&gt;D Version Manager&lt;/a&gt; &amp;#8220;allows you to easily download and install D compilers and manage different versions of the compilers.&amp;#8221; A new version has been released which adds the ability to compile DMD, DRuntime and Phobos (either from a github clone or from an official release package). For more info on the release, see &lt;a href="http://dfeed.kimsufi.thecybershadow.net/discussion/thread/je7p3p$1pl1$1@digitalmars.com#post-je7p3p:241pl1:241:40digitalmars.com" target="_blank"&gt;the announcement thread&lt;/a&gt; over at DFeed.&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TheOneWithD?a=ItiBUhq6B8s:s_v_t1AibZk:yIl2AUoC8zA"&gt;&lt;img border="0" src="http://feeds.feedburner.com/~ff/TheOneWithD?d=yIl2AUoC8zA" /&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheOneWithD?a=ItiBUhq6B8s:s_v_t1AibZk:F7zBnMyn0Lo"&gt;&lt;img border="0" src="http://feeds.feedburner.com/~ff/TheOneWithD?i=ItiBUhq6B8s:s_v_t1AibZk:F7zBnMyn0Lo" /&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheOneWithD?a=ItiBUhq6B8s:s_v_t1AibZk:cGdyc7Q-1BI"&gt;&lt;img border="0" src="http://feeds.feedburner.com/~ff/TheOneWithD?d=cGdyc7Q-1BI" /&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img height="1" src="http://feeds.feedburner.com/~r/TheOneWithD/~4/ItiBUhq6B8s" width="1" /&gt;</content>
		<author>
			<name>Aldacron</name>
			<uri>http://dblog.aldacron.net</uri>
		</author>
		<source>
			<title type="html">The One With D</title>
			<subtitle type="html">News and Opinions Regarding the D Programming Language</subtitle>
			<link rel="self" href="http://feeds.feedburner.com/TheOneWithD" />
			<id>http://feeds.feedburner.com/TheOneWithD</id>
			<updated>2012-05-21T14:00:43+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Happy New Year</title>
		<link href="http://feedproxy.google.com/~r/TheOneWithD/~3/8v0gisYRF3s/" />
		<id>http://dblog.aldacron.net/?p=974</id>
		<updated>2012-01-01T08:22:20+00:00</updated>
		<content type="html">&lt;p&gt;I&amp;#8217;m looking forward to a wonderful year in D-Land. Of course, I expect to see continued growth of the community and improvement in the compilers. But more than that, I have a feeling that this could be a bigger year for D than ever. If you asked me why, I couldn&amp;#8217;t tell you. It&amp;#8217;s just a feeling.&lt;/p&gt;
&lt;p&gt;Have a happy and healthy new year!&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TheOneWithD?a=8v0gisYRF3s:kV9LhdWiBdE:yIl2AUoC8zA"&gt;&lt;img border="0" src="http://feeds.feedburner.com/~ff/TheOneWithD?d=yIl2AUoC8zA" /&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheOneWithD?a=8v0gisYRF3s:kV9LhdWiBdE:F7zBnMyn0Lo"&gt;&lt;img border="0" src="http://feeds.feedburner.com/~ff/TheOneWithD?i=8v0gisYRF3s:kV9LhdWiBdE:F7zBnMyn0Lo" /&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheOneWithD?a=8v0gisYRF3s:kV9LhdWiBdE:cGdyc7Q-1BI"&gt;&lt;img border="0" src="http://feeds.feedburner.com/~ff/TheOneWithD?d=cGdyc7Q-1BI" /&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img height="1" src="http://feeds.feedburner.com/~r/TheOneWithD/~4/8v0gisYRF3s" width="1" /&gt;</content>
		<author>
			<name>Aldacron</name>
			<uri>http://dblog.aldacron.net</uri>
		</author>
		<source>
			<title type="html">The One With D</title>
			<subtitle type="html">News and Opinions Regarding the D Programming Language</subtitle>
			<link rel="self" href="http://feeds.feedburner.com/TheOneWithD" />
			<id>http://feeds.feedburner.com/TheOneWithD</id>
			<updated>2012-05-21T14:00:43+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en-us">
		<title type="html">Targeting OS X 64 Bit</title>
		<link href="http://www.drdobbs.com/blogs/parallel/232301070" />
		<id>http://www.drdobbs.com/blogs/parallel/232301070</id>
		<updated>2011-12-27T13:24:00+00:00</updated>
		<content type="html">A while back, I targeted the D programming language compiler to generate 32-bit code for OS X, and 64-bit code for Linux. For the last several years, all Mac OS X machines include 64-bit CPUs, so the obvious next step is to target 64-bit code for OS X.</content>
		<author>
			<name>Walter Bright</name>
			<uri>http://www.drdobbs.com//author/6839</uri>
		</author>
		<source>
			<title type="html">Dr. Dobb's Blogs</title>
			<subtitle type="html">Dr. Dobb's</subtitle>
			<link rel="self" href="http://www.drdobbs.com/rss/blogs/author/6839" />
			<id>http://www.drdobbs.com/rss/blogs/author/6839</id>
			<updated>2012-05-27T18:00:12+00:00</updated>
			<rights type="html">Copyright 2012, United Business Media.</rights>
		</source>
	</entry>

	<entry>
		<title type="html">Dolce and Da5teroids</title>
		<link href="http://www.gamedev.net/blog/1140/entry-2253918-dolce-and-da5teroids/" />
		<id>http://www.gamedev.net/blog/1140/entry-2253918-dolce-and-da5teroids/</id>
		<updated>2011-12-18T13:12:00+00:00</updated>
		<content type="html">So I've finally gotten started on some game code. In order to see if Dolce is actually useful or a waste of time, I decided to start by porting the A5teroids demo that ships with the Allegro 5 package. Here's what I've learned so far.&lt;br /&gt;
&lt;br /&gt;
First, the whole idea of Dolce as a framework on top of Allegro to allow an absolute minimum amount of startup...</content>
		<author>
			<name>D Bits</name>
			<uri>http://www.gamedev.net/blog/1140-d-bits/</uri>
		</author>
		<source>
			<title type="html">D Bits</title>
			<subtitle type="html">D Bits Syndication</subtitle>
			<link rel="self" href="http://feeds.feedburner.com/DBits" />
			<id>http://feeds.feedburner.com/DBits</id>
			<updated>2012-05-19T12:00:21+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">Dice and random sources</title>
		<link href="http://leonardo-m.livejournal.com/105700.html" />
		<id>http://leonardo-m.livejournal.com/105700.html</id>
		<updated>2011-12-18T01:47:04+00:00</updated>
		<content type="html">On Le Scienze (an edition of Scientific American) number 519, November 2011 there is a small mathematical problem. It asks to extract a random number among 8 using a die (that gives just a 1-6 result).&lt;br /&gt;&lt;br /&gt;The Le Scienze number 520, December 2011 shows two alternative answers. The first is to throw the die three times, and take the parity of each result. This means producing three random bits, that are the binary digits of a 0..7 number. The second solution is to use the rotation too of the physical die, and look at the numbers on the other faces, this gives 24 random possibilities, that are usable to find a 0..8 random number.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;This simple D v.2 code uses the first solution. random8() returns a random 0..8 number. It requires three throws to find a result:&lt;br /&gt;&lt;pre&gt;import std.stdio, std.random, std.algorithm;

__gshared uint dieCount;

int throwDie() {
    dieCount++;
    return uniform(0, 6);
}

int random8() {
    return ((throwDie() % 2) &amp;lt;&amp;lt; 2) +
           ((throwDie() % 2) &amp;lt;&amp;lt; 1) +
           (throwDie() % 2);
}

void main() {
    enum int N = 10_000_000;
    uint[int] freqs;

    foreach (_; 0 .. N)
        freqs[random8()]++;

    foreach (k; freqs.keys.sort())
        writeln(k, " ", freqs[k]);

    writefln("\n%.6f", dieCount / cast(double)N);
}&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Output:&lt;br /&gt;&lt;pre&gt;0 1249566
1 1250357
2 1251060
3 1248940
4 1250848
5 1248829
6 1250353
7 1250047

3.000000&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;A die throw gives about 2.6 random bits, if you look at just its upper face. So using 3 bits from 3 throws means wasting about 4.75 random bits (log(6 * 6 * 6, 2) ~= 7.75).&lt;br /&gt;&lt;br /&gt;But it's not hard to reduce the number of dice to throw on average. The idea is to just throw away a die result if it's larger than 4 (but in the code the die gives a 0..6 result, so the limit is 3), to collect two random bits, and then to find the parity of another die throw to collect the third bit of the result. On average this requires just a little more than two and half throws for each 1..9 random result. But this strategy too wastes some bits of the random source:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;import std.stdio, std.random, std.algorithm;

__gshared uint dieCount;

int throwDie() {
    dieCount++;
    return uniform(0, 6);
}

int random8() {
    while (true) {
        immutable int d1 = throwDie();
        if (d1 &amp;lt; 4)
            return (d1 &amp;lt;&amp;lt; 1) + (throwDie() % 2);
    }
}

void main() {
    enum int N = 10_000_000;
    uint[int] freqs;

    foreach (_; 0 .. N)
        freqs[random8()]++;

    foreach (k; freqs.keys.sort())
        writeln(k, " ", freqs[k]);

    writefln("\n%.6f", dieCount / cast(double)N);
}&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Output:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;0 1250850
1 1249593
2 1248823
3 1248606
4 1249314
5 1250182
6 1251221
7 1251411

2.500165&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;There are ways to waste less bits on average, but they become more complex and require more total throws to reach the average.&lt;br /&gt;&lt;br /&gt;Update Dec 19 2011: for a smarter solution see this rosettacode task:&lt;br /&gt;&lt;a href="http://rosettacode.org/wiki/Seven-sided_dice_from_five-sided_dice#D" rel="nofollow"&gt;http://rosettacode.org/wiki/Seven-sided_dice_from_five-sided_dice#D&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The Task: Given an equal-probability generator of one of the integers 1 to 5 as dice5; create dice7 that generates a pseudo-random integer from 1 to 7 in equal probability using only dice5 as a source of random numbers.&lt;br /&gt;&lt;br /&gt;Two D solutions, fiveToSevenSmart minimizes the number of calls to dice7:&lt;br /&gt;&lt;pre&gt;import std.random: uniform;

__gshared uint die5Count;

/// Generates a random number in [1, 5].
int dice5() /*nothrow*/ {
    die5Count++; // update count
    return uniform(1, 6);
}

/// Naive, generates a random number in [1, 7] using dice5.
int fiveToSevenNaive() /*nothrow*/ {
    immutable int r = dice5() + dice5() * 5 - 6;
    return (r &amp;lt; 21) ? (r % 7) + 1 : fiveToSevenNaive();
}

/**
Generates a random number in [1, 7] using dice5,
minimizing calls to dice5.
*/
int fiveToSevenSmart() /*nothrow*/ {
    static int rem = 0, max = 1;

    while (rem / 7 == max / 7) {
        while (max &amp;lt; 7) {
            immutable int rand5 = dice5() - 1;
            max *= 5;
            rem = 5 * rem + rand5;
        }

        immutable int groups = max / 7;
        if (rem &amp;gt;= 7 * groups) {
            rem -= 7 * groups;
            max -= 7 * groups;
        }
    }

    immutable int result = rem % 7;
    rem /= 7;
    max /= 7;
    return result + 1;
}

void main() {
    import std.algorithm; // sort, reduce
    import std.stdio; // writefln
    enum int N = 10_000_000;

    foreach (rnd; [&amp;amp;fiveToSevenNaive, &amp;amp;fiveToSevenSmart]) {
        uint[int] counts;
        .die5Count = 0;

        foreach (_; 0 .. N)
            counts[rnd()]++;

        immutable tot = reduce!q{a + b}(counts.byValue());
        foreach (k; sort(counts.keys))
            writefln("%d %.2f%%", k, (100 * counts[k]) / cast(double)tot);

        writefln("Average dice5 throws: %.4f\n",
                 die5Count / cast(double)N);
    }
}&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;That prints:&lt;br /&gt;&lt;pre&gt;1 14.29%
2 14.30%
3 14.27%
4 14.29%
5 14.26%
6 14.29%
7 14.29%
Average dice5 throws: 2.3813

1 14.28%
2 14.28%
3 14.29%
4 14.30%
5 14.29%
6 14.29%
7 14.27%
Average dice5 throws: 1.5458&lt;/pre&gt;</content>
		<author>
			<name>Leonardo Maffi</name>
			<uri>http://leonardo-m.livejournal.com/</uri>
		</author>
		<source>
			<title type="html">leonardo</title>
			<subtitle type="html">leonardo - LiveJournal.com</subtitle>
			<link rel="self" href="http://leonardo-m.livejournal.com/data/rss?tag=d%20language" />
			<id>http://leonardo-m.livejournal.com/data/rss?tag=d%20language</id>
			<updated>2012-04-15T17:00:15+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Derelict Updates</title>
		<link href="http://feedproxy.google.com/~r/TheOneWithD/~3/z6sK4Pv0A54/" />
		<id>http://dblog.aldacron.net/?p=970</id>
		<updated>2011-12-15T14:32:42+00:00</updated>
		<content type="html">&lt;p&gt;Users of &lt;a href="http://www.dsource.org/projects/derelict/" target="_blank"&gt;Derelict 2&lt;/a&gt; should upgrade to the latest and greatest. The newest DMD releases broke compilation, but the repository now contains fixes. Also, I discovered that DerelictAllegro wasn&amp;#8217;t Tango-ready, so now it is.&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TheOneWithD?a=z6sK4Pv0A54:yR8raspduKU:yIl2AUoC8zA"&gt;&lt;img border="0" src="http://feeds.feedburner.com/~ff/TheOneWithD?d=yIl2AUoC8zA" /&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheOneWithD?a=z6sK4Pv0A54:yR8raspduKU:F7zBnMyn0Lo"&gt;&lt;img border="0" src="http://feeds.feedburner.com/~ff/TheOneWithD?i=z6sK4Pv0A54:yR8raspduKU:F7zBnMyn0Lo" /&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheOneWithD?a=z6sK4Pv0A54:yR8raspduKU:cGdyc7Q-1BI"&gt;&lt;img border="0" src="http://feeds.feedburner.com/~ff/TheOneWithD?d=cGdyc7Q-1BI" /&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img height="1" src="http://feeds.feedburner.com/~r/TheOneWithD/~4/z6sK4Pv0A54" width="1" /&gt;</content>
		<author>
			<name>Aldacron</name>
			<uri>http://dblog.aldacron.net</uri>
		</author>
		<source>
			<title type="html">The One With D</title>
			<subtitle type="html">News and Opinions Regarding the D Programming Language</subtitle>
			<link rel="self" href="http://feeds.feedburner.com/TheOneWithD" />
			<id>http://feeds.feedburner.com/TheOneWithD</id>
			<updated>2012-05-21T14:00:43+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">DMD 1.072 and 2.057</title>
		<link href="http://feedproxy.google.com/~r/TheOneWithD/~3/6AevkPdcwKU/" />
		<id>http://dblog.aldacron.net/?p=966</id>
		<updated>2011-12-14T12:01:49+00:00</updated>
		<content type="html">&lt;p&gt;DMD &lt;a href="http://www.digitalmars.com/d/1.0/changelog.html#new1_072" target="_blank"&gt;1.072&lt;/a&gt; was released a few days back, but &lt;a href="http://www.d-programming-language.org/changelog.html#new2_057" target="_blank"&gt;2.057&lt;/a&gt; spent some extra time in the oven before being announced today. One of the biggest deals in 1.072 is support for 64-bit Mac OSX. And in the 2.057 release, there&amp;#8217;s just too much goodness to pick any one thing to mention here.&lt;/p&gt;
&lt;p&gt;One important related bit of news is that next year, from Dec 31, 2012, DMD 1.x will no longer be developed. So if you&amp;#8217;ve got a D1 codebase you were considering porting to D2, now may be the time to get started on that. The D1 compilers will still be around, of course, they just will no longer have any official support.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TheOneWithD?a=6AevkPdcwKU:Thf06vvb1nE:yIl2AUoC8zA"&gt;&lt;img border="0" src="http://feeds.feedburner.com/~ff/TheOneWithD?d=yIl2AUoC8zA" /&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheOneWithD?a=6AevkPdcwKU:Thf06vvb1nE:F7zBnMyn0Lo"&gt;&lt;img border="0" src="http://feeds.feedburner.com/~ff/TheOneWithD?i=6AevkPdcwKU:Thf06vvb1nE:F7zBnMyn0Lo" /&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheOneWithD?a=6AevkPdcwKU:Thf06vvb1nE:cGdyc7Q-1BI"&gt;&lt;img border="0" src="http://feeds.feedburner.com/~ff/TheOneWithD?d=cGdyc7Q-1BI" /&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img height="1" src="http://feeds.feedburner.com/~r/TheOneWithD/~4/6AevkPdcwKU" width="1" /&gt;</content>
		<author>
			<name>Aldacron</name>
			<uri>http://dblog.aldacron.net</uri>
		</author>
		<source>
			<title type="html">The One With D</title>
			<subtitle type="html">News and Opinions Regarding the D Programming Language</subtitle>
			<link rel="self" href="http://feeds.feedburner.com/TheOneWithD" />
			<id>http://feeds.feedburner.com/TheOneWithD</id>
			<updated>2012-05-21T14:00:43+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">News Roundup</title>
		<link href="http://feedproxy.google.com/~r/TheOneWithD/~3/2V2-6LJZtkY/" />
		<id>http://dblog.aldacron.net/?p=961</id>
		<updated>2011-12-06T02:14:08+00:00</updated>
		<content type="html">&lt;p&gt;Recent announcements from D Land.&lt;/p&gt;
&lt;p&gt;* If you are doing any graphics programming in D, you may be interested in &lt;a href="https://bitbucket.org/dav1d/gl3n/overview" target="_blank"&gt;gl3n&lt;/a&gt;, a math library explicitly geared toward that purpose.&lt;/p&gt;
&lt;p&gt;* Version 0.3.29 of &lt;a href="http://www.dsource.org/projects/visuald" target="_blank"&gt;VisualD&lt;/a&gt; has been announced. This release includes a nifty little tool that will convert C++ code to D.&lt;/p&gt;
&lt;p&gt;* Another IDE plugin has hit the streets. This one, called &lt;a href="http://mono-d.sourceforge.net/" target="_blank"&gt;Mono-D&lt;/a&gt;, is &amp;#8220;a MonoDevelop AddIn which provides code completion/refactoring features and project management for D.&amp;#8221;&lt;/p&gt;
&lt;p&gt;* And good news for Windows developers who don&amp;#8217;t want to use DMD. A new version of MingW GDC is out, with support for Thread-Local Storage. For this one, Daniel Green&amp;#8217;s full newsgroup announcement is quoted below.&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;Please post all issues in D.gnu or on GDC&amp;#8217;s bitbucket site &lt;a href="https://bitbucket.org/goshawk/gdc"&gt;https://bitbucket.org/goshawk/gdc&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;* Built against TDM GCC 4.6.1:  &lt;a href="http://tdm-gcc.tdragon.net/"&gt;http://tdm-gcc.tdragon.net/&lt;/a&gt;&lt;br /&gt;
* Built against GDC revision 7e22befef29c.&lt;br /&gt;
* Working TLS support.&lt;br /&gt;
* Updated binutils and mingw runtime for TLS support.&lt;br /&gt;
* new gas directive @secrel32 will generate a constant offset usable&lt;br /&gt;
as an immediate or displacement value.&lt;br /&gt;
Works like posix counterparts @tpoff, @dtpoff, etc.&lt;br /&gt;
* Fixes an error with the mingw runtime related to TLS.&lt;br /&gt;
* 7-zip format for size reasons:  &lt;a href="http://7-zip.org/"&gt;http://7-zip.org&lt;/a&gt;&lt;br /&gt;
* Release includes both D versions.&lt;br /&gt;
* -v1(default) compiles for D1.&lt;br /&gt;
* -v2 compiles for D2.&lt;br /&gt;
* The switch must be used for linking as well.&lt;br /&gt;
* Made possible by Iain Buclaw&amp;#8217;s hard work in maintaining GDC.&lt;br /&gt;
* 64bit and up to date GDC forthcoming.&lt;/p&gt;
&lt;p&gt;To install simply extract to you TDM MinGW32 directory.&lt;/p&gt;
&lt;p&gt;This release&lt;br /&gt;
&lt;a href="https://bitbucket.org/goshawk/gdc/downloads/gcc-4.6.1-tdm-1-gdc-7e22befef29c-20111205.zip"&gt;https://bitbucket.org/goshawk/gdc/downloads/gcc-4.6.1-tdm-1-gdc-7e22befef29c-20111205.zip&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;All MinGW GDC downloads.&lt;br /&gt;
It&amp;#8217;s highly recommended to ignore all prior builds.  TLS &lt;strong&gt;*will*&lt;/strong&gt; not work.&lt;br /&gt;
&lt;a href="https://bitbucket.org/goshawk/gdc/downloads"&gt;https://bitbucket.org/goshawk/gdc/downloads&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;All patches, source files and build scripts can be found at &lt;a href="https://bitbucket.org/venix1/mingw-gdc/"&gt;https://bitbucket.org/venix1/mingw-gdc/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Enjoy.&lt;/p&gt;&lt;/blockquote&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TheOneWithD?a=2V2-6LJZtkY:IkWGvAR0_Es:yIl2AUoC8zA"&gt;&lt;img border="0" src="http://feeds.feedburner.com/~ff/TheOneWithD?d=yIl2AUoC8zA" /&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheOneWithD?a=2V2-6LJZtkY:IkWGvAR0_Es:F7zBnMyn0Lo"&gt;&lt;img border="0" src="http://feeds.feedburner.com/~ff/TheOneWithD?i=2V2-6LJZtkY:IkWGvAR0_Es:F7zBnMyn0Lo" /&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheOneWithD?a=2V2-6LJZtkY:IkWGvAR0_Es:cGdyc7Q-1BI"&gt;&lt;img border="0" src="http://feeds.feedburner.com/~ff/TheOneWithD?d=cGdyc7Q-1BI" /&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img height="1" src="http://feeds.feedburner.com/~r/TheOneWithD/~4/2V2-6LJZtkY" width="1" /&gt;</content>
		<author>
			<name>Aldacron</name>
			<uri>http://dblog.aldacron.net</uri>
		</author>
		<source>
			<title type="html">The One With D</title>
			<subtitle type="html">News and Opinions Regarding the D Programming Language</subtitle>
			<link rel="self" href="http://feeds.feedburner.com/TheOneWithD" />
			<id>http://feeds.feedburner.com/TheOneWithD</id>
			<updated>2012-05-21T14:00:43+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en-us">
		<title type="html">Reading PDFs on the Kindle Fire</title>
		<link href="http://www.drdobbs.com/blogs/mobile/232200675" />
		<id>http://www.drdobbs.com/blogs/mobile/232200675</id>
		<updated>2011-12-02T21:29:00+00:00</updated>
		<content type="html">I've read a lot of reviews of the Kindle Fire, and they don't discuss something very important to me &amp;mdash; reading PDF files on the Fire</content>
		<author>
			<name>Walter Bright</name>
			<uri>http://www.drdobbs.com//author/6839</uri>
		</author>
		<source>
			<title type="html">Dr. Dobb's Blogs</title>
			<subtitle type="html">Dr. Dobb's</subtitle>
			<link rel="self" href="http://www.drdobbs.com/rss/blogs/author/6839" />
			<id>http://www.drdobbs.com/rss/blogs/author/6839</id>
			<updated>2012-05-27T18:00:12+00:00</updated>
			<rights type="html">Copyright 2012, United Business Media.</rights>
		</source>
	</entry>

	<entry>
		<title type="html">Updates and links</title>
		<link href="http://leonardo-m.livejournal.com/105390.html" />
		<id>http://leonardo-m.livejournal.com/105390.html</id>
		<updated>2011-11-26T01:26:56+00:00</updated>
		<content type="html">Two new small D programs, to compute sorting networks at compile time, and to compute PI:&lt;br /&gt;&lt;a href="http://www.fantascienza.net/leonardo/js/index.html#bose_nelson" rel="nofollow"&gt;http://www.fantascienza.net/leonardo/js/index.html#bose_nelson&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.fantascienza.net/leonardo/js/index.html#machin_pi" rel="nofollow"&gt;http://www.fantascienza.net/leonardo/js/index.html#machin_pi&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;-------------------&lt;br /&gt;&lt;br /&gt;A little but nice introduction to Haskell:&lt;br /&gt;&lt;a href="http://www.ozonehouse.com/mark/haskell-amuse-bouche/slides.html" rel="nofollow"&gt;http://www.ozonehouse.com/mark/haskell-amuse-bouche/slides.html&lt;/a&gt;&lt;br /&gt;And its code:&lt;br /&gt;&lt;a href="https://github.com/mtnviewmark/haskell-amuse-bouche" rel="nofollow"&gt;https://github.com/mtnviewmark/haskell-amuse-bouche&lt;/a&gt;&lt;br /&gt;And its talk:&lt;br /&gt;&lt;a href="http://youtu.be/b9FagOVqxmI" rel="nofollow"&gt;http://youtu.be/b9FagOVqxmI&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;An Adventure in the Nth Dimension, by the good Brian Hayes, some simple but interesting and important comments about higher higher dimensions geometry:&lt;br /&gt;&lt;a href="http://www.americanscientist.org/issues/id.13850,y.0,no.,content.true,page.1,css.print/issue.aspx" rel="nofollow"&gt;http://www.americanscientist.org/issues/id.13850,y.0,no.,content.true,page.1,css.print/issue.aspx&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;One of the strangest things I've seen in JavaScript, used with the Agda language: &lt;br /&gt;&lt;a href="https://github.com/agda/agda-frp-js" rel="nofollow"&gt;https://github.com/agda/agda-frp-js&lt;/a&gt;</content>
		<author>
			<name>Leonardo Maffi</name>
			<uri>http://leonardo-m.livejournal.com/</uri>
		</author>
		<source>
			<title type="html">leonardo</title>
			<subtitle type="html">leonardo - LiveJournal.com</subtitle>
			<link rel="self" href="http://leonardo-m.livejournal.com/data/rss?tag=d%20language" />
			<id>http://leonardo-m.livejournal.com/data/rss?tag=d%20language</id>
			<updated>2012-04-15T17:00:15+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Interfacing D with C++ : start new thread</title>
		<link href="http://www.deadalnix.me/2011/11/24/interfacing-d-with-c-start-new-thread/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=interfacing-d-with-c-start-new-thread" />
		<id>http://www.deadalnix.42/?p=15</id>
		<updated>2011-11-24T23:16:45+00:00</updated>
		<content type="html">&lt;p&gt;Interfacing D with C++ is sometime tricky. In this scenario, I will show how to start a thread from C++ that execute C++ code, but in a valid D environment, so that C++ code can interact with D code safely.&lt;/p&gt;
&lt;p&gt;This work as been done to port SFML2 to D2 language. But the technique is useful for anybody who want to start safely thread in a environment with code in both C++ and D.&lt;span id="more-15"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h1&gt;The main function&lt;/h1&gt;
&lt;p&gt;First of all, we need a C++ main. This seems easy, but is actually not so straightforward, because D runtime already define that function (and you&amp;#8217;ll get an error at link time). So lets define a D main, that start our program in C++ :&lt;/p&gt;
&lt;div class="codecolorer-container d railscasts"&gt;&lt;table cellpadding="0" cellspacing="0"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;div&gt;1&lt;br /&gt;2&lt;br /&gt;3&lt;br /&gt;4&lt;br /&gt;5&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;div class="d codecolorer"&gt;&lt;span&gt;module&lt;/span&gt; main&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span&gt;extern&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;C&lt;span&gt;++&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;int&lt;/span&gt; CXXmain&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span&gt;int&lt;/span&gt; main&lt;span&gt;&amp;#40;&lt;/span&gt;string&lt;span&gt;&amp;#91;&lt;/span&gt;&lt;span&gt;&amp;#93;&lt;/span&gt; argv&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;return&lt;/span&gt; CXXmain&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span&gt;&amp;#125;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;
&lt;p&gt;Now we can start our C++ code using CXXmain function. We doesn&amp;#8217;t pass any command line parameter in this example, however, this is something we should consider to add in the future.&lt;/p&gt;
&lt;h1&gt;The C++ thread class&lt;/h1&gt;
&lt;p&gt;To encapsulate the thread functionality (that is different on each system) we will use a class designed to abstract what is a thread. To not reinvent the well, this example will use a modified version of &lt;a href="http://www.sfml-dev.org/" target="_blank"&gt;SFML&lt;/a&gt;&amp;#8216;s thread class. This thread class use ThreadImpl, another class, to provide an system dependent implementation of threads. Let&amp;#8217;s write our own version of ThreadImpl, implementing what we need to start a thread using D runtime.&lt;/p&gt;
&lt;p&gt;The header :&lt;/p&gt;
&lt;div class="codecolorer-container cpp railscasts"&gt;&lt;table cellpadding="0" cellspacing="0"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;div&gt;1&lt;br /&gt;2&lt;br /&gt;3&lt;br /&gt;4&lt;br /&gt;5&lt;br /&gt;6&lt;br /&gt;7&lt;br /&gt;8&lt;br /&gt;9&lt;br /&gt;10&lt;br /&gt;11&lt;br /&gt;12&lt;br /&gt;13&lt;br /&gt;14&lt;br /&gt;15&lt;br /&gt;16&lt;br /&gt;17&lt;br /&gt;18&lt;br /&gt;19&lt;br /&gt;20&lt;br /&gt;21&lt;br /&gt;22&lt;br /&gt;23&lt;br /&gt;24&lt;br /&gt;25&lt;br /&gt;26&lt;br /&gt;27&lt;br /&gt;28&lt;br /&gt;29&lt;br /&gt;30&lt;br /&gt;31&lt;br /&gt;32&lt;br /&gt;33&lt;br /&gt;34&lt;br /&gt;35&lt;br /&gt;36&lt;br /&gt;37&lt;br /&gt;38&lt;br /&gt;39&lt;br /&gt;40&lt;br /&gt;41&lt;br /&gt;42&lt;br /&gt;43&lt;br /&gt;44&lt;br /&gt;45&lt;br /&gt;46&lt;br /&gt;47&lt;br /&gt;48&lt;br /&gt;49&lt;br /&gt;50&lt;br /&gt;51&lt;br /&gt;52&lt;br /&gt;53&lt;br /&gt;54&lt;br /&gt;55&lt;br /&gt;56&lt;br /&gt;57&lt;br /&gt;58&lt;br /&gt;59&lt;br /&gt;60&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;div class="cpp codecolorer"&gt;&lt;span&gt;#ifndef SFML_THREADIMPL_HPP&lt;/span&gt;&lt;br /&gt;
&lt;span&gt;#define SFML_THREADIMPL_HPP&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span&gt;#include &amp;lt;SFML/System/NonCopyable.hpp&amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span&gt;namespace&lt;/span&gt; sf&lt;br /&gt;
&lt;span&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&lt;span&gt;class&lt;/span&gt; Thread&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span&gt;namespace&lt;/span&gt; priv&lt;br /&gt;
&lt;span&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&lt;span&gt;////////////////////////////////////////////////////////////&lt;/span&gt;&lt;br /&gt;
&lt;span&gt;/// \brief D implementation of threads&lt;/span&gt;&lt;br /&gt;
&lt;span&gt;////////////////////////////////////////////////////////////&lt;/span&gt;&lt;br /&gt;
&lt;span&gt;class&lt;/span&gt; ThreadImpl &lt;span&gt;:&lt;/span&gt; NonCopyable &lt;span&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&lt;span&gt;public&lt;/span&gt; &lt;span&gt;:&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span&gt;////////////////////////////////////////////////////////////&lt;/span&gt;&lt;br /&gt;
&lt;span&gt;/// \brief Default constructor, launch the thread&lt;/span&gt;&lt;br /&gt;
&lt;span&gt;///&lt;/span&gt;&lt;br /&gt;
&lt;span&gt;/// \param owner The Thread instance to run&lt;/span&gt;&lt;br /&gt;
&lt;span&gt;///&lt;/span&gt;&lt;br /&gt;
&lt;span&gt;////////////////////////////////////////////////////////////&lt;/span&gt;&lt;br /&gt;
ThreadImpl&lt;span&gt;&amp;#40;&lt;/span&gt;Thread&lt;span&gt;*&lt;/span&gt; owner&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span&gt;////////////////////////////////////////////////////////////&lt;/span&gt;&lt;br /&gt;
&lt;span&gt;/// \brief Wait until the thread finishes&lt;/span&gt;&lt;br /&gt;
&lt;span&gt;///&lt;/span&gt;&lt;br /&gt;
&lt;span&gt;////////////////////////////////////////////////////////////&lt;/span&gt;&lt;br /&gt;
&lt;span&gt;void&lt;/span&gt; Wait&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span&gt;////////////////////////////////////////////////////////////&lt;/span&gt;&lt;br /&gt;
&lt;span&gt;/// \brief Terminate the thread&lt;/span&gt;&lt;br /&gt;
&lt;span&gt;///&lt;/span&gt;&lt;br /&gt;
&lt;span&gt;////////////////////////////////////////////////////////////&lt;/span&gt;&lt;br /&gt;
&lt;span&gt;void&lt;/span&gt; Terminate&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span&gt;private&lt;/span&gt; &lt;span&gt;:&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span&gt;////////////////////////////////////////////////////////////&lt;/span&gt;&lt;br /&gt;
&lt;span&gt;/// \brief Global entry point for all threads&lt;/span&gt;&lt;br /&gt;
&lt;span&gt;///&lt;/span&gt;&lt;br /&gt;
&lt;span&gt;/// \param userData User-defined data (contains the Thread instance)&lt;/span&gt;&lt;br /&gt;
&lt;span&gt;///&lt;/span&gt;&lt;br /&gt;
&lt;span&gt;/// \return Os specific error code&lt;/span&gt;&lt;br /&gt;
&lt;span&gt;///&lt;/span&gt;&lt;br /&gt;
&lt;span&gt;////////////////////////////////////////////////////////////&lt;/span&gt;&lt;br /&gt;
&lt;span&gt;static&lt;/span&gt; &lt;span&gt;void&lt;/span&gt;&lt;span&gt;*&lt;/span&gt; EntryPoint&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;void&lt;/span&gt;&lt;span&gt;*&lt;/span&gt; userData&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span&gt;////////////////////////////////////////////////////////////&lt;/span&gt;&lt;br /&gt;
&lt;span&gt;// Member data&lt;/span&gt;&lt;br /&gt;
&lt;span&gt;////////////////////////////////////////////////////////////&lt;/span&gt;&lt;br /&gt;
&lt;span&gt;void&lt;/span&gt;&lt;span&gt;*&lt;/span&gt;    tid&lt;span&gt;;&lt;/span&gt;   &lt;span&gt;///&amp;lt; Tid instance&lt;/span&gt;&lt;br /&gt;
&lt;span&gt;&amp;#125;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span&gt;&amp;#125;&lt;/span&gt; &lt;span&gt;// namespace priv&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span&gt;&amp;#125;&lt;/span&gt; &lt;span&gt;// namespace sf&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span&gt;#endif // SFML_THREADIMPL_HPP&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;
&lt;p&gt;And the implementation :&lt;/p&gt;
&lt;div class="codecolorer-container cpp railscasts"&gt;&lt;table cellpadding="0" cellspacing="0"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;div&gt;1&lt;br /&gt;2&lt;br /&gt;3&lt;br /&gt;4&lt;br /&gt;5&lt;br /&gt;6&lt;br /&gt;7&lt;br /&gt;8&lt;br /&gt;9&lt;br /&gt;10&lt;br /&gt;11&lt;br /&gt;12&lt;br /&gt;13&lt;br /&gt;14&lt;br /&gt;15&lt;br /&gt;16&lt;br /&gt;17&lt;br /&gt;18&lt;br /&gt;19&lt;br /&gt;20&lt;br /&gt;21&lt;br /&gt;22&lt;br /&gt;23&lt;br /&gt;24&lt;br /&gt;25&lt;br /&gt;26&lt;br /&gt;27&lt;br /&gt;28&lt;br /&gt;29&lt;br /&gt;30&lt;br /&gt;31&lt;br /&gt;32&lt;br /&gt;33&lt;br /&gt;34&lt;br /&gt;35&lt;br /&gt;36&lt;br /&gt;37&lt;br /&gt;38&lt;br /&gt;39&lt;br /&gt;40&lt;br /&gt;41&lt;br /&gt;42&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;div class="cpp codecolorer"&gt;&lt;span&gt;#include &amp;lt;SFML/System/D/ThreadImpl.hpp&amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span&gt;#include &amp;lt;SFML/System/Thread.hpp&amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span&gt;// Thoses are not supposed to be used on C++ side. Anyway, they require to be in the global scope to be linked with D.&lt;/span&gt;&lt;br /&gt;
&lt;span&gt;void&lt;/span&gt;&lt;span&gt;*&lt;/span&gt; __dsfml_start_thread&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;void&lt;/span&gt;&lt;span&gt;*&lt;/span&gt; &lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;*&lt;/span&gt;entryPoint&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;void&lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;, &lt;span&gt;void&lt;/span&gt;&lt;span&gt;*&lt;/span&gt; userData&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span&gt;void&lt;/span&gt; __dsfml_wait_thread&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;void&lt;/span&gt;&lt;span&gt;*&lt;/span&gt; tid&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span&gt;void&lt;/span&gt; __dsfml_terminate_thread&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;void&lt;/span&gt;&lt;span&gt;*&lt;/span&gt; tid&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span&gt;namespace&lt;/span&gt; sf&lt;br /&gt;
&lt;span&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&lt;span&gt;namespace&lt;/span&gt; priv&lt;br /&gt;
&lt;span&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&lt;span&gt;////////////////////////////////////////////////////////////&lt;/span&gt;&lt;br /&gt;
ThreadImpl&lt;span&gt;::&lt;/span&gt;&lt;span&gt;ThreadImpl&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;Thread&lt;span&gt;*&lt;/span&gt; owner&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; tid &lt;span&gt;=&lt;/span&gt; __dsfml_start_thread&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;amp;&lt;/span&gt;ThreadImpl&lt;span&gt;::&lt;/span&gt;&lt;span&gt;EntryPoint&lt;/span&gt;, owner&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span&gt;&amp;#125;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span&gt;////////////////////////////////////////////////////////////&lt;/span&gt;&lt;br /&gt;
&lt;span&gt;void&lt;/span&gt; ThreadImpl&lt;span&gt;::&lt;/span&gt;&lt;span&gt;Wait&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; __dsfml_wait_thread&lt;span&gt;&amp;#40;&lt;/span&gt;tid&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span&gt;&amp;#125;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span&gt;////////////////////////////////////////////////////////////&lt;/span&gt;&lt;br /&gt;
&lt;span&gt;void&lt;/span&gt; ThreadImpl&lt;span&gt;::&lt;/span&gt;&lt;span&gt;Terminate&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; __dsfml_terminate_thread&lt;span&gt;&amp;#40;&lt;/span&gt;tid&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span&gt;&amp;#125;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span&gt;////////////////////////////////////////////////////////////&lt;/span&gt;&lt;br /&gt;
&lt;span&gt;void&lt;/span&gt;&lt;span&gt;*&lt;/span&gt; ThreadImpl&lt;span&gt;::&lt;/span&gt;&lt;span&gt;EntryPoint&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;void&lt;/span&gt;&lt;span&gt;*&lt;/span&gt; userData&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;// The Thread instance is stored in the user data&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; Thread&lt;span&gt;*&lt;/span&gt; owner &lt;span&gt;=&lt;/span&gt; &lt;span&gt;static_cast&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;Thread&lt;span&gt;*&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;userData&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;// Forward to the owner&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; owner&lt;span&gt;-&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;Run&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;return&lt;/span&gt; &lt;span&gt;NULL&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span&gt;&amp;#125;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span&gt;&amp;#125;&lt;/span&gt; &lt;span&gt;// namespace priv&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span&gt;&amp;#125;&lt;/span&gt; &lt;span&gt;// namespace sf&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;
&lt;p&gt;Now we have a thread class in C++ that forward its calls to D code. We need to start a thread from D using that code. Let create our main C++ code to start teh thread :&lt;/p&gt;
&lt;div class="codecolorer-container cpp railscasts"&gt;&lt;table cellpadding="0" cellspacing="0"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;div&gt;1&lt;br /&gt;2&lt;br /&gt;3&lt;br /&gt;4&lt;br /&gt;5&lt;br /&gt;6&lt;br /&gt;7&lt;br /&gt;8&lt;br /&gt;9&lt;br /&gt;10&lt;br /&gt;11&lt;br /&gt;12&lt;br /&gt;13&lt;br /&gt;14&lt;br /&gt;15&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;div class="cpp codecolorer"&gt;&lt;span&gt;#include&amp;lt;SFML/System.hpp&amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span&gt;#include&amp;lt;iostream&amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span&gt;using&lt;/span&gt; &lt;span&gt;namespace&lt;/span&gt; sf&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span&gt;void&lt;/span&gt; someFunction&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; std&lt;span&gt;::&lt;/span&gt;&lt;span&gt;cout&lt;/span&gt; &lt;span&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span&gt;&amp;quot;Some function !&amp;quot;&lt;/span&gt; &lt;span&gt;&amp;lt;&amp;lt;&lt;/span&gt; std&lt;span&gt;::&lt;/span&gt;&lt;span&gt;endl&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span&gt;&amp;#125;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span&gt;int&lt;/span&gt; CXXmain&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; Thread&lt;span&gt;*&lt;/span&gt; t &lt;span&gt;=&lt;/span&gt; &lt;span&gt;new&lt;/span&gt; Thread&lt;span&gt;&amp;#40;&lt;/span&gt;someFunction&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; t&lt;span&gt;-&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;Launch&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;return&lt;/span&gt; &lt;span&gt;0&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span&gt;&amp;#125;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;
&lt;h1&gt;Start a thread the D way&lt;/h1&gt;
&lt;p&gt;Now that we have everything set up to forward thread call to D, we have to handle that calls. The most interesting function (and the only one we will implement for now) is __dsfml_start_thread. This function has 2 parameters : a function pointer to a C++ entry point for the new thread, and a pointer to user defined data.&lt;/p&gt;
&lt;p&gt;Let&amp;#8217;s start this new thread with the spawn method :&lt;/p&gt;
&lt;div class="codecolorer-container d railscasts"&gt;&lt;table cellpadding="0" cellspacing="0"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;div&gt;1&lt;br /&gt;2&lt;br /&gt;3&lt;br /&gt;4&lt;br /&gt;5&lt;br /&gt;6&lt;br /&gt;7&lt;br /&gt;8&lt;br /&gt;9&lt;br /&gt;10&lt;br /&gt;11&lt;br /&gt;12&lt;br /&gt;13&lt;br /&gt;14&lt;br /&gt;15&lt;br /&gt;16&lt;br /&gt;17&lt;br /&gt;18&lt;br /&gt;19&lt;br /&gt;20&lt;br /&gt;21&lt;br /&gt;22&lt;br /&gt;23&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;div class="d codecolorer"&gt;&lt;span&gt;module&lt;/span&gt; dsfml.&lt;span&gt;system&lt;/span&gt;.&lt;span&gt;thread&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span&gt;import&lt;/span&gt; std.&lt;span&gt;concurrency&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span&gt;alias&lt;/span&gt; &lt;span&gt;extern&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;C&lt;span&gt;++&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;void&lt;/span&gt;&lt;span&gt;*&lt;/span&gt; &lt;span&gt;function&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;void&lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt; EntryPoint&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span&gt;extern&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;C&lt;span&gt;++&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;void&lt;/span&gt;&lt;span&gt;*&lt;/span&gt; __dsfml_start_thread&lt;span&gt;&amp;#40;&lt;/span&gt;EntryPoint entryPoint&lt;span&gt;,&lt;/span&gt; &lt;span&gt;void&lt;/span&gt;&lt;span&gt;*&lt;/span&gt; userData&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Tid tid &lt;span&gt;=&lt;/span&gt; spawn&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;function&lt;/span&gt; &lt;span&gt;void&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;EntryPoint entryPoint&lt;span&gt;,&lt;/span&gt; shared &lt;span&gt;void&lt;/span&gt;&lt;span&gt;*&lt;/span&gt; userData&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; entryPoint&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;cast&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;void&lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt; userData&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;&amp;#125;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt; entryPoint&lt;span&gt;,&lt;/span&gt; &lt;span&gt;cast&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;shared &lt;span&gt;void&lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt; userData&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;return&lt;/span&gt; &lt;span&gt;cast&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;void&lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;&amp;#91;&lt;/span&gt;tid&lt;span&gt;&amp;#93;&lt;/span&gt;.&lt;span&gt;ptr&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;&amp;#125;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;void&lt;/span&gt; __dsfml_wait_thread&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;void&lt;/span&gt;&lt;span&gt;*&lt;/span&gt; tid&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;// TODO: This could be implemented in the future.&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;&amp;#125;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;void&lt;/span&gt; __dsfml_terminate_thread&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;void&lt;/span&gt;&lt;span&gt;*&lt;/span&gt; tid&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;// Does nothing because it is unsafe (and not provided by D API as far as my knowledge goes).&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;&amp;#125;&lt;/span&gt;&lt;br /&gt;
&lt;span&gt;&amp;#125;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;
&lt;p&gt;As you can see, we have to do a lot of casts to work around the lack of shared qualifier in C++, but required by D to share data across threads. This is due to the different memory model between D and C++.&lt;/p&gt;
&lt;h1&gt;After Words&lt;/h1&gt;
&lt;p&gt;Starting a thread the D way is required because of the way memory is managed in D2. The garbage collector has to be aware of the existence of all threads. Some data structures are also built for each thread in D to allow message passing and various other things.&lt;/p&gt;
&lt;p&gt;If we use shared with __dsfml_start_thread, the program doesn&amp;#8217;t link anymore using gdc (and frontend v2.055). This is something that should be improved to help binding C++ and D.&lt;/p&gt;
&lt;p&gt;In the same way, it is not possible to implement a C++ main because of D runtime. This is something to consider and a standard solution has to be provided by the D community in the future to help newcomers.&lt;/p&gt;
&lt;p&gt;In order to compile and link theses examples, I use g++ and gdc both version 4.6. Building .o files isn&amp;#8217;t difficult, but producing an executable at the end can be tricky. To do so, I used gdc and manually linked the C++ standard library using the switch -lstdc++ .&lt;/p&gt;
&lt;p&gt;The modified version of SFML as been compiled in static as D2 doesn&amp;#8217;t clearly define how to use shared libs at the moment.&lt;/p&gt;
&lt;p&gt;I never succeeded in compiling a working executable using g++ and adding -lgphobos2 and/or -lgdruntime .&lt;/p&gt;</content>
		<author>
			<name>deadalnix</name>
			<uri>http://www.deadalnix.me</uri>
		</author>
		<source>
			<title type="html">Deadalnix's den » D programming</title>
			<subtitle type="html">Just another WordPress site</subtitle>
			<link rel="self" href="http://www.deadalnix.me/category/software-and-devellopement/d-programming/feed/" />
			<id>http://www.deadalnix.me/category/software-and-devellopement/d-programming/feed/</id>
			<updated>2012-04-06T19:00:13+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">xfBuild Ported to D2</title>
		<link href="http://feedproxy.google.com/~r/TheOneWithD/~3/24sYaPL8hmE/" />
		<id>http://dblog.aldacron.net/?p=958</id>
		<updated>2011-11-24T12:06:35+00:00</updated>
		<content type="html">&lt;p&gt;Back when Tomasz Stachowiak was an active D&amp;#8217;er (before he ran off and got a job at &lt;a href="http://www.creative-assembly.co.uk/" target="_blank"&gt;one of my favorite game development shops&lt;/a&gt;), he created &lt;a href="https://bitbucket.org/h3r3tic/xfbuild" target="_blank"&gt;xfBuild&lt;/a&gt;, a build tool for D. It was created with D1/Tango. Now, Andrej Mitrovic has ported it to D2/Phobos and &lt;a href="https://github.com/AndrejMitrovic/xfBuild" target="_blank"&gt;slapped it up on Github&lt;/a&gt;. He insists that it&amp;#8217;s in an alpha state and you shouldn&amp;#8217;t use it on production code. I might just give it a whirl with my Dolce project. If anything blows up, I&amp;#8217;ll be sure to let him know.&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TheOneWithD?a=24sYaPL8hmE:oeNwr5-I8XM:yIl2AUoC8zA"&gt;&lt;img border="0" src="http://feeds.feedburner.com/~ff/TheOneWithD?d=yIl2AUoC8zA" /&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheOneWithD?a=24sYaPL8hmE:oeNwr5-I8XM:F7zBnMyn0Lo"&gt;&lt;img border="0" src="http://feeds.feedburner.com/~ff/TheOneWithD?i=24sYaPL8hmE:oeNwr5-I8XM:F7zBnMyn0Lo" /&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheOneWithD?a=24sYaPL8hmE:oeNwr5-I8XM:cGdyc7Q-1BI"&gt;&lt;img border="0" src="http://feeds.feedburner.com/~ff/TheOneWithD?d=cGdyc7Q-1BI" /&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img height="1" src="http://feeds.feedburner.com/~r/TheOneWithD/~4/24sYaPL8hmE" width="1" /&gt;</content>
		<author>
			<name>Aldacron</name>
			<uri>http://dblog.aldacron.net</uri>
		</author>
		<source>
			<title type="html">The One With D</title>
			<subtitle type="html">News and Opinions Regarding the D Programming Language</subtitle>
			<link rel="self" href="http://feeds.feedburner.com/TheOneWithD" />
			<id>http://feeds.feedburner.com/TheOneWithD</id>
			<updated>2012-05-21T14:00:43+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">Dolce Gets Some Love</title>
		<link href="http://www.gamedev.net/blog/1140/entry-2250969-dolce-gets-some-love/" />
		<id>http://www.gamedev.net/blog/1140/entry-2250969-dolce-gets-some-love/</id>
		<updated>2011-11-17T13:11:00+00:00</updated>
		<content type="html">Once the semester ended, I took a week to do nothing but play Dark Age of Camelot and get some much needed guitar practice in. Then I dove back in to the gym for some long overdue exercise. I also managed to pick up a few more private classes to fill some of the gaps in my schedule. Once I let off all that steam, I fired up...</content>
		<author>
			<name>D Bits</name>
			<uri>http://www.gamedev.net/blog/1140-d-bits/</uri>
		</author>
		<source>
			<title type="html">D Bits</title>
			<subtitle type="html">D Bits Syndication</subtitle>
			<link rel="self" href="http://feeds.feedburner.com/DBits" />
			<id>http://feeds.feedburner.com/DBits</id>
			<updated>2012-05-19T12:00:21+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">Einstein's Riddle solutions in D</title>
		<link href="http://leonardo-m.livejournal.com/105056.html" />
		<id>http://leonardo-m.livejournal.com/105056.html</id>
		<updated>2011-11-15T01:46:59+00:00</updated>
		<content type="html">[Update: the same text with colorized code: &lt;a href="http://www.fantascienza.net/leonardo/ar/einstein_riddle.html" rel="nofollow"&gt;http://www.fantascienza.net/leonardo/ar/einstein_riddle.html&lt;/a&gt; ]&lt;br /&gt;&lt;br /&gt;&lt;p&gt;This post is about the D translation of two old little C++ programs, to show some differences in the idioms of the two languages, and to discuss a little about static typing too.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;I have found the original C++ code in this page:&lt;br /&gt;See also: &lt;a href="http://www.weitz.de/einstein.html" rel="nofollow"&gt;http://www.weitz.de/einstein.html&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Both C++ programs solve a logic problem named "Einstein's Riddle". Here you find more info about its variants:&lt;br /&gt;&lt;a href="http://en.wikipedia.org/wiki/Zebra_Puzzle" rel="nofollow"&gt;http://en.wikipedia.org/wiki/Zebra_Puzzle&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;The original C++ versions are by Klaus Betzler and by Dr. Gabor Csanyi.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;This post is not a discussion of the Einstein's Riddle, or of algorithms that solve it. The C++ code is about ten years old, so it doesn't use some of the handy features of modern C++0x, that are sometimes comparable to D features. So this is not meant to be a fair comparison between modern C++ and modern D V.2 language.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;To compile the D code I am using DMD v.2.056 (or an alpha version of v.2.057 from GitHub).&lt;br /&gt;&lt;/p&gt;&lt;p&gt;See here for the complete C++ and D code:&lt;br /&gt;&lt;a href="http://www.fantascienza.net/leonardo/js/einstein.zip" rel="nofollow"&gt;http://www.fantascienza.net/leonardo/js/einstein.zip&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Archive contents:&lt;br /&gt;- einstein1.cpp: original first C++ (fast) solution.&lt;br /&gt;- einstein1a.d: D translation of the first C++ solution.&lt;br /&gt;- einstein2.cpp: original second C++ (slow) solution.&lt;br /&gt;- einstein2a.d: first D translation of the second C++ solution. This contains a good amount of strong static typing. This uses more idiomatic D arrays.&lt;br /&gt;- einstein2b.d: second D translation of the second C++ solution. This uses arrays that are more efficient but less idiomatic D.&lt;br /&gt;- einstein2c.py: Python2 translation of the first D translation of the second C++ solution. This program is rather slow, even counting it's in Python, I don't fully know why.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;span&gt;==========================================&lt;/span&gt;&lt;br /&gt;&lt;p&gt;Comments on the first program (einstein1.cpp and einstein1a.d):&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;pre&gt;C&amp;gt; inline unsigned long BIT(unsigned n) {return 1&amp;lt;&amp;lt;n;}&lt;br /&gt;C&amp;gt; &lt;br /&gt;C&amp;gt; const unsigned long&lt;br /&gt;C&amp;gt;   yellow = BIT(0),&lt;br /&gt;C&amp;gt;   blue = BIT(1),&lt;br /&gt;C&amp;gt;   red = BIT(2),&lt;br /&gt;C&amp;gt;   green = BIT(3),&lt;br /&gt;C&amp;gt;   white = BIT(4),&lt;br /&gt;C&amp;gt; &lt;br /&gt;C&amp;gt;   norwegian = BIT(5),&lt;br /&gt;C&amp;gt;   dane = BIT(6),&lt;br /&gt;C&amp;gt;   brit = BIT(7),&lt;br /&gt;C&amp;gt;   german = BIT(8),&lt;br /&gt;C&amp;gt;   swede = BIT(9),&lt;br /&gt;C&amp;gt; &lt;br /&gt;C&amp;gt;   water = BIT(10),&lt;br /&gt;C&amp;gt;   tea = BIT(11),&lt;br /&gt;C&amp;gt;   milk = BIT(12),&lt;br /&gt;C&amp;gt;   coffee = BIT(13),&lt;br /&gt;C&amp;gt;   beer = BIT(14),&lt;br /&gt;C&amp;gt; &lt;br /&gt;C&amp;gt;   dunhill = BIT(15),&lt;br /&gt;C&amp;gt;   marlboro = BIT(16),&lt;br /&gt;C&amp;gt;   pallmall = BIT(17),&lt;br /&gt;C&amp;gt;   rothmans = BIT(18),&lt;br /&gt;C&amp;gt;   winfield = BIT(19),&lt;br /&gt;C&amp;gt; &lt;br /&gt;C&amp;gt;   cat = BIT(20),&lt;br /&gt;C&amp;gt;   horse = BIT(21),&lt;br /&gt;C&amp;gt;   bird = BIT(22),&lt;br /&gt;C&amp;gt;   fish = BIT(23),&lt;br /&gt;C&amp;gt;   dog = BIT(24);&lt;br /&gt;C&amp;gt; &lt;br /&gt;C&amp;gt; const char * Label[] = {&lt;br /&gt;C&amp;gt;   "Yellow","Blue","Red","Green","White",&lt;br /&gt;C&amp;gt;   "Norwegian","Dane","Brit","German","Swede",&lt;br /&gt;C&amp;gt;   "Water","Tea","Milk","Coffee","Beer",&lt;br /&gt;C&amp;gt;   "Dunhill","Marlboro","Pallmall","Rothmans","Winfield",&lt;br /&gt;C&amp;gt;   "Cat","Horse","Bird","Fish","Dog"&lt;br /&gt;C&amp;gt; };&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;D&lt;span&gt;&amp;gt;&lt;/span&gt; &lt;span&gt;string&lt;/span&gt; bitFlags&lt;span&gt;(&lt;/span&gt;BaseType&lt;span&gt;=&lt;/span&gt;&lt;span&gt;uint&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;string&lt;/span&gt; enumName&lt;span&gt;,&lt;/span&gt; &lt;span&gt;string&lt;/span&gt; enumItems&lt;span&gt;)&lt;/span&gt; &lt;span&gt;{&lt;/span&gt;&lt;br /&gt;D&lt;span&gt;&amp;gt;&lt;/span&gt;     &lt;span&gt;string&lt;/span&gt; result &lt;span&gt;=&lt;/span&gt; text&lt;span&gt;(&lt;/span&gt;&lt;span&gt;"enum "&lt;/span&gt;&lt;span&gt;,&lt;/span&gt; enumName&lt;span&gt;,&lt;/span&gt; &lt;span&gt;"&amp;nbsp;: "&lt;/span&gt;&lt;span&gt;,&lt;/span&gt; BaseType.&lt;span&gt;stringof&lt;/span&gt;&lt;span&gt;,&lt;/span&gt; &lt;span&gt;" {&lt;span&gt;\n&lt;/span&gt;"&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;D&lt;span&gt;&amp;gt;&lt;/span&gt;     result &lt;span&gt;~=&lt;/span&gt; text&lt;span&gt;(&lt;/span&gt;&lt;span&gt;"    None = 0,&lt;span&gt;\n&lt;/span&gt;"&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;D&lt;span&gt;&amp;gt;&lt;/span&gt;     &lt;span&gt;foreach&lt;/span&gt; &lt;span&gt;(&lt;/span&gt;i&lt;span&gt;,&lt;/span&gt; flag&lt;span&gt;;&lt;/span&gt; enumItems.&lt;span&gt;split&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;br /&gt;D&lt;span&gt;&amp;gt;&lt;/span&gt;         result &lt;span&gt;~=&lt;/span&gt; text&lt;span&gt;(&lt;/span&gt;&lt;span&gt;"    "&lt;/span&gt;&lt;span&gt;,&lt;/span&gt; flag&lt;span&gt;,&lt;/span&gt; &lt;span&gt;" = (1 &amp;lt;&amp;lt; "&lt;/span&gt;&lt;span&gt;,&lt;/span&gt; i&lt;span&gt;,&lt;/span&gt; &lt;span&gt;"),&lt;span&gt;\n&lt;/span&gt;"&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;D&lt;span&gt;&amp;gt;&lt;/span&gt;     &lt;span&gt;return&lt;/span&gt; result &lt;span&gt;~&lt;/span&gt; &lt;span&gt;"}"&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;D&lt;span&gt;&amp;gt;&lt;/span&gt; &lt;span&gt;}&lt;/span&gt;&lt;br /&gt;D&lt;span&gt;&amp;gt;&lt;/span&gt; &lt;br /&gt;D&lt;span&gt;&amp;gt;&lt;/span&gt; &lt;span&gt;mixin&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;bitFlags&lt;span&gt;!&lt;/span&gt;&lt;span&gt;uint&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;"E"&lt;/span&gt;&lt;span&gt;,&lt;/span&gt; &lt;span&gt;"&lt;br /&gt;D&amp;gt; Yellow    Blue     Red      Green    White&lt;br /&gt;D&amp;gt; Norwegian Dane     Brit     German   Swede&lt;br /&gt;D&amp;gt; Water     Tea      Milk     Coffee   Beer&lt;br /&gt;D&amp;gt; Dunhill   Marlboro Pallmall Rothmans Winfield&lt;br /&gt;D&amp;gt; Cat       Horse    Bird     Fish     Dog"&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
&lt;/pre&gt;The D version uses named enums, so D writeln is able to print their names, this avoids the need of the Label array. A simplified bitFlags compile-time function allows to create a simple enumeration of bit flags.&lt;br /&gt;&lt;p&gt;----------------------------------------------&lt;br /&gt;&lt;/p&gt;&lt;pre&gt;C&amp;gt; const unsigned long color = yellow+blue+red+green+white;&lt;br /&gt;C&amp;gt; const unsigned long country = norwegian+dane+brit+german+swede;&lt;br /&gt;C&amp;gt; const unsigned long drink = water+tea+milk+coffee+beer;&lt;br /&gt;C&amp;gt; const unsigned long cigar = dunhill+marlboro+pallmall+rothmans+winfield;&lt;br /&gt;C&amp;gt; const unsigned long animal = cat+horse+bird+fish+dog;&lt;br /&gt;C&amp;gt; &lt;br /&gt;C&amp;gt; unsigned long house[5] = {norwegian,blue,milk,0,0};  // rules 8,9,14&lt;br /&gt;C&amp;gt; unsigned long result[5];&lt;br /&gt;C&amp;gt; &lt;br /&gt;C&amp;gt; const unsigned long comb[] = { // simple rules&lt;br /&gt;C&amp;gt;   brit+red,                    // 1&lt;br /&gt;C&amp;gt;   swede+dog,                   // 2&lt;br /&gt;C&amp;gt;   dane+tea,                    // 3&lt;br /&gt;C&amp;gt;   green+coffee,                // 5&lt;br /&gt;C&amp;gt;   pallmall+bird,               // 6&lt;br /&gt;C&amp;gt;   yellow+dunhill,              // 7&lt;br /&gt;C&amp;gt;   winfield+beer,               // 12&lt;br /&gt;C&amp;gt;   german+rothmans              // 13&lt;br /&gt;C&amp;gt; };&lt;br /&gt;C&amp;gt; &lt;br /&gt;C&amp;gt; const unsigned long combmask[] = { // corresponding selection masks&lt;br /&gt;C&amp;gt;   country+color,&lt;br /&gt;C&amp;gt;   country+animal,&lt;br /&gt;C&amp;gt;   country+drink,&lt;br /&gt;C&amp;gt;   color+drink,&lt;br /&gt;C&amp;gt;   cigar+animal,&lt;br /&gt;C&amp;gt;   color+cigar,&lt;br /&gt;C&amp;gt;   cigar+drink,&lt;br /&gt;C&amp;gt;   country+cigar&lt;br /&gt;C&amp;gt; };
&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;D&lt;span&gt;&amp;gt;&lt;/span&gt; &lt;span&gt;enum&lt;/span&gt; E color &lt;span&gt;=&lt;/span&gt;   E.&lt;span&gt;Yellow&lt;/span&gt;    &lt;span&gt;|&lt;/span&gt; E.&lt;span&gt;Blue&lt;/span&gt;     &lt;span&gt;|&lt;/span&gt; E.&lt;span&gt;Red&lt;/span&gt;      &lt;span&gt;|&lt;/span&gt; E.&lt;span&gt;Green&lt;/span&gt;    &lt;span&gt;|&lt;/span&gt; E.&lt;span&gt;White&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;D&lt;span&gt;&amp;gt;&lt;/span&gt; &lt;span&gt;enum&lt;/span&gt; E country &lt;span&gt;=&lt;/span&gt; E.&lt;span&gt;Norwegian&lt;/span&gt; &lt;span&gt;|&lt;/span&gt; E.&lt;span&gt;Dane&lt;/span&gt;     &lt;span&gt;|&lt;/span&gt; E.&lt;span&gt;Brit&lt;/span&gt;     &lt;span&gt;|&lt;/span&gt; E.&lt;span&gt;German&lt;/span&gt;   &lt;span&gt;|&lt;/span&gt; E.&lt;span&gt;Swede&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;D&lt;span&gt;&amp;gt;&lt;/span&gt; &lt;span&gt;enum&lt;/span&gt; E drink &lt;span&gt;=&lt;/span&gt;   E.&lt;span&gt;Water&lt;/span&gt;     &lt;span&gt;|&lt;/span&gt; E.&lt;span&gt;Tea&lt;/span&gt;      &lt;span&gt;|&lt;/span&gt; E.&lt;span&gt;Milk&lt;/span&gt;     &lt;span&gt;|&lt;/span&gt; E.&lt;span&gt;Coffee&lt;/span&gt;   &lt;span&gt;|&lt;/span&gt; E.&lt;span&gt;Beer&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;D&lt;span&gt;&amp;gt;&lt;/span&gt; &lt;span&gt;enum&lt;/span&gt; E cigar &lt;span&gt;=&lt;/span&gt;   E.&lt;span&gt;Dunhill&lt;/span&gt;   &lt;span&gt;|&lt;/span&gt; E.&lt;span&gt;Marlboro&lt;/span&gt; &lt;span&gt;|&lt;/span&gt; E.&lt;span&gt;Pallmall&lt;/span&gt; &lt;span&gt;|&lt;/span&gt; E.&lt;span&gt;Rothmans&lt;/span&gt; &lt;span&gt;|&lt;/span&gt; E.&lt;span&gt;Winfield&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;D&lt;span&gt;&amp;gt;&lt;/span&gt; &lt;span&gt;enum&lt;/span&gt; E animal &lt;span&gt;=&lt;/span&gt;  E.&lt;span&gt;Cat&lt;/span&gt;       &lt;span&gt;|&lt;/span&gt; E.&lt;span&gt;Horse&lt;/span&gt;    &lt;span&gt;|&lt;/span&gt; E.&lt;span&gt;Bird&lt;/span&gt;     &lt;span&gt;|&lt;/span&gt; E.&lt;span&gt;Fish&lt;/span&gt;     &lt;span&gt;|&lt;/span&gt; E.&lt;span&gt;Dog&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;D&lt;span&gt;&amp;gt;&lt;/span&gt; &lt;br /&gt;D&lt;span&gt;&amp;gt;&lt;/span&gt; &lt;span&gt;immutable&lt;/span&gt; E&lt;span&gt;[&lt;/span&gt;&lt;span&gt;]&lt;/span&gt; comb &lt;span&gt;=&lt;/span&gt; &lt;span&gt;[&lt;/span&gt; &lt;span&gt;// simple rules&lt;/span&gt;&lt;br /&gt;D&lt;span&gt;&amp;gt;&lt;/span&gt;     E.&lt;span&gt;Brit&lt;/span&gt;     &lt;span&gt;|&lt;/span&gt; E.&lt;span&gt;Red&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;     &lt;span&gt;// 1&lt;/span&gt;&lt;br /&gt;D&lt;span&gt;&amp;gt;&lt;/span&gt;     E.&lt;span&gt;Swede&lt;/span&gt;    &lt;span&gt;|&lt;/span&gt; E.&lt;span&gt;Dog&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;     &lt;span&gt;// 2&lt;/span&gt;&lt;br /&gt;D&lt;span&gt;&amp;gt;&lt;/span&gt;     E.&lt;span&gt;Dane&lt;/span&gt;     &lt;span&gt;|&lt;/span&gt; E.&lt;span&gt;Tea&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;     &lt;span&gt;// 3&lt;/span&gt;&lt;br /&gt;D&lt;span&gt;&amp;gt;&lt;/span&gt;     E.&lt;span&gt;Green&lt;/span&gt;    &lt;span&gt;|&lt;/span&gt; E.&lt;span&gt;Coffee&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;  &lt;span&gt;// 5&lt;/span&gt;&lt;br /&gt;D&lt;span&gt;&amp;gt;&lt;/span&gt;     E.&lt;span&gt;Pallmall&lt;/span&gt; &lt;span&gt;|&lt;/span&gt; E.&lt;span&gt;Bird&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;    &lt;span&gt;// 6&lt;/span&gt;&lt;br /&gt;D&lt;span&gt;&amp;gt;&lt;/span&gt;     E.&lt;span&gt;Yellow&lt;/span&gt;   &lt;span&gt;|&lt;/span&gt; E.&lt;span&gt;Dunhill&lt;/span&gt;&lt;span&gt;,&lt;/span&gt; &lt;span&gt;// 7&lt;/span&gt;&lt;br /&gt;D&lt;span&gt;&amp;gt;&lt;/span&gt;     E.&lt;span&gt;Winfield&lt;/span&gt; &lt;span&gt;|&lt;/span&gt; E.&lt;span&gt;Beer&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;    &lt;span&gt;// 12&lt;/span&gt;&lt;br /&gt;D&lt;span&gt;&amp;gt;&lt;/span&gt;     E.&lt;span&gt;German&lt;/span&gt;   &lt;span&gt;|&lt;/span&gt; E.&lt;span&gt;Rothmans&lt;/span&gt; &lt;span&gt;// 13&lt;/span&gt;&lt;br /&gt;D&lt;span&gt;&amp;gt;&lt;/span&gt; &lt;span&gt;]&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;D&lt;span&gt;&amp;gt;&lt;/span&gt; &lt;br /&gt;D&lt;span&gt;&amp;gt;&lt;/span&gt; &lt;span&gt;immutable&lt;/span&gt; E&lt;span&gt;[&lt;/span&gt;&lt;span&gt;]&lt;/span&gt; combMask &lt;span&gt;=&lt;/span&gt; &lt;span&gt;[&lt;/span&gt; &lt;span&gt;// corresponding selection masks&lt;/span&gt;&lt;br /&gt;D&lt;span&gt;&amp;gt;&lt;/span&gt;     country &lt;span&gt;|&lt;/span&gt; color&lt;span&gt;,&lt;/span&gt;&lt;br /&gt;D&lt;span&gt;&amp;gt;&lt;/span&gt;     country &lt;span&gt;|&lt;/span&gt; animal&lt;span&gt;,&lt;/span&gt;&lt;br /&gt;D&lt;span&gt;&amp;gt;&lt;/span&gt;     country &lt;span&gt;|&lt;/span&gt; drink&lt;span&gt;,&lt;/span&gt;&lt;br /&gt;D&lt;span&gt;&amp;gt;&lt;/span&gt;     color   &lt;span&gt;|&lt;/span&gt; drink&lt;span&gt;,&lt;/span&gt;&lt;br /&gt;D&lt;span&gt;&amp;gt;&lt;/span&gt;     cigar   &lt;span&gt;|&lt;/span&gt; animal&lt;span&gt;,&lt;/span&gt;&lt;br /&gt;D&lt;span&gt;&amp;gt;&lt;/span&gt;     color   &lt;span&gt;|&lt;/span&gt; cigar&lt;span&gt;,&lt;/span&gt;&lt;br /&gt;D&lt;span&gt;&amp;gt;&lt;/span&gt;     cigar   &lt;span&gt;|&lt;/span&gt; drink&lt;span&gt;,&lt;/span&gt;&lt;br /&gt;D&lt;span&gt;&amp;gt;&lt;/span&gt;     country &lt;span&gt;|&lt;/span&gt; cigar&lt;br /&gt;D&lt;span&gt;&amp;gt;&lt;/span&gt; &lt;span&gt;]&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;The D version uses | (or) instead of +, for better clarity. comb and combMask are not enums for more efficiency.&lt;/p&gt;&lt;pre&gt;D&lt;span&gt;&amp;gt;&lt;/span&gt; &lt;span&gt;int&lt;/span&gt; main&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt; &lt;span&gt;{&lt;/span&gt;&lt;br /&gt;D&lt;span&gt;&amp;gt;&lt;/span&gt;     E&lt;span&gt;[&lt;/span&gt;&lt;span&gt;5&lt;/span&gt;&lt;span&gt;]&lt;/span&gt; house &lt;span&gt;=&lt;/span&gt; &lt;span&gt;[&lt;/span&gt;E.&lt;span&gt;Norwegian&lt;/span&gt;&lt;span&gt;,&lt;/span&gt; E.&lt;span&gt;Blue&lt;/span&gt;&lt;span&gt;,&lt;/span&gt; E.&lt;span&gt;Milk&lt;/span&gt;&lt;span&gt;,&lt;/span&gt; E.&lt;span&gt;None&lt;/span&gt;&lt;span&gt;,&lt;/span&gt; E.&lt;span&gt;None&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;;&lt;/span&gt; &lt;span&gt;// rules 8, 9, 14&lt;/span&gt;&lt;br /&gt;D&lt;span&gt;&amp;gt;&lt;/span&gt;     E&lt;span&gt;[&lt;/span&gt;&lt;span&gt;5&lt;/span&gt;&lt;span&gt;]&lt;/span&gt; result&lt;span&gt;;&lt;/span&gt;&lt;/pre&gt;The D code defines 'house' and 'result' inside the main(), this avoids global mutable variables. 'house' is needed as argument by most functions, but the overall performance of the program is about unchanged.&lt;br /&gt;&lt;p&gt;'house' is an array of E enums, that are strongly typed, so I have had to add E.None, that is represented with 0.&lt;br /&gt;&lt;/p&gt;&lt;h6&gt; &lt;span&gt;==========================================&lt;/span&gt;&lt;/h6&gt;&lt;p&gt;Comments on the second program (einstein2.cpp and einstein2a.d):&lt;br /&gt;&lt;/p&gt;&lt;pre&gt;C&amp;gt; char *NationS[] = {"British", "Swedish", "Danish", "Norvegian", "German"};&lt;br /&gt;C&amp;gt; enum Nation {British, Swedish, Danish, Norvegian, German};&lt;br /&gt;C&amp;gt; char *NumberS[] = {"One", "Two", "Three", "Four", "Five"};&lt;br /&gt;C&amp;gt; enum Number {One, Two, Three, Four, Five};&lt;br /&gt;C&amp;gt; char *ColourS[] = {"Red", "Green", "Blue", "White", "Yellow"};&lt;br /&gt;C&amp;gt; enum Colour {Red, Green, Blue, White, Yellow};&lt;br /&gt;C&amp;gt; char *DrinkS[] = {"Milk", "Coffee", "Water", "Beer", "Tea"};&lt;br /&gt;C&amp;gt; enum Drink {Milk, Coffee, Water, Beer, Tea};&lt;br /&gt;C&amp;gt; char *SmokeS[] = {"PallMall", "Dunhill", "Blend", "BlueMaster", "Prince"};&lt;br /&gt;C&amp;gt; enum Smoke {PallMall, Dunhill, Blend, BlueMaster, Prince};&lt;br /&gt;C&amp;gt; char *PetS[] = {"Dog", "Cat", "Fish", "Horse", "Bird"};&lt;br /&gt;C&amp;gt; enum Pet {Dog, Cat, Fish, Horse, Bird};&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;D&lt;span&gt;&amp;gt;&lt;/span&gt; &lt;span&gt;enum&lt;/span&gt; Number &lt;span&gt;:&lt;/span&gt; &lt;span&gt;ubyte&lt;/span&gt; &lt;span&gt;{&lt;/span&gt; One&lt;span&gt;,&lt;/span&gt;      Two&lt;span&gt;,&lt;/span&gt;     Three&lt;span&gt;,&lt;/span&gt;  Four&lt;span&gt;,&lt;/span&gt;       Five   &lt;span&gt;}&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;D&lt;span&gt;&amp;gt;&lt;/span&gt; &lt;span&gt;enum&lt;/span&gt; Color  &lt;span&gt;:&lt;/span&gt; &lt;span&gt;ubyte&lt;/span&gt; &lt;span&gt;{&lt;/span&gt; Red&lt;span&gt;,&lt;/span&gt;      Green&lt;span&gt;,&lt;/span&gt;   Blue&lt;span&gt;,&lt;/span&gt;   White&lt;span&gt;,&lt;/span&gt;      Yellow &lt;span&gt;}&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;D&lt;span&gt;&amp;gt;&lt;/span&gt; &lt;span&gt;enum&lt;/span&gt; Drink  &lt;span&gt;:&lt;/span&gt; &lt;span&gt;ubyte&lt;/span&gt; &lt;span&gt;{&lt;/span&gt; Milk&lt;span&gt;,&lt;/span&gt;     Coffee&lt;span&gt;,&lt;/span&gt;  Water&lt;span&gt;,&lt;/span&gt;  Beer&lt;span&gt;,&lt;/span&gt;       Tea    &lt;span&gt;}&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;D&lt;span&gt;&amp;gt;&lt;/span&gt; &lt;span&gt;enum&lt;/span&gt; Smoke  &lt;span&gt;:&lt;/span&gt; &lt;span&gt;ubyte&lt;/span&gt; &lt;span&gt;{&lt;/span&gt; PallMall&lt;span&gt;,&lt;/span&gt; Dunhill&lt;span&gt;,&lt;/span&gt; Blend&lt;span&gt;,&lt;/span&gt;  BlueMaster&lt;span&gt;,&lt;/span&gt; Prince &lt;span&gt;}&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;D&lt;span&gt;&amp;gt;&lt;/span&gt; &lt;span&gt;enum&lt;/span&gt; Pet    &lt;span&gt;:&lt;/span&gt; &lt;span&gt;ubyte&lt;/span&gt; &lt;span&gt;{&lt;/span&gt; Dog&lt;span&gt;,&lt;/span&gt;      Cat&lt;span&gt;,&lt;/span&gt;     Fish&lt;span&gt;,&lt;/span&gt;   Horse&lt;span&gt;,&lt;/span&gt;      Bird   &lt;span&gt;}&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;D&lt;span&gt;&amp;gt;&lt;/span&gt; &lt;span&gt;enum&lt;/span&gt; Nation &lt;span&gt;:&lt;/span&gt; &lt;span&gt;ubyte&lt;/span&gt; &lt;span&gt;{&lt;/span&gt; British&lt;span&gt;,&lt;/span&gt;  Swedish&lt;span&gt;,&lt;/span&gt; Danish&lt;span&gt;,&lt;/span&gt; Norvegian&lt;span&gt;,&lt;/span&gt;  German &lt;span&gt;}&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
&lt;/pre&gt;In D enums are almost strongly typed, but not as strongly as C++0x "enum class" enumerations:&lt;br /&gt;&lt;p&gt;&lt;a href="http://en.wikipedia.org/wiki/C%2B%2B0x#Strongly_typed_enumerations" rel="nofollow"&gt;http://en.wikipedia.org/wiki/C%2B%2B0x#Strongly_typed_enumerations&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;In D writeln is able to print the name of named enums, so the arrays like PetS are not necessary. In D unsigned bytes are named "ubyte".&lt;br /&gt;&lt;/p&gt;&lt;p&gt;----------------------------------------------&lt;br /&gt;&lt;/p&gt;&lt;pre&gt;C&amp;gt; void&lt;br /&gt;C&amp;gt; myprint(char *ptr, char **s)&lt;br /&gt;C&amp;gt; {&lt;br /&gt;C&amp;gt;   printf("%12s%12s%12s%12s%12s\n", s[ptr[0]], s[ptr[1]], s[ptr[2]], s[ptr[3]], s[ptr[4]]);&lt;br /&gt;C&amp;gt; }&lt;br /&gt;...&lt;br /&gt;C&amp;gt; main()&lt;br /&gt;C&amp;gt; {&lt;br /&gt;...&lt;br /&gt;C&amp;gt; 		      // woo-hoo!&lt;br /&gt;C&amp;gt; 		      printf("Found a solution:\n");&lt;br /&gt;C&amp;gt; 		      printf("Nation: ");&lt;br /&gt;C&amp;gt; 		      myprint(nation, NationS);&lt;br /&gt;C&amp;gt; 		      printf("Number: ");&lt;br /&gt;C&amp;gt; 		      myprint(number, NumberS);&lt;br /&gt;C&amp;gt; 		      printf("Colour: ");&lt;br /&gt;C&amp;gt; 		      myprint(colour, ColourS);&lt;br /&gt;C&amp;gt; 		      printf("Drink&amp;nbsp;: ");&lt;br /&gt;C&amp;gt; 		      myprint(drink, DrinkS);&lt;br /&gt;C&amp;gt; 		      printf("Smoke&amp;nbsp;: ");&lt;br /&gt;C&amp;gt; 		      myprint(smoke, SmokeS);&lt;br /&gt;C&amp;gt; 		      printf("Pet  &amp;nbsp;: ");&lt;br /&gt;C&amp;gt; 		      myprint(pet, PetS);&lt;br /&gt;C&amp;gt; 		      printf("\n");&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;D&lt;span&gt;&amp;gt;&lt;/span&gt; &lt;span&gt;void&lt;/span&gt; showRow&lt;span&gt;(&lt;/span&gt;E&lt;span&gt;)&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;in&lt;/span&gt; E&lt;span&gt;[&lt;/span&gt;&lt;span&gt;]&lt;/span&gt; data&lt;span&gt;)&lt;/span&gt; &lt;span&gt;{&lt;/span&gt;&lt;br /&gt;D&lt;span&gt;&amp;gt;&lt;/span&gt;     &lt;span&gt;auto&lt;/span&gt; names &lt;span&gt;=&lt;/span&gt; &lt;span&gt;[&lt;/span&gt;EnumMembers&lt;span&gt;!&lt;/span&gt;E&lt;span&gt;]&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;D&lt;span&gt;&amp;gt;&lt;/span&gt;     writefln&lt;span&gt;(&lt;/span&gt;&lt;span&gt;"%6s:&amp;nbsp;%12s%12s%12s%12s%12s"&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;br /&gt;D&lt;span&gt;&amp;gt;&lt;/span&gt;              &lt;span&gt;(&lt;/span&gt;Unqual&lt;span&gt;!&lt;/span&gt;E&lt;span&gt;)&lt;/span&gt;.&lt;span&gt;stringof&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;br /&gt;D&lt;span&gt;&amp;gt;&lt;/span&gt;              text&lt;span&gt;(&lt;/span&gt;names&lt;span&gt;[&lt;/span&gt;data&lt;span&gt;[&lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;,&lt;/span&gt; text&lt;span&gt;(&lt;/span&gt;names&lt;span&gt;[&lt;/span&gt;data&lt;span&gt;[&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;br /&gt;D&lt;span&gt;&amp;gt;&lt;/span&gt;              text&lt;span&gt;(&lt;/span&gt;names&lt;span&gt;[&lt;/span&gt;data&lt;span&gt;[&lt;/span&gt;&lt;span&gt;2&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;,&lt;/span&gt; text&lt;span&gt;(&lt;/span&gt;names&lt;span&gt;[&lt;/span&gt;data&lt;span&gt;[&lt;/span&gt;&lt;span&gt;3&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;br /&gt;D&lt;span&gt;&amp;gt;&lt;/span&gt;              text&lt;span&gt;(&lt;/span&gt;names&lt;span&gt;[&lt;/span&gt;data&lt;span&gt;[&lt;/span&gt;&lt;span&gt;4&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;D&lt;span&gt;&amp;gt;&lt;/span&gt; &lt;span&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span&gt;...&lt;/span&gt;&lt;br /&gt;&lt;span&gt;D&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt; &lt;span&gt;void&lt;/span&gt; main&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt; &lt;span&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span&gt;...&lt;/span&gt;&lt;br /&gt;&lt;span&gt;D&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;                                             writeln&lt;span&gt;(&lt;/span&gt;&lt;span&gt;"Found a solution:"&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;D&lt;span&gt;&amp;gt;&lt;/span&gt;                                             showRow&lt;span&gt;(&lt;/span&gt;nation&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;D&lt;span&gt;&amp;gt;&lt;/span&gt;                                             showRow&lt;span&gt;(&lt;/span&gt;number&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;D&lt;span&gt;&amp;gt;&lt;/span&gt;                                             showRow&lt;span&gt;(&lt;/span&gt;color&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;D&lt;span&gt;&amp;gt;&lt;/span&gt;                                             showRow&lt;span&gt;(&lt;/span&gt;drink&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;D&lt;span&gt;&amp;gt;&lt;/span&gt;                                             showRow&lt;span&gt;(&lt;/span&gt;smoke&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;D&lt;span&gt;&amp;gt;&lt;/span&gt;                                             showRow&lt;span&gt;(&lt;/span&gt;pet&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;D&lt;span&gt;&amp;gt;&lt;/span&gt;                                             writeln&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;D&lt;span&gt;&amp;gt;&lt;/span&gt;                                         &lt;span&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;D here is doing more at compile-time. The printing template function showRow is able to find the names of the enums and of their elements.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;text() is used because formats like "%12s" are not yet supported (DMD 2.056) for enum members.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;----------------------------------------------&lt;br /&gt;&lt;/p&gt;&lt;pre&gt;C&amp;gt; char perms[][5] = {&lt;br /&gt;C&amp;gt;   {     4,     3,     2,     1,     0},&lt;br /&gt;C&amp;gt;   {     3,     4,     2,     1,     0},&lt;br /&gt;C&amp;gt;   {     4,     2,     3,     1,     0},&lt;br /&gt;C&amp;gt;   {     2,     4,     3,     1,     0},&lt;br /&gt;C&amp;gt;   {     3,     2,     4,     1,     0},&lt;br /&gt;C&amp;gt;   {     2,     3,     4,     1,     0},&lt;br /&gt;C&amp;gt;   {     4,     3,     1,     2,     0},&lt;br /&gt;C&amp;gt;   {     3,     4,     1,     2,     0},&lt;br /&gt;C&amp;gt;   {     4,     1,     3,     2,     0},&lt;br /&gt;C&amp;gt;   {     1,     4,     3,     2,     0},&lt;br /&gt;C&amp;gt;   {     3,     1,     4,     2,     0},&lt;br /&gt;C&amp;gt;   {     1,     3,     4,     2,     0},&lt;br /&gt;C&amp;gt;   {     4,     2,     1,     3,     0},&lt;br /&gt;C&amp;gt;   {     2,     4,     1,     3,     0},&lt;br /&gt;C&amp;gt;   {     4,     1,     2,     3,     0},&lt;br /&gt;C&amp;gt;   {     1,     4,     2,     3,     0},&lt;br /&gt;C&amp;gt;   {     2,     1,     4,     3,     0},&lt;br /&gt;C&amp;gt;   {     1,     2,     4,     3,     0},&lt;br /&gt;C&amp;gt;   {     3,     2,     1,     4,     0},&lt;br /&gt;C&amp;gt;   {     2,     3,     1,     4,     0},&lt;br /&gt;C&amp;gt;   {     3,     1,     2,     4,     0},&lt;br /&gt;C&amp;gt;   {     1,     3,     2,     4,     0},&lt;br /&gt;C&amp;gt;   {     2,     1,     3,     4,     0},&lt;br /&gt;C&amp;gt;   {     1,     2,     3,     4,     0},&lt;br /&gt;C&amp;gt;   {     4,     3,     2,     0,     1},&lt;br /&gt;C&amp;gt;   {     3,     4,     2,     0,     1},&lt;br /&gt;C&amp;gt;   {     4,     2,     3,     0,     1},&lt;br /&gt;C&amp;gt;   {     2,     4,     3,     0,     1},&lt;br /&gt;C&amp;gt;   {     3,     2,     4,     0,     1},&lt;br /&gt;C&amp;gt;   {     2,     3,     4,     0,     1},&lt;br /&gt;C&amp;gt;   {     4,     3,     0,     2,     1},&lt;br /&gt;C&amp;gt;   {     3,     4,     0,     2,     1},&lt;br /&gt;C&amp;gt;   {     4,     0,     3,     2,     1},&lt;br /&gt;C&amp;gt;   {     0,     4,     3,     2,     1},&lt;br /&gt;C&amp;gt;   {     3,     0,     4,     2,     1},&lt;br /&gt;C&amp;gt;   {     0,     3,     4,     2,     1},&lt;br /&gt;C&amp;gt;   {     4,     2,     0,     3,     1},&lt;br /&gt;C&amp;gt;   {     2,     4,     0,     3,     1},&lt;br /&gt;C&amp;gt;   {     4,     0,     2,     3,     1},&lt;br /&gt;C&amp;gt;   {     0,     4,     2,     3,     1},&lt;br /&gt;C&amp;gt;   {     2,     0,     4,     3,     1},&lt;br /&gt;C&amp;gt;   {     0,     2,     4,     3,     1},&lt;br /&gt;C&amp;gt;   {     3,     2,     0,     4,     1},&lt;br /&gt;C&amp;gt;   {     2,     3,     0,     4,     1},&lt;br /&gt;C&amp;gt;   {     3,     0,     2,     4,     1},&lt;br /&gt;C&amp;gt;   {     0,     3,     2,     4,     1},&lt;br /&gt;C&amp;gt;   {     2,     0,     3,     4,     1},&lt;br /&gt;C&amp;gt;   {     0,     2,     3,     4,     1},&lt;br /&gt;C&amp;gt;   {     4,     3,     1,     0,     2},&lt;br /&gt;C&amp;gt;   {     3,     4,     1,     0,     2},&lt;br /&gt;C&amp;gt;   {     4,     1,     3,     0,     2},&lt;br /&gt;C&amp;gt;   {     1,     4,     3,     0,     2},&lt;br /&gt;C&amp;gt;   {     3,     1,     4,     0,     2},&lt;br /&gt;C&amp;gt;   {     1,     3,     4,     0,     2},&lt;br /&gt;C&amp;gt;   {     4,     3,     0,     1,     2},&lt;br /&gt;C&amp;gt;   {     3,     4,     0,     1,     2},&lt;br /&gt;C&amp;gt;   {     4,     0,     3,     1,     2},&lt;br /&gt;C&amp;gt;   {     0,     4,     3,     1,     2},&lt;br /&gt;C&amp;gt;   {     3,     0,     4,     1,     2},&lt;br /&gt;C&amp;gt;   {     0,     3,     4,     1,     2},&lt;br /&gt;C&amp;gt;   {     4,     1,     0,     3,     2},&lt;br /&gt;C&amp;gt;   {     1,     4,     0,     3,     2},&lt;br /&gt;C&amp;gt;   {     4,     0,     1,     3,     2},&lt;br /&gt;C&amp;gt;   {     0,     4,     1,     3,     2},&lt;br /&gt;C&amp;gt;   {     1,     0,     4,     3,     2},&lt;br /&gt;C&amp;gt;   {     0,     1,     4,     3,     2},&lt;br /&gt;C&amp;gt;   {     3,     1,     0,     4,     2},&lt;br /&gt;C&amp;gt;   {     1,     3,     0,     4,     2},&lt;br /&gt;C&amp;gt;   {     3,     0,     1,     4,     2},&lt;br /&gt;C&amp;gt;   {     0,     3,     1,     4,     2},&lt;br /&gt;C&amp;gt;   {     1,     0,     3,     4,     2},&lt;br /&gt;C&amp;gt;   {     0,     1,     3,     4,     2},&lt;br /&gt;C&amp;gt;   {     4,     2,     1,     0,     3},&lt;br /&gt;C&amp;gt;   {     2,     4,     1,     0,     3},&lt;br /&gt;C&amp;gt;   {     4,     1,     2,     0,     3},&lt;br /&gt;C&amp;gt;   {     1,     4,     2,     0,     3},&lt;br /&gt;C&amp;gt;   {     2,     1,     4,     0,     3},&lt;br /&gt;C&amp;gt;   {     1,     2,     4,     0,     3},&lt;br /&gt;C&amp;gt;   {     4,     2,     0,     1,     3},&lt;br /&gt;C&amp;gt;   {     2,     4,     0,     1,     3},&lt;br /&gt;C&amp;gt;   {     4,     0,     2,     1,     3},&lt;br /&gt;C&amp;gt;   {     0,     4,     2,     1,     3},&lt;br /&gt;C&amp;gt;   {     2,     0,     4,     1,     3},&lt;br /&gt;C&amp;gt;   {     0,     2,     4,     1,     3},&lt;br /&gt;C&amp;gt;   {     4,     1,     0,     2,     3},&lt;br /&gt;C&amp;gt;   {     1,     4,     0,     2,     3},&lt;br /&gt;C&amp;gt;   {     4,     0,     1,     2,     3},&lt;br /&gt;C&amp;gt;   {     0,     4,     1,     2,     3},&lt;br /&gt;C&amp;gt;   {     1,     0,     4,     2,     3},&lt;br /&gt;C&amp;gt;   {     0,     1,     4,     2,     3},&lt;br /&gt;C&amp;gt;   {     2,     1,     0,     4,     3},&lt;br /&gt;C&amp;gt;   {     1,     2,     0,     4,     3},&lt;br /&gt;C&amp;gt;   {     2,     0,     1,     4,     3},&lt;br /&gt;C&amp;gt;   {     0,     2,     1,     4,     3},&lt;br /&gt;C&amp;gt;   {     1,     0,     2,     4,     3},&lt;br /&gt;C&amp;gt;   {     0,     1,     2,     4,     3},&lt;br /&gt;C&amp;gt;   {     3,     2,     1,     0,     4},&lt;br /&gt;C&amp;gt;   {     2,     3,     1,     0,     4},&lt;br /&gt;C&amp;gt;   {     3,     1,     2,     0,     4},&lt;br /&gt;C&amp;gt;   {     1,     3,     2,     0,     4},&lt;br /&gt;C&amp;gt;   {     2,     1,     3,     0,     4},&lt;br /&gt;C&amp;gt;   {     1,     2,     3,     0,     4},&lt;br /&gt;C&amp;gt;   {     3,     2,     0,     1,     4},&lt;br /&gt;C&amp;gt;   {     2,     3,     0,     1,     4},&lt;br /&gt;C&amp;gt;   {     3,     0,     2,     1,     4},&lt;br /&gt;C&amp;gt;   {     0,     3,     2,     1,     4},&lt;br /&gt;C&amp;gt;   {     2,     0,     3,     1,     4},&lt;br /&gt;C&amp;gt;   {     0,     2,     3,     1,     4},&lt;br /&gt;C&amp;gt;   {     3,     1,     0,     2,     4},&lt;br /&gt;C&amp;gt;   {     1,     3,     0,     2,     4},&lt;br /&gt;C&amp;gt;   {     3,     0,     1,     2,     4},&lt;br /&gt;C&amp;gt;   {     0,     3,     1,     2,     4},&lt;br /&gt;C&amp;gt;   {     1,     0,     3,     2,     4},&lt;br /&gt;C&amp;gt;   {     0,     1,     3,     2,     4},&lt;br /&gt;C&amp;gt;   {     2,     1,     0,     3,     4},&lt;br /&gt;C&amp;gt;   {     1,     2,     0,     3,     4},&lt;br /&gt;C&amp;gt;   {     2,     0,     1,     3,     4},&lt;br /&gt;C&amp;gt;   {     0,     2,     1,     3,     4},&lt;br /&gt;C&amp;gt;   {     1,     0,     2,     3,     4},&lt;br /&gt;C&amp;gt;   {     0,     1,     2,     3,     4}&lt;br /&gt;C&amp;gt; };&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;D&lt;span&gt;&amp;gt;&lt;/span&gt; &lt;span&gt;const&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;T&lt;span&gt;[&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;)&lt;/span&gt; permutations&lt;span&gt;(&lt;/span&gt;T&lt;span&gt;)&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;in&lt;/span&gt; T&lt;span&gt;[&lt;/span&gt;&lt;span&gt;]&lt;/span&gt; items&lt;span&gt;)&lt;/span&gt; &lt;span&gt;pure&lt;/span&gt; &lt;span&gt;nothrow&lt;/span&gt; &lt;span&gt;{&lt;/span&gt;&lt;br /&gt;D&lt;span&gt;&amp;gt;&lt;/span&gt;     &lt;span&gt;const&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;T&lt;span&gt;[&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;]&lt;/span&gt; result&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;D&lt;span&gt;&amp;gt;&lt;/span&gt; &lt;br /&gt;D&lt;span&gt;&amp;gt;&lt;/span&gt;     &lt;span&gt;void&lt;/span&gt; perms&lt;span&gt;(&lt;/span&gt;&lt;span&gt;in&lt;/span&gt; T&lt;span&gt;[&lt;/span&gt;&lt;span&gt;]&lt;/span&gt; s&lt;span&gt;,&lt;/span&gt; &lt;span&gt;in&lt;/span&gt; T&lt;span&gt;[&lt;/span&gt;&lt;span&gt;]&lt;/span&gt; prefix&lt;span&gt;=&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;)&lt;/span&gt; &lt;span&gt;nothrow&lt;/span&gt; &lt;span&gt;{&lt;/span&gt;&lt;br /&gt;D&lt;span&gt;&amp;gt;&lt;/span&gt;         &lt;span&gt;if&lt;/span&gt; &lt;span&gt;(&lt;/span&gt;s.&lt;span&gt;length&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;br /&gt;D&lt;span&gt;&amp;gt;&lt;/span&gt;             &lt;span&gt;foreach&lt;/span&gt; &lt;span&gt;(&lt;/span&gt;i&lt;span&gt;,&lt;/span&gt; c&lt;span&gt;;&lt;/span&gt; s&lt;span&gt;)&lt;/span&gt;&lt;br /&gt;D&lt;span&gt;&amp;gt;&lt;/span&gt;                perms&lt;span&gt;(&lt;/span&gt;s&lt;span&gt;[&lt;/span&gt;&lt;span&gt;0&lt;/span&gt; &lt;span&gt;..&lt;/span&gt; &lt;span&gt;i&lt;/span&gt;&lt;span&gt;]&lt;/span&gt; &lt;span&gt;~&lt;/span&gt; s&lt;span&gt;[&lt;/span&gt;i&lt;span&gt;+&lt;/span&gt;&lt;span&gt;1&lt;/span&gt; &lt;span&gt;..&lt;/span&gt; $&lt;span&gt;]&lt;/span&gt;&lt;span&gt;,&lt;/span&gt; prefix &lt;span&gt;~&lt;/span&gt; c&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;D&lt;span&gt;&amp;gt;&lt;/span&gt;         &lt;span&gt;else&lt;/span&gt;&lt;br /&gt;D&lt;span&gt;&amp;gt;&lt;/span&gt;             result &lt;span&gt;~=&lt;/span&gt; prefix&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;D&lt;span&gt;&amp;gt;&lt;/span&gt;     &lt;span&gt;}&lt;/span&gt;&lt;br /&gt;D&lt;span&gt;&amp;gt;&lt;/span&gt; &lt;br /&gt;D&lt;span&gt;&amp;gt;&lt;/span&gt;     perms&lt;span&gt;(&lt;/span&gt;items&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;D&lt;span&gt;&amp;gt;&lt;/span&gt;     &lt;span&gt;return&lt;/span&gt; result&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;D&lt;span&gt;&amp;gt;&lt;/span&gt; &lt;span&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span&gt;...&lt;/span&gt;&lt;br /&gt;&lt;span&gt;D&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt; &lt;span&gt;void&lt;/span&gt; main&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt; &lt;span&gt;{&lt;/span&gt;&lt;br /&gt;D&lt;span&gt;&amp;gt;&lt;/span&gt;     &lt;span&gt;static&lt;/span&gt; &lt;span&gt;immutable&lt;/span&gt; permsNumber &lt;span&gt;=&lt;/span&gt; permutations&lt;span&gt;(&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;EnumMembers&lt;span&gt;!&lt;/span&gt;Number&lt;span&gt;]&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;D&lt;span&gt;&amp;gt;&lt;/span&gt;     &lt;span&gt;static&lt;/span&gt; &lt;span&gt;immutable&lt;/span&gt; permsColor &lt;span&gt;=&lt;/span&gt; &lt;span&gt;cast&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;immutable&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;Color&lt;span&gt;[&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;permsNumber&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;D&lt;span&gt;&amp;gt;&lt;/span&gt;     &lt;span&gt;static&lt;/span&gt; &lt;span&gt;immutable&lt;/span&gt; permsDrink &lt;span&gt;=&lt;/span&gt; &lt;span&gt;cast&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;immutable&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;Drink&lt;span&gt;[&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;permsNumber&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;D&lt;span&gt;&amp;gt;&lt;/span&gt;     &lt;span&gt;static&lt;/span&gt; &lt;span&gt;immutable&lt;/span&gt; permsSmoke &lt;span&gt;=&lt;/span&gt; &lt;span&gt;cast&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;immutable&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;Smoke&lt;span&gt;[&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;permsNumber&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;D&lt;span&gt;&amp;gt;&lt;/span&gt;     &lt;span&gt;static&lt;/span&gt; &lt;span&gt;immutable&lt;/span&gt; permsPet &lt;span&gt;=&lt;/span&gt; &lt;span&gt;cast&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;immutable&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;Pet&lt;span&gt;[&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;permsNumber&lt;span&gt;;&lt;/span&gt;
&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;Here I have used one of the peculiar features of D, the compile-time function evaluation. The C++ 'perms' array is just an array of all permutations of the [0, 1, 2, 3, 4] numbers. So I have written a little permutations() function (a function as commonly useful as this one, maybe as a lazy range, needs to be present in Phobos. Python has a similar generator in the itertools standard library module) that returns an array of all the permutations.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;In D the enums are strongly typed, and the functions of this program work with strongly typed enums to avoid bugs, so I need different permutations of the enum members. Probably a good compiler is able to see all those immutable arrays contain the same bit patterns (despite being of different types), but this program iterates on them many times, so to be sure there is low pressure on the CPU cache, the other arrays are just aliases of the first one. I don't last casts a lot, because they are quite unsafe in D, but here I think they are acceptable.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;The D 2D arrays like permsNumber are dynamic arrays of dynamic arrays of 5 enum members, that are represented with ubytes. In the C++ code perms is an array of fixed-sized arrays, this gives a bit higher performance to the C++ code. I have created another D version that solves this problem, but needs to use the arrays in a not D idiomatic way, see below.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;----------------------------------------------&lt;br /&gt;&lt;/p&gt;&lt;pre&gt;C&amp;gt; char&lt;br /&gt;C&amp;gt; possible(char *number, char *colour, char* drink, char *smoke, char *pet)&lt;br /&gt;C&amp;gt; {&lt;br /&gt;C&amp;gt;   // Rules, with the rule number as a comment&lt;br /&gt;C&amp;gt; &lt;br /&gt;C&amp;gt;   // single property rules&lt;br /&gt;C&amp;gt;   if(number&amp;nbsp;!= NULL &amp;amp;&amp;amp; number[Norvegian]&amp;nbsp;!= One) // 9&lt;br /&gt;C&amp;gt;     return FALSE;&lt;br /&gt;C&amp;gt;   if(colour&amp;nbsp;!= NULL &amp;amp;&amp;amp; colour[British]&amp;nbsp;!= Red) // 1&lt;br /&gt;C&amp;gt;     return FALSE;&lt;br /&gt;C&amp;gt;   if(drink&amp;nbsp;!= NULL &amp;amp;&amp;amp; drink[Danish]&amp;nbsp;!= Tea)  // 3&lt;br /&gt;C&amp;gt;     return FALSE;&lt;br /&gt;C&amp;gt;   if(smoke&amp;nbsp;!= NULL &amp;amp;&amp;amp; smoke[German]&amp;nbsp;!= Prince) // 13&lt;br /&gt;C&amp;gt;     return FALSE;&lt;br /&gt;C&amp;gt;   if(pet&amp;nbsp;!= NULL &amp;amp;&amp;amp; pet[Swedish]&amp;nbsp;!= Dog)    // 2&lt;br /&gt;C&amp;gt;     return FALSE;
&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;D&lt;span&gt;&amp;gt;&lt;/span&gt; &lt;span&gt;bool&lt;/span&gt; isPossible&lt;span&gt;(&lt;/span&gt;&lt;span&gt;in&lt;/span&gt; Number&lt;span&gt;[&lt;/span&gt;&lt;span&gt;]&lt;/span&gt; number&lt;span&gt;,&lt;/span&gt; &lt;span&gt;in&lt;/span&gt; Color&lt;span&gt;[&lt;/span&gt;&lt;span&gt;]&lt;/span&gt; color&lt;span&gt;,&lt;/span&gt; &lt;span&gt;in&lt;/span&gt; Drink&lt;span&gt;[&lt;/span&gt;&lt;span&gt;]&lt;/span&gt; drink&lt;span&gt;,&lt;/span&gt;&lt;br /&gt;D&lt;span&gt;&amp;gt;&lt;/span&gt;                 &lt;span&gt;in&lt;/span&gt; Smoke&lt;span&gt;[&lt;/span&gt;&lt;span&gt;]&lt;/span&gt; smoke&lt;span&gt;,&lt;/span&gt; &lt;span&gt;in&lt;/span&gt; Pet&lt;span&gt;[&lt;/span&gt;&lt;span&gt;]&lt;/span&gt; pet&lt;span&gt;)&lt;/span&gt; &lt;span&gt;pure&lt;/span&gt; &lt;span&gt;nothrow&lt;/span&gt; &lt;span&gt;{&lt;/span&gt;&lt;br /&gt;D&lt;span&gt;&amp;gt;&lt;/span&gt;     &lt;span&gt;// Rules, with the rule number as a comment&lt;/span&gt;&lt;br /&gt;D&lt;span&gt;&amp;gt;&lt;/span&gt; &lt;br /&gt;D&lt;span&gt;&amp;gt;&lt;/span&gt;     &lt;span&gt;// single property rules&lt;/span&gt;&lt;br /&gt;D&lt;span&gt;&amp;gt;&lt;/span&gt;     &lt;span&gt;if&lt;/span&gt; &lt;span&gt;(&lt;/span&gt;&lt;span&gt;!&lt;/span&gt;number.&lt;span&gt;empty&lt;/span&gt; &lt;span&gt;&amp;amp;&amp;amp;&lt;/span&gt; number&lt;span&gt;[&lt;/span&gt;Nation.&lt;span&gt;Norvegian&lt;/span&gt;&lt;span&gt;]&lt;/span&gt; &lt;span&gt;!=&lt;/span&gt; Number.&lt;span&gt;One&lt;/span&gt;&lt;span&gt;)&lt;/span&gt; &lt;span&gt;// 9&lt;/span&gt;&lt;br /&gt;D&lt;span&gt;&amp;gt;&lt;/span&gt;         &lt;span&gt;return&lt;/span&gt; &lt;span&gt;false&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;D&lt;span&gt;&amp;gt;&lt;/span&gt;     &lt;span&gt;if&lt;/span&gt; &lt;span&gt;(&lt;/span&gt;&lt;span&gt;!&lt;/span&gt;color.&lt;span&gt;empty&lt;/span&gt; &lt;span&gt;&amp;amp;&amp;amp;&lt;/span&gt; color&lt;span&gt;[&lt;/span&gt;Nation.&lt;span&gt;British&lt;/span&gt;&lt;span&gt;]&lt;/span&gt; &lt;span&gt;!=&lt;/span&gt; Color.&lt;span&gt;Red&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;      &lt;span&gt;// 1&lt;/span&gt;&lt;br /&gt;D&lt;span&gt;&amp;gt;&lt;/span&gt;         &lt;span&gt;return&lt;/span&gt; &lt;span&gt;false&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;D&lt;span&gt;&amp;gt;&lt;/span&gt;     &lt;span&gt;if&lt;/span&gt; &lt;span&gt;(&lt;/span&gt;&lt;span&gt;!&lt;/span&gt;drink.&lt;span&gt;empty&lt;/span&gt; &lt;span&gt;&amp;amp;&amp;amp;&lt;/span&gt; drink&lt;span&gt;[&lt;/span&gt;Nation.&lt;span&gt;Danish&lt;/span&gt;&lt;span&gt;]&lt;/span&gt; &lt;span&gt;!=&lt;/span&gt; Drink.&lt;span&gt;Tea&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;       &lt;span&gt;// 3&lt;/span&gt;&lt;br /&gt;D&lt;span&gt;&amp;gt;&lt;/span&gt;         &lt;span&gt;return&lt;/span&gt; &lt;span&gt;false&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;D&lt;span&gt;&amp;gt;&lt;/span&gt;     &lt;span&gt;if&lt;/span&gt; &lt;span&gt;(&lt;/span&gt;&lt;span&gt;!&lt;/span&gt;smoke.&lt;span&gt;empty&lt;/span&gt; &lt;span&gt;&amp;amp;&amp;amp;&lt;/span&gt; smoke&lt;span&gt;[&lt;/span&gt;Nation.&lt;span&gt;German&lt;/span&gt;&lt;span&gt;]&lt;/span&gt; &lt;span&gt;!=&lt;/span&gt; Smoke.&lt;span&gt;Prince&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;    &lt;span&gt;// 13&lt;/span&gt;&lt;br /&gt;D&lt;span&gt;&amp;gt;&lt;/span&gt;         &lt;span&gt;return&lt;/span&gt; &lt;span&gt;false&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;D&lt;span&gt;&amp;gt;&lt;/span&gt;     &lt;span&gt;if&lt;/span&gt; &lt;span&gt;(&lt;/span&gt;&lt;span&gt;!&lt;/span&gt;pet.&lt;span&gt;empty&lt;/span&gt; &lt;span&gt;&amp;amp;&amp;amp;&lt;/span&gt; pet&lt;span&gt;[&lt;/span&gt;Nation.&lt;span&gt;Swedish&lt;/span&gt;&lt;span&gt;]&lt;/span&gt; &lt;span&gt;!=&lt;/span&gt; Pet.&lt;span&gt;Dog&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;            &lt;span&gt;// 2&lt;/span&gt;&lt;br /&gt;D&lt;span&gt;&amp;gt;&lt;/span&gt;         &lt;span&gt;return&lt;/span&gt; &lt;span&gt;false&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;Here the stronger typing of the D enums allows to write safer code, with less chance for bugs.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Generally the D function uses const/immutable/pure/nothrow everywhere it's possible, this gives performance and safety.&lt;br /&gt;&lt;/p&gt;&lt;h6&gt; &lt;span&gt;==========================================&lt;/span&gt;&lt;/h6&gt;&lt;p&gt;Comments on the second program, second version (einstein2b.d):&lt;br /&gt;&lt;/p&gt;&lt;p&gt;This is very similar to einstein2a.d, the main difference comes from the desire to increase the performance avoiding one pointer level using fixed-size arrays to represent the is various permutations.&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;pre&gt;D&lt;span&gt;&amp;gt;&lt;/span&gt; &lt;span&gt;import&lt;/span&gt; std.&lt;span&gt;stdio&lt;/span&gt;&lt;span&gt;,&lt;/span&gt; std.&lt;span&gt;math&lt;/span&gt;&lt;span&gt;,&lt;/span&gt; std.&lt;span&gt;traits&lt;/span&gt;&lt;span&gt;,&lt;/span&gt; std.&lt;span&gt;array&lt;/span&gt;&lt;span&gt;,&lt;/span&gt; std.&lt;span&gt;conv&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;D&lt;span&gt;&amp;gt;&lt;/span&gt; &lt;br /&gt;D&lt;span&gt;&amp;gt;&lt;/span&gt; &lt;br /&gt;D&lt;span&gt;&amp;gt;&lt;/span&gt; &lt;span&gt;const&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;T&lt;span&gt;[&lt;/span&gt;N&lt;span&gt;]&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;)&lt;/span&gt; permutationsFixed&lt;span&gt;(&lt;/span&gt;T&lt;span&gt;,&lt;/span&gt; &lt;span&gt;size_t&lt;/span&gt; N&lt;span&gt;)&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;in&lt;/span&gt; T&lt;span&gt;[&lt;/span&gt;N&lt;span&gt;]&lt;/span&gt; items&lt;span&gt;)&lt;/span&gt; &lt;span&gt;pure&lt;/span&gt; &lt;span&gt;nothrow&lt;/span&gt; &lt;span&gt;{&lt;/span&gt;&lt;br /&gt;D&lt;span&gt;&amp;gt;&lt;/span&gt;     &lt;span&gt;const&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;T&lt;span&gt;[&lt;/span&gt;N&lt;span&gt;]&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;]&lt;/span&gt; result&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;D&lt;span&gt;&amp;gt;&lt;/span&gt;     T&lt;span&gt;[&lt;/span&gt;N&lt;span&gt;]&lt;/span&gt; row&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;D&lt;span&gt;&amp;gt;&lt;/span&gt; &lt;br /&gt;D&lt;span&gt;&amp;gt;&lt;/span&gt;     &lt;span&gt;void&lt;/span&gt; perms&lt;span&gt;(&lt;/span&gt;&lt;span&gt;in&lt;/span&gt; T&lt;span&gt;[&lt;/span&gt;&lt;span&gt;]&lt;/span&gt; s&lt;span&gt;,&lt;/span&gt; &lt;span&gt;in&lt;/span&gt; T&lt;span&gt;[&lt;/span&gt;&lt;span&gt;]&lt;/span&gt; prefix&lt;span&gt;=&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;)&lt;/span&gt; &lt;span&gt;nothrow&lt;/span&gt; &lt;span&gt;{&lt;/span&gt;&lt;br /&gt;D&lt;span&gt;&amp;gt;&lt;/span&gt;         &lt;span&gt;if&lt;/span&gt; &lt;span&gt;(&lt;/span&gt;s.&lt;span&gt;length&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;br /&gt;D&lt;span&gt;&amp;gt;&lt;/span&gt;             &lt;span&gt;foreach&lt;/span&gt; &lt;span&gt;(&lt;/span&gt;i&lt;span&gt;,&lt;/span&gt; c&lt;span&gt;;&lt;/span&gt; s&lt;span&gt;)&lt;/span&gt;&lt;br /&gt;D&lt;span&gt;&amp;gt;&lt;/span&gt;                perms&lt;span&gt;(&lt;/span&gt;s&lt;span&gt;[&lt;/span&gt;&lt;span&gt;0&lt;/span&gt; &lt;span&gt;..&lt;/span&gt; &lt;span&gt;i&lt;/span&gt;&lt;span&gt;]&lt;/span&gt; &lt;span&gt;~&lt;/span&gt; s&lt;span&gt;[&lt;/span&gt;i&lt;span&gt;+&lt;/span&gt;&lt;span&gt;1&lt;/span&gt; &lt;span&gt;..&lt;/span&gt; $&lt;span&gt;]&lt;/span&gt;&lt;span&gt;,&lt;/span&gt; prefix &lt;span&gt;~&lt;/span&gt; c&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;D&lt;span&gt;&amp;gt;&lt;/span&gt;         &lt;span&gt;else&lt;/span&gt; &lt;span&gt;{&lt;/span&gt;&lt;br /&gt;D&lt;span&gt;&amp;gt;&lt;/span&gt;             row&lt;span&gt;[&lt;/span&gt;&lt;span&gt;]&lt;/span&gt; &lt;span&gt;=&lt;/span&gt; prefix&lt;span&gt;[&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;D&lt;span&gt;&amp;gt;&lt;/span&gt;             result &lt;span&gt;~=&lt;/span&gt; row&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;D&lt;span&gt;&amp;gt;&lt;/span&gt;         &lt;span&gt;}&lt;/span&gt;&lt;br /&gt;D&lt;span&gt;&amp;gt;&lt;/span&gt;     &lt;span&gt;}&lt;/span&gt;&lt;br /&gt;D&lt;span&gt;&amp;gt;&lt;/span&gt; &lt;br /&gt;D&lt;span&gt;&amp;gt;&lt;/span&gt;     perms&lt;span&gt;(&lt;/span&gt;items&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;D&lt;span&gt;&amp;gt;&lt;/span&gt;     &lt;span&gt;return&lt;/span&gt; result&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;D&lt;span&gt;&amp;gt;&lt;/span&gt; &lt;span&gt;}&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;The permutationsFixed() function returns an dynamic array of fixed size arrays.&lt;br /&gt;&lt;/p&gt;----------------------------------------------&lt;br /&gt;&lt;pre&gt;D&lt;span&gt;&amp;gt;&lt;/span&gt; &lt;span&gt;enum&lt;/span&gt; Number &lt;span&gt;:&lt;/span&gt; &lt;span&gt;uint&lt;/span&gt; &lt;span&gt;{&lt;/span&gt; One&lt;span&gt;,&lt;/span&gt;      Two&lt;span&gt;,&lt;/span&gt;     Three&lt;span&gt;,&lt;/span&gt;  Four&lt;span&gt;,&lt;/span&gt;       Five   &lt;span&gt;}&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;D&lt;span&gt;&amp;gt;&lt;/span&gt; &lt;span&gt;enum&lt;/span&gt; Color  &lt;span&gt;:&lt;/span&gt; &lt;span&gt;uint&lt;/span&gt; &lt;span&gt;{&lt;/span&gt; Red&lt;span&gt;,&lt;/span&gt;      Green&lt;span&gt;,&lt;/span&gt;   Blue&lt;span&gt;,&lt;/span&gt;   White&lt;span&gt;,&lt;/span&gt;      Yellow &lt;span&gt;}&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;D&lt;span&gt;&amp;gt;&lt;/span&gt; &lt;span&gt;enum&lt;/span&gt; Drink  &lt;span&gt;:&lt;/span&gt; &lt;span&gt;uint&lt;/span&gt; &lt;span&gt;{&lt;/span&gt; Milk&lt;span&gt;,&lt;/span&gt;     Coffee&lt;span&gt;,&lt;/span&gt;  Water&lt;span&gt;,&lt;/span&gt;  Beer&lt;span&gt;,&lt;/span&gt;       Tea    &lt;span&gt;}&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;D&lt;span&gt;&amp;gt;&lt;/span&gt; &lt;span&gt;enum&lt;/span&gt; Smoke  &lt;span&gt;:&lt;/span&gt; &lt;span&gt;uint&lt;/span&gt; &lt;span&gt;{&lt;/span&gt; PallMall&lt;span&gt;,&lt;/span&gt; Dunhill&lt;span&gt;,&lt;/span&gt; Blend&lt;span&gt;,&lt;/span&gt;  BlueMaster&lt;span&gt;,&lt;/span&gt; Prince &lt;span&gt;}&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;D&lt;span&gt;&amp;gt;&lt;/span&gt; &lt;span&gt;enum&lt;/span&gt; Pet    &lt;span&gt;:&lt;/span&gt; &lt;span&gt;uint&lt;/span&gt; &lt;span&gt;{&lt;/span&gt; Dog&lt;span&gt;,&lt;/span&gt;      Cat&lt;span&gt;,&lt;/span&gt;     Fish&lt;span&gt;,&lt;/span&gt;   Horse&lt;span&gt;,&lt;/span&gt;      Bird   &lt;span&gt;}&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;D&lt;span&gt;&amp;gt;&lt;/span&gt; &lt;span&gt;enum&lt;/span&gt; Nation &lt;span&gt;:&lt;/span&gt; &lt;span&gt;uint&lt;/span&gt; &lt;span&gt;{&lt;/span&gt; British&lt;span&gt;,&lt;/span&gt;  Swedish&lt;span&gt;,&lt;/span&gt; Danish&lt;span&gt;,&lt;/span&gt; Norvegian&lt;span&gt;,&lt;/span&gt;  German &lt;span&gt;}&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;The enums have uint as base type because it's about or more efficient than ubytes, in this program.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;----------------------------------------------&lt;br /&gt;&lt;/p&gt;&lt;pre&gt;D&lt;span&gt;&amp;gt;&lt;/span&gt; &lt;span&gt;bool&lt;/span&gt; isPossible&lt;span&gt;(&lt;/span&gt;&lt;span&gt;immutable&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;Number&lt;span&gt;[&lt;/span&gt;&lt;span&gt;5&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;*&lt;/span&gt; number&lt;span&gt;,&lt;/span&gt;&lt;br /&gt;D&lt;span&gt;&amp;gt;&lt;/span&gt;                 &lt;span&gt;immutable&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;Color&lt;span&gt;[&lt;/span&gt;&lt;span&gt;5&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;*&lt;/span&gt; color&lt;span&gt;,&lt;/span&gt;&lt;br /&gt;D&lt;span&gt;&amp;gt;&lt;/span&gt;                 &lt;span&gt;immutable&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;Drink&lt;span&gt;[&lt;/span&gt;&lt;span&gt;5&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;*&lt;/span&gt; drink&lt;span&gt;,&lt;/span&gt;&lt;br /&gt;D&lt;span&gt;&amp;gt;&lt;/span&gt;                 &lt;span&gt;immutable&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;Smoke&lt;span&gt;[&lt;/span&gt;&lt;span&gt;5&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;*&lt;/span&gt; smoke&lt;span&gt;,&lt;/span&gt;&lt;br /&gt;D&lt;span&gt;&amp;gt;&lt;/span&gt;                 &lt;span&gt;immutable&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;Pet&lt;span&gt;[&lt;/span&gt;&lt;span&gt;5&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;*&lt;/span&gt; pet&lt;br /&gt;D&lt;span&gt;&amp;gt;&lt;/span&gt;                 &lt;span&gt;)&lt;/span&gt; &lt;span&gt;pure&lt;/span&gt; &lt;span&gt;nothrow&lt;/span&gt; &lt;span&gt;{&lt;/span&gt;&lt;br /&gt;D&lt;span&gt;&amp;gt;&lt;/span&gt;     &lt;span&gt;// Rules, with the rule number as a comment&lt;/span&gt;&lt;br /&gt;D&lt;span&gt;&amp;gt;&lt;/span&gt; &lt;br /&gt;D&lt;span&gt;&amp;gt;&lt;/span&gt;     &lt;span&gt;// single property rules&lt;/span&gt;&lt;br /&gt;D&lt;span&gt;&amp;gt;&lt;/span&gt;     &lt;span&gt;if&lt;/span&gt; &lt;span&gt;(&lt;/span&gt;number &lt;span&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span&gt;(&lt;/span&gt;&lt;span&gt;*&lt;/span&gt;number&lt;span&gt;)&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;Nation.&lt;span&gt;Norvegian&lt;/span&gt;&lt;span&gt;]&lt;/span&gt; &lt;span&gt;!=&lt;/span&gt; Number.&lt;span&gt;One&lt;/span&gt;&lt;span&gt;)&lt;/span&gt; &lt;span&gt;// 9&lt;/span&gt;&lt;br /&gt;D&lt;span&gt;&amp;gt;&lt;/span&gt;         &lt;span&gt;return&lt;/span&gt; &lt;span&gt;false&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;D&lt;span&gt;&amp;gt;&lt;/span&gt;     &lt;span&gt;if&lt;/span&gt; &lt;span&gt;(&lt;/span&gt;color &lt;span&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span&gt;(&lt;/span&gt;&lt;span&gt;*&lt;/span&gt;color&lt;span&gt;)&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;Nation.&lt;span&gt;British&lt;/span&gt;&lt;span&gt;]&lt;/span&gt; &lt;span&gt;!=&lt;/span&gt; Color.&lt;span&gt;Red&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;      &lt;span&gt;// 1&lt;/span&gt;&lt;br /&gt;D&lt;span&gt;&amp;gt;&lt;/span&gt;         &lt;span&gt;return&lt;/span&gt; &lt;span&gt;false&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;D&lt;span&gt;&amp;gt;&lt;/span&gt;     &lt;span&gt;if&lt;/span&gt; &lt;span&gt;(&lt;/span&gt;drink &lt;span&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span&gt;(&lt;/span&gt;&lt;span&gt;*&lt;/span&gt;drink&lt;span&gt;)&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;Nation.&lt;span&gt;Danish&lt;/span&gt;&lt;span&gt;]&lt;/span&gt; &lt;span&gt;!=&lt;/span&gt; Drink.&lt;span&gt;Tea&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;       &lt;span&gt;// 3&lt;/span&gt;&lt;br /&gt;D&lt;span&gt;&amp;gt;&lt;/span&gt;         &lt;span&gt;return&lt;/span&gt; &lt;span&gt;false&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;D&lt;span&gt;&amp;gt;&lt;/span&gt;     &lt;span&gt;if&lt;/span&gt; &lt;span&gt;(&lt;/span&gt;smoke &lt;span&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span&gt;(&lt;/span&gt;&lt;span&gt;*&lt;/span&gt;smoke&lt;span&gt;)&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;Nation.&lt;span&gt;German&lt;/span&gt;&lt;span&gt;]&lt;/span&gt; &lt;span&gt;!=&lt;/span&gt; Smoke.&lt;span&gt;Prince&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;    &lt;span&gt;// 13&lt;/span&gt;&lt;br /&gt;D&lt;span&gt;&amp;gt;&lt;/span&gt;         &lt;span&gt;return&lt;/span&gt; &lt;span&gt;false&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;D&lt;span&gt;&amp;gt;&lt;/span&gt;     &lt;span&gt;if&lt;/span&gt; &lt;span&gt;(&lt;/span&gt;pet &lt;span&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span&gt;(&lt;/span&gt;&lt;span&gt;*&lt;/span&gt;pet&lt;span&gt;)&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;Nation.&lt;span&gt;Swedish&lt;/span&gt;&lt;span&gt;]&lt;/span&gt; &lt;span&gt;!=&lt;/span&gt; Pet.&lt;span&gt;Dog&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;            &lt;span&gt;// 2&lt;/span&gt;&lt;br /&gt;D&lt;span&gt;&amp;gt;&lt;/span&gt;         &lt;span&gt;return&lt;/span&gt; &lt;span&gt;false&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;D&lt;span&gt;&amp;gt;&lt;/span&gt; &lt;br /&gt;D&lt;span&gt;&amp;gt;&lt;/span&gt;     &lt;span&gt;// only check complicated rules, if everything is defined&lt;/span&gt;&lt;br /&gt;D&lt;span&gt;&amp;gt;&lt;/span&gt;     &lt;span&gt;if&lt;/span&gt; &lt;span&gt;(&lt;/span&gt;&lt;span&gt;!&lt;/span&gt;number &lt;span&gt;||&lt;/span&gt; &lt;span&gt;!&lt;/span&gt;color &lt;span&gt;||&lt;/span&gt; &lt;span&gt;!&lt;/span&gt;drink &lt;span&gt;||&lt;/span&gt; &lt;span&gt;!&lt;/span&gt;smoke &lt;span&gt;||&lt;/span&gt; &lt;span&gt;!&lt;/span&gt;pet&lt;span&gt;)&lt;/span&gt;&lt;br /&gt;D&lt;span&gt;&amp;gt;&lt;/span&gt;         &lt;span&gt;return&lt;/span&gt; &lt;span&gt;true&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;D&lt;span&gt;&amp;gt;&lt;/span&gt; &lt;br /&gt;D&lt;span&gt;&amp;gt;&lt;/span&gt;     &lt;span&gt;// double property rules&lt;/span&gt;&lt;br /&gt;D&lt;span&gt;&amp;gt;&lt;/span&gt;     &lt;span&gt;foreach&lt;/span&gt; &lt;span&gt;(&lt;/span&gt;i&lt;span&gt;;&lt;/span&gt; &lt;span&gt;0&lt;/span&gt; &lt;span&gt;..&lt;/span&gt; &lt;span&gt;5&lt;/span&gt;&lt;span&gt;)&lt;/span&gt; &lt;span&gt;{&lt;/span&gt;&lt;br /&gt;D&lt;span&gt;&amp;gt;&lt;/span&gt;         &lt;span&gt;if&lt;/span&gt; &lt;span&gt;(&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;*&lt;/span&gt;color&lt;span&gt;)&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;i&lt;span&gt;]&lt;/span&gt; &lt;span&gt;==&lt;/span&gt; Color.&lt;span&gt;Green&lt;/span&gt; &lt;span&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span&gt;(&lt;/span&gt;&lt;span&gt;*&lt;/span&gt;drink&lt;span&gt;)&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;i&lt;span&gt;]&lt;/span&gt; &lt;span&gt;!=&lt;/span&gt; Drink.&lt;span&gt;Coffee&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;    &lt;span&gt;// 5&lt;/span&gt;&lt;br /&gt;D&lt;span&gt;&amp;gt;&lt;/span&gt;             &lt;span&gt;return&lt;/span&gt; &lt;span&gt;false&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;D&lt;span&gt;&amp;gt;&lt;/span&gt;         &lt;span&gt;if&lt;/span&gt; &lt;span&gt;(&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;*&lt;/span&gt;smoke&lt;span&gt;)&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;i&lt;span&gt;]&lt;/span&gt; &lt;span&gt;==&lt;/span&gt; Smoke.&lt;span&gt;PallMall&lt;/span&gt; &lt;span&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span&gt;(&lt;/span&gt;&lt;span&gt;*&lt;/span&gt;pet&lt;span&gt;)&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;i&lt;span&gt;]&lt;/span&gt; &lt;span&gt;!=&lt;/span&gt; Pet.&lt;span&gt;Bird&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;       &lt;span&gt;// 6&lt;/span&gt;&lt;br /&gt;D&lt;span&gt;&amp;gt;&lt;/span&gt;             &lt;span&gt;return&lt;/span&gt; &lt;span&gt;false&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;...&lt;/span&gt;&lt;br /&gt;&lt;span&gt;D&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt; &lt;span&gt;void&lt;/span&gt; main&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt; &lt;span&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span&gt;...&lt;/span&gt;&lt;br /&gt;&lt;span&gt;D&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;     &lt;span&gt;foreach&lt;/span&gt; &lt;span&gt;(&lt;/span&gt;&lt;span&gt;ref&lt;/span&gt; number&lt;span&gt;;&lt;/span&gt; permsNumber&lt;span&gt;)&lt;/span&gt;&lt;br /&gt;D&lt;span&gt;&amp;gt;&lt;/span&gt;         &lt;span&gt;if&lt;/span&gt; &lt;span&gt;(&lt;/span&gt;isPossible&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&amp;amp;&lt;/span&gt;number&lt;span&gt;,&lt;/span&gt; &lt;span&gt;null&lt;/span&gt;&lt;span&gt;,&lt;/span&gt; &lt;span&gt;null&lt;/span&gt;&lt;span&gt;,&lt;/span&gt; &lt;span&gt;null&lt;/span&gt;&lt;span&gt;,&lt;/span&gt; &lt;span&gt;null&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;br /&gt;D&lt;span&gt;&amp;gt;&lt;/span&gt;             &lt;span&gt;foreach&lt;/span&gt; &lt;span&gt;(&lt;/span&gt;&lt;span&gt;ref&lt;/span&gt; color&lt;span&gt;;&lt;/span&gt; permsColor&lt;span&gt;)&lt;/span&gt;&lt;br /&gt;D&lt;span&gt;&amp;gt;&lt;/span&gt;                 &lt;span&gt;if&lt;/span&gt; &lt;span&gt;(&lt;/span&gt;isPossible&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&amp;amp;&lt;/span&gt;number&lt;span&gt;,&lt;/span&gt; &lt;span&gt;&amp;amp;&lt;/span&gt;color&lt;span&gt;,&lt;/span&gt; &lt;span&gt;null&lt;/span&gt;&lt;span&gt;,&lt;/span&gt; &lt;span&gt;null&lt;/span&gt;&lt;span&gt;,&lt;/span&gt; &lt;span&gt;null&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;Normally in D you pass static arrays efficiently using "const ref T[N]", but in this program also nulls must be supported. So I have had to perform some experiments to find a flexible enough but efficient way to give them to the isPossible() function.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;So I pass them as pointers to immutable fixed size arrays:&lt;br /&gt;&lt;/p&gt;&lt;pre&gt;D&lt;span&gt;&amp;gt;&lt;/span&gt;                 &lt;span&gt;immutable&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;Color&lt;span&gt;[&lt;/span&gt;&lt;span&gt;5&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;*&lt;/span&gt; color&lt;span&gt;,&lt;/span&gt;&lt;/pre&gt;&lt;p&gt;They are pointers to arrays (so they are like C/C++/D1 fixed size arrays), so they are efficient, despite this is a not idiomatic way to use arrays in D.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;To use the array items you need to deference the pointer first:&lt;br /&gt;&lt;/p&gt;&lt;pre&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;*&lt;/span&gt;color&lt;span&gt;)&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;i&lt;span&gt;]&lt;/span&gt;&lt;/pre&gt;&lt;p&gt;An alternative syntax, but it's less natural because the first isn't really an array of size 1, it's a pointer to an array:&lt;br /&gt;&lt;/p&gt;&lt;pre&gt;color&lt;span&gt;[&lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;i&lt;span&gt;]&lt;/span&gt;
&lt;/pre&gt;&lt;h6&gt; &lt;span&gt;==========================================&lt;/span&gt;&lt;br /&gt;&lt;/h6&gt;Some benchmarks:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;Runtime timings, seconds:
  einstein1.cpp:  0.01
  einstein1a.d:   0.05
  einstein2.cpp:  0.70
  einstein2a.d:   1.09
  einstein2b.d:   0.76
  einstein2c.py: 19.03 (with Psyco)&lt;/pre&gt;DMD 2.057 head&lt;br /&gt;&lt;p&gt;G++ 4.6.1&lt;br /&gt;Python 2.6.6&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Celeron 2.3 GHz, 32 bit OS.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;----------------------------------------------&lt;/p&gt;Strong static typing is useful, but it often also requires lot of work. In practical D programs I try to find a balance point in the amount of strong static typing I use, to avoid wasting some of my time. Yet, as I get more experienced in programming, I like to express more and more code invariants in statically enforced constraints, like the ones of a static type system, because despite they ask me lot of work, they help me avoid some bugs.&lt;br /&gt;&lt;p&gt;So "Make illegal states unrepresentable", as it's said here regarding OCaML code:&lt;br /&gt;&lt;a href="http://ocaml.janestreet.com/?q=node/85" rel="nofollow"&gt;http://ocaml.janestreet.com/?q=node/85&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;So write your code to turn the illegal states into static errors.&lt;br /&gt;&lt;/p&gt;</content>
		<author>
			<name>Leonardo Maffi</name>
			<uri>http://leonardo-m.livejournal.com/</uri>
		</author>
		<source>
			<title type="html">leonardo</title>
			<subtitle type="html">leonardo - LiveJournal.com</subtitle>
			<link rel="self" href="http://leonardo-m.livejournal.com/data/rss?tag=d%20language" />
			<id>http://leonardo-m.livejournal.com/data/rss?tag=d%20language</id>
			<updated>2012-04-15T17:00:15+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en-us">
		<title type="html">Type Qualifiers and Wild Cards</title>
		<link href="http://www.drdobbs.com/blogs/cpp/231902461" />
		<id>http://www.drdobbs.com/blogs/cpp/231902461</id>
		<updated>2011-11-07T10:47:00+00:00</updated>
		<content type="html">Type qualifiers are modifiers applied to data types.</content>
		<author>
			<name>Walter Bright</name>
			<uri>http://www.drdobbs.com//author/6839</uri>
		</author>
		<source>
			<title type="html">Dr. Dobb's Blogs</title>
			<subtitle type="html">Dr. Dobb's</subtitle>
			<link rel="self" href="http://www.drdobbs.com/rss/blogs/author/6839" />
			<id>http://www.drdobbs.com/rss/blogs/author/6839</id>
			<updated>2012-05-27T18:00:12+00:00</updated>
			<rights type="html">Copyright 2012, United Business Media.</rights>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Language Promotion</title>
		<link href="http://dcoding.wordpress.com/2011/11/02/language-promotion/" />
		<id>http://dcoding.wordpress.com/?p=13</id>
		<updated>2011-11-02T16:05:49+00:00</updated>
		<content type="html">&lt;p&gt;The D Programming Language has a long way to go for wider adoption despite it isn&amp;#8217;t exactly new. As I mentioned in the &lt;a href="http://dcoding.wordpress.com/2011/10/28/why-d/" title="Why D?"&gt;initial post&lt;/a&gt; C/C++ will dominate the native language arena for general purpose programming. The reasons are not as much theoretical than technical and historical ones.&lt;/p&gt;
&lt;p&gt;I launched this blog with the very intention to promote D and this way contribute to the process of raise this programming language to the arena where C++ has no really competition at the moment. Unfortunately, for doing this, we need to employ some PR too. As a coder, all I need to be impressed is lines of code, simple, but straightforward text to identify the &amp;#8220;beauty&amp;#8221; of a programming language but I&amp;#8217;m also aware that for spreading the word, the packaging matters a lot.&lt;/p&gt;
&lt;p&gt;Digital Mars does a very poor job on this. When I first tried the D programming language I navigated to the Digital Mars&amp;#8217; website and&amp;#8230; I almost dropped my idea of getting familiar with D. At the very moment you look the home page of D you will realise that poor people at DM have no web designer around who would keep that website in some humanly tolerable shape. Coder geeks tend to ignore the power of consumable outlook, but this is even worse. The whole site looks as it was the first attempt of some 14 years old kid to create website from a set of HTML code in notepad adding some incredibly lame graphics hacked together in MS Paint.&lt;/p&gt;
&lt;p&gt;As a result, the structure is almost completely missing, the forums are rather counter-intuitive, honestly, it&amp;#8217;s rather embarrassing. If I wasn&amp;#8217;t so busy with my life, I would donate a useful website design with a comprehensive structure. I&amp;#8217;m not a web designer by any means, but I can do better than that. So, if anyone out there could spend a little time on this and contribute to this majestic cause, please go for it ASAP!&lt;/p&gt;
&lt;p&gt;There&amp;#8217;s a sharp contrast between the D&amp;#8217;s inner beauty and the way it&amp;#8217;s treated. How can someone possibly hope for building a community around a language which has a completely repellent website?&lt;/p&gt;
&lt;p&gt;Fortunately, later on a &lt;a href="http://www.d-programming-language.org/" target="_blank" title="The D Programming Language New Website"&gt;new website&lt;/a&gt; appeared which is trying to make it up for this shocking experience. Well, it looks a bit better, but I have no idea why is it a separate one which is pointing to the old one at plenty occasion. Where a community could be fostered it&amp;#8217;s still sucks. But at least the logo worth to look at. Many people before me stated already, but I can&amp;#8217;t emphasise the following: the name &amp;#8220;D&amp;#8221; was a terrible choice. Perhaps, if things get really serious, as a beginning of a new life Water would re-baptise it, though this looks quite unlikely, pity for many.&lt;/p&gt;
&lt;p&gt;Oh, and please consider this as a good advice anywhere you need to use some iconic graphics for D, forget the following images:&lt;/p&gt;
&lt;p&gt;&lt;img alt="" class="alignleft" height="100" src="http://dlogo.chinese-blog.org/other/d002_small.jpg" width="100" /&gt;&lt;img alt="" class="alignleft" height="186" src="http://dlogo.chinese-blog.org/other/diasm.gif" width="284" /&gt;&lt;img alt="" class="alignleft" height="76" src="http://dlogo.chinese-blog.org/other/cute.gif" width="55" /&gt;&lt;img alt="" class="alignleft" height="97" src="http://dlogo.chinese-blog.org/other/tdpl.gif" width="97" /&gt;&lt;img alt="" class="alignnone" height="100" src="http://dlogo.chinese-blog.org/other/d_man_small.gif" width="53" /&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Too childish, too amateur for a language that should conquer the world. You can find better ones:&lt;/p&gt;
&lt;p&gt;&lt;img alt="" class="alignleft" height="100" src="http://dlogo.chinese-blog.org/other/d_zeros_small.gif" width="100" /&gt;&lt;img alt="" class="alignnone" height="100" src="http://dlogo.chinese-blog.org/other/suki_d-1-2.jpg" width="83" /&gt;&lt;img alt="" class="alignnone" height="100" src="http://dlogo.chinese-blog.org/other/suki_d-5.jpg" width="100" /&gt;&lt;/p&gt;
&lt;p&gt;The images above can be also found on this worthy, but quite hidden &lt;a href="http://media.sukimashita.com/d/" target="_blank" title="D logos"&gt;site&lt;/a&gt;. With this, I stop my rant for a while&amp;#8230;&lt;/p&gt;
&lt;br /&gt;  &lt;a href="http://feeds.wordpress.com/1.0/gocomments/dcoding.wordpress.com/13/" rel="nofollow"&gt;&lt;img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/dcoding.wordpress.com/13/" /&gt;&lt;/a&gt; &lt;a href="http://feeds.wordpress.com/1.0/godelicious/dcoding.wordpress.com/13/" rel="nofollow"&gt;&lt;img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/dcoding.wordpress.com/13/" /&gt;&lt;/a&gt; &lt;a href="http://feeds.wordpress.com/1.0/gofacebook/dcoding.wordpress.com/13/" rel="nofollow"&gt;&lt;img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/dcoding.wordpress.com/13/" /&gt;&lt;/a&gt; &lt;a href="http://feeds.wordpress.com/1.0/gotwitter/dcoding.wordpress.com/13/" rel="nofollow"&gt;&lt;img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/dcoding.wordpress.com/13/" /&gt;&lt;/a&gt; &lt;a href="http://feeds.wordpress.com/1.0/gostumble/dcoding.wordpress.com/13/" rel="nofollow"&gt;&lt;img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/dcoding.wordpress.com/13/" /&gt;&lt;/a&gt; &lt;a href="http://feeds.wordpress.com/1.0/godigg/dcoding.wordpress.com/13/" rel="nofollow"&gt;&lt;img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/dcoding.wordpress.com/13/" /&gt;&lt;/a&gt; &lt;a href="http://feeds.wordpress.com/1.0/goreddit/dcoding.wordpress.com/13/" rel="nofollow"&gt;&lt;img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/dcoding.wordpress.com/13/" /&gt;&lt;/a&gt; &lt;img alt="" border="0" height="1" src="http://stats.wordpress.com/b.gif?host=dcoding.wordpress.com&amp;blog=28853676&amp;post=13&amp;subd=dcoding&amp;ref=&amp;feed=1" width="1" /&gt;</content>
		<author>
			<name>progician</name>
			<uri>http://dcoding.wordpress.com</uri>
		</author>
		<source>
			<title type="html">dcoding » D coding</title>
			<subtitle type="html">Adventures in native coding with the D Programming Language</subtitle>
			<link rel="self" href="http://dcoding.wordpress.com/category/d-coding/feed/" />
			<id>http://dcoding.wordpress.com/category/d-coding/feed/</id>
			<updated>2012-03-28T12:21:09+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Why D?</title>
		<link href="http://dcoding.wordpress.com/2011/10/28/why-d/" />
		<id>http://dcoding.wordpress.com/?p=5</id>
		<updated>2011-10-28T09:11:23+00:00</updated>
		<content type="html">&lt;p&gt;This blog is dedicated my work on the D Programming Language. Though my self had not even worked on a project and coded serious stuff in D I can see the possibilities and the real need of such a programming language. If you don&amp;#8217;t know what is D, please refer to the &lt;a href="http://www.digitalmars.com/d/2.0/index.html" title="Digital Mars D"&gt;official website&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I think when &lt;a href="http://www.walterbright.com/" title="Walter Bright's Homepage"&gt;Walter Bright&lt;/a&gt;  come to the conclusion that there&amp;#8217;s a need for a multi-paradigm, imperative, native language, he made the right choice. As a C++ developer myself, I found several frustrating issue with my main programming language and with all the efforts of the recent C++11 standard these pains doesn&amp;#8217;t seem to pass. I don&amp;#8217;t want to bash C++: it&amp;#8217;s a nice piece of language which stays prominent for many years if not decades, but I think today, in 2011 we need to prepare ourselves to learn from the mistakes of the past, and have a clear start. C++ is dragging many compatibility issues with it self along its long way, and therefore a new language design, free of such a heavy burden could mean a fresh start in the native development.&lt;/p&gt;
&lt;p&gt;As of today, the most prevalent programming languages in the native arena is C and C++. C is good as it is, restricted system programming language which fit most of the hardware environment. C++ on the other hand, though it made an astonishing progress with the C++11 standard, has major flaw: it just doesn&amp;#8217;t hold the challenge against the world of Java and C# world. These programming languages became success not because of their revolutionary new technology but from rather the fact that they can keep the developers happy and enthusiastic. All this is because it was easy to produce a wide variety of coding tools that makes the development fun. In order to maintain the momentum of the native development, we need to get the fun back to the native development.&lt;/p&gt;
&lt;p&gt;C++ unfortunately can not offer such an easy entertainment. As a project is getting more and more complicated the build time grows enormously. It desperately calls for a module system. The parsing is difficult because the extent and ambiguity of the C++ grammar. The compiler can be hardly manipulated, the reflection system is partial, and a language level garbage collector would just make life easier for everyone if the coder can decide to not use it in certain, well limited scenarios.&lt;/p&gt;
&lt;p&gt;In this series of blog post I document my experiments, understanding and contribution to the language D.&lt;/p&gt;
&lt;br /&gt;  &lt;a href="http://feeds.wordpress.com/1.0/gocomments/dcoding.wordpress.com/5/" rel="nofollow"&gt;&lt;img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/dcoding.wordpress.com/5/" /&gt;&lt;/a&gt; &lt;a href="http://feeds.wordpress.com/1.0/godelicious/dcoding.wordpress.com/5/" rel="nofollow"&gt;&lt;img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/dcoding.wordpress.com/5/" /&gt;&lt;/a&gt; &lt;a href="http://feeds.wordpress.com/1.0/gofacebook/dcoding.wordpress.com/5/" rel="nofollow"&gt;&lt;img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/dcoding.wordpress.com/5/" /&gt;&lt;/a&gt; &lt;a href="http://feeds.wordpress.com/1.0/gotwitter/dcoding.wordpress.com/5/" rel="nofollow"&gt;&lt;img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/dcoding.wordpress.com/5/" /&gt;&lt;/a&gt; &lt;a href="http://feeds.wordpress.com/1.0/gostumble/dcoding.wordpress.com/5/" rel="nofollow"&gt;&lt;img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/dcoding.wordpress.com/5/" /&gt;&lt;/a&gt; &lt;a href="http://feeds.wordpress.com/1.0/godigg/dcoding.wordpress.com/5/" rel="nofollow"&gt;&lt;img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/dcoding.wordpress.com/5/" /&gt;&lt;/a&gt; &lt;a href="http://feeds.wordpress.com/1.0/goreddit/dcoding.wordpress.com/5/" rel="nofollow"&gt;&lt;img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/dcoding.wordpress.com/5/" /&gt;&lt;/a&gt; &lt;img alt="" border="0" height="1" src="http://stats.wordpress.com/b.gif?host=dcoding.wordpress.com&amp;blog=28853676&amp;post=5&amp;subd=dcoding&amp;ref=&amp;feed=1" width="1" /&gt;</content>
		<author>
			<name>progician</name>
			<uri>http://dcoding.wordpress.com</uri>
		</author>
		<source>
			<title type="html">dcoding » D coding</title>
			<subtitle type="html">Adventures in native coding with the D Programming Language</subtitle>
			<link rel="self" href="http://dcoding.wordpress.com/category/d-coding/feed/" />
			<id>http://dcoding.wordpress.com/category/d-coding/feed/</id>
			<updated>2012-03-28T12:21:09+00:00</updated>
		</source>
	</entry>

</feed>

