<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>nihil architecture blogs</title>
	<atom:link href="http://blog.nihilarchitect.net/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.nihilarchitect.net</link>
	<description>random thoughts stupid people will find morally offensive and moral people will find stupidly offensive</description>
	<lastBuildDate>Mon, 20 Dec 2010 04:18:02 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Why I dislike LaTeX on a fundamental level</title>
		<link>http://blog.nihilarchitect.net/archives/416/why-i-dislike-latex-on-a-fundamental-level/</link>
		<comments>http://blog.nihilarchitect.net/archives/416/why-i-dislike-latex-on-a-fundamental-level/#comments</comments>
		<pubDate>Sun, 19 Dec 2010 08:02:24 +0000</pubDate>
		<dc:creator>niarch</dc:creator>
				<category><![CDATA[coding]]></category>
		<category><![CDATA[society]]></category>
		<category><![CDATA[LaTeX]]></category>
		<category><![CDATA[rant]]></category>
		<category><![CDATA[Semantics]]></category>
		<category><![CDATA[Separation of Presentation and structure]]></category>

		<guid isPermaLink="false">http://blog.nihilarchitect.net/?p=416</guid>
		<description><![CDATA[LaTeX is pretty much the standard for publishing mathematical documents, a pretty old standard too, and one I dislike on a fundamental level, already I should have acquired copious amounts of nerd-rage by writing this, but you know it turns me one when you guys are mad at me.
My main dislike is hardly the quality [...]]]></description>
			<content:encoded><![CDATA[<p><span class="title">LaTeX</span> is pretty much the standard for publishing mathematical documents, a pretty old standard too, and one I dislike on a fundamental level, already I should have acquired copious amounts of nerd-rage by writing this, but you know it turns me one when you guys are mad at me.</p>
<p>My main dislike is hardly the quality of the output—though that could really use some work too, despite what the liberal media may tell you, it&#8217;s far from the quality of a professional typesetter—it&#8217;s the language used to specify the output. The language to me is so daft and devoid of any reasonable thought, it feels like <code>goto</code>s all over the place again.</p>
<p>The year is 2010, Dijkstra has won, few modern languages still support the goto, those that do often require the code to have special privileges and/or be explicitly placed in some &#8216;unsafe&#8217; clause. However there are more things to healthy programming, say I&#8217;m programming some code which does some-thing with prime numbers, tries to find some pattern in it, just hypothetically, say that initially, I&#8217;m not that ambitious, and I investigate only the first 1 000 000 primes. Afterwards, I&#8217;m on a lead and I want to scoop it up a notch and go for the first 10 000 000, surely, if I programmed it scalably, I would only have to change the number <code>1000000</code> to <code>10000000</code> <em>once</em> in my code and the rest adapts right? If I run a gravity simulator, say I want to then try it for two times as much gravity? If I programmed this well I would have to change that number only once right? If I make some program to output a web-page, and I suddenly decide to output XHTML instead of HTML, surely if I did this well I would only have to change one switch some-where and the rest follows?</p>
<p>Okay, so let&#8217;s port this idea to <span class="title">LaTeX</span>, a real life example, a friend of mine was once collaborating, he used em-dashes in his version, his parter thought they were too prætentious, so he changed them to commata. He had to edit every single em-dash, a simple substitute didn&#8217;t work because it turns out they used <code>---</code> in more places than em-dashes. It was a frustrating task I can imagine. Now, it&#8217;s quite possible to just use <code>\medium-pause</code> every time and let this be output as em-dashes or as commata at one&#8217;s pleasure. But this is seldom done, and <span class="title">LaTeX</span> certainly doesn&#8217;t make this very convenient nor encourages this. Another quite simple example would be that you&#8217;re writing some-thing which uses the <span title="Yeah, I know, speed of information">speed of light</span>, and in a second edition you find out that the symbol conflicts with some other symbol in the same formula, you&#8217;d wish you had used <code>s_l</code> there or some other thing instead of <code>c</code> the entire time, now you have to edit it, probably missing a few, and introducing errors. In my world, I would have used some-thing like <code>[lightspeed]</code> from the start and bound that <em>concept</em> to a <em>symbol</em> at only one piece in the entire code, which is then easily changed. Alternatively, you might find out your publisher&#8217;s style doesn&#8217;t really like dots and wants crosses or spaces for multiplication, you&#8217;re stuck on editing that. You could just search and replace, but of course you want to check. Isn&#8217;t it easier to just specify multiplication each time and define the symbol associated with that at some higher level?</p>
<p>Another part we&#8217;re always getting hot about is re-use of code, <q cite="Edsger W. Dijkstra">Two or more, use a for!</q>, <span class="title">LaTeX</span> isn&#8217;t particularly friendly about this thing either, often you will find multiple æquations which re-use some basic concept into it which often leads to copy-ing and pasting of text. I once learnt that <q>as soon as you copy and paste your code, you&#8217;re doing some-thing wrong</q> and I agree with this maxim. Consider this simple example:</p>
<p><code type="LaTeX"><br />
$\land$ and $\lor$ distribute over each other, more formally:<br />
\begin{eqnarray}<br />
x \land (y \lor z) &#038;=&#038; (x \land y) \or x (\land z) \\<br />
x \lor (y \land z) &#038;=&#038; (x \lor y) \land x (\lor z)<br />
\end{eqnarray}<br />
</code></p>
<p>Splendid, I&#8217;d rather just use:</p>
<p><code><br />
\mutual_distribution(\land,\lor)<br />
</code></p>
<p>And define once how this is output, and then be done with it. I can change that template once then later if I want to make some changes. I&#8217;m to be honest surprised that <span class="title">LaTeX</span> automatically enumerates your æquations for you and you don&#8217;t have to do that yourself. And yes, it is possible with some hacking around to make such a template, but the syntax for it is so limited and confuzzling that almost no one does it, and it almost makes things less readable to begin with. I tried and I tried to make this happen a little more but the language was quite clearly never designed for it that well, and it&#8217;s madness and pain.</p>
<p><span class="title">LaTeX</span> lacks a <code>\Beta</code> on its own, quite obviously because it looks <em>visually</em> the same as <code>B</code> so why bother? Well, even if you were a dusty computer scientists who has a fetish with not keeping his mind ordered, it still begs the quæstion <q>in what typeface?</q>, it&#8217;s not unlikely that a typeface exists which for clarity puts Greek letters in a slightly different makeup, and I would not think this would be a bad idea, differentiating A and <span title="This is a capital alpha">?</span> in various manuscripts can be very handy. And this requires extensive workarounds in <span class="title">LaTeX</span>, to be expected from a tool coming from a time which prided itself on writing all possible code with the mentality of <em>not</em> looking ahead and taking into account the future. <span class="title">LaTeX</span> code manages to be a reasonable write-only language, an impressive feat considering you don&#8217;t even have to mentally follow the flow of computation, that its commenting syntax is so verbose that it discourages people from using them might be another part of the problem.</p>
<p>Another thing I don&#8217;t like is how it enters and closes math-mode, sure, if math-modes can&#8217;t nest? Why not take the same open and closing tag right? I am sure to speak for all of us when I say that never has debugging been such a pain as <span class="title">LaTeX</span> incorrect <span class="title">LaTeX</span> math-mode closing, the error messages are so enormously cryptic by misplacing a dollar sign that you often have no idea exactly which it is you misplaced and often when you got it to work you still have no idea what you did wrong. It&#8217;s like rebooting your computer when some-thing went wrong and you&#8217;re still not exactly sure on how you fixed it. It turns out that closing tags help error messages and help you find them. Maybe this is Donald&#8217;s savant mind speaking who makes no errors, but for us mortals this is damned annoying.</p>
<p>It&#8217;s quite clear that the base of this language was designed in a time when people were practically still cave-men scratching COBOL code in granite walls to keep track of how many mammoths they hunted down.</p>
<p>Finally, on a more meta-level. <span class="title">LaTeX</span>, well, just PDF or Postscript really, defines a lot of things which I feel a document ought not define. Yes, they are languages to specify the layout for a printing place, every pixel, every vector, and I feel that the only thing that should ever receive that data is the printer, or the person who checks it before it goes to the printer. The consumer should never receive that on his or her computer. Things like font size, font type, letter spacing, colour, text width, line spacing, these should all be properties of the <em>viewer</em> not of the document it reads. Supposedly <span class="title">LaTeX</span> is about legibility, and it has used some archaic myths about what is optimal legibility to algorithmically force that down our throats, in reality probably more Donald Knuth&#8217;s præferred style. In the end, legibility is subjective, dependent on person, varies through locus and time, has a genetic and an environmental component, what one person considers legible another does not. So people should be able to adjust those settings in their viewer, computers are powerful enough to calculate that on the fly nowadays. Especially since e-readers are coming up, why not use that advantage? </p>
<p>Some people have already done this, it&#8217;s called <dfn>separation of præsentation and content</dfn>, take apart what you are saying semantically, and how you are layouting what you say for the most part as you can. It&#8217;s scalable, it takes into account that the house style of the publishing magazine may later on change, it enables the same document to easily be published in multiple styles depending on the target audience, it also gives the audience itself control over the style if they receive it in digital format, and so on. I for one hate with a passion that new misodendric hype of basically 1 em line spacing in papers. I&#8217;m still not really sure if they actually hit enter twice after every line or make some switch that does that automatically for each line, but as they use <span class="title">LaTeX</span> I would not be surprised if they actually accomplished their treeslaughter by the former. Every time I see it, I would kill to have my PDF viewer implement a simple switch that could take that away, it reads both annoyingly and I&#8217;d like my grandchildren to have a plentiful supply of oxygen.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.nihilarchitect.net/archives/416/why-i-dislike-latex-on-a-fundamental-level/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Attire and work</title>
		<link>http://blog.nihilarchitect.net/archives/412/attire-and-work/</link>
		<comments>http://blog.nihilarchitect.net/archives/412/attire-and-work/#comments</comments>
		<pubDate>Sun, 19 Dec 2010 07:07:00 +0000</pubDate>
		<dc:creator>niarch</dc:creator>
				<category><![CDATA[Politics]]></category>
		<category><![CDATA[society]]></category>
		<category><![CDATA[discrimination]]></category>
		<category><![CDATA[job market]]></category>

		<guid isPermaLink="false">http://blog.nihilarchitect.net/?p=412</guid>
		<description><![CDATA[Okay, so let&#8217;s say you have to be operated. You go to meet your doctor, he shakes your hand, he&#8217;s friendly, he makes a little small talk, tries to ensure you that it&#8217;s not a big deal, that this operation is routine work for him and that he&#8217;s done it for years and the risks [...]]]></description>
			<content:encoded><![CDATA[<p>Okay, so let&#8217;s say you have to be operated. You go to meet your doctor, he shakes your hand, he&#8217;s friendly, he makes a little small talk, tries to ensure you that it&#8217;s not a big deal, that this operation is routine work for him and that he&#8217;s done it for years and the risks are really quite small, he&#8217;s friendly, and he seems genuinely concerned for your well-being. There&#8217;s just one catch.</p>
<p><em>He&#8217;s some-one who look to be in his twenties, and he has long, green hair and an eye-brow piercing.</em></p>
<p>Now, as you go to the operating table, you see him there again, he&#8217;s removed his piercing, his hair is tucked back, he&#8217;s wearing his white coat, his gloves, and he&#8217;s wearing an operating mask and all that good stuff. Obviously none of this interferes with his task at hand.</p>
<p>However he&#8217;s still a youthful bloke who&#8217;s got long green hair and an eye-brow piercing when he first introduces himself to his patients. The quæstion at hand is if people can, or should, be able to be refused for a job like this regardless of meeting all other qualifications because they don&#8217;t radiate the authority with that that they should.</p>
<p>Where-ever you go, laws regarding this are opaque at best, the concept of &#8216;discrimination&#8217; is vague and arbitrary. Discrimination was illegal when it was legal to not hire women into executive functions because they didn&#8217;t radiate authority enough. And it is still illegal this day while for a lot of legal things the only qualification one needs is to be older than a certain age. What is &#8216;discrimination&#8217; and what is not, is quite simply just translating the mass consensus of the people about &#8216;how far you can go&#8217;.</p>
<p>And quite obviously, there are a lot of people who would not feel that women radiate enough authority to be able to be a doctor. However not hiring women because of that rule is out of the quæstion in most western countries these days, that&#8217;s &#8216;discrimination&#8217;. And of course being a woman is irrelevant for one&#8217;s capabilities as a surgeon. Just as having green, long long and an eye-brow piercing is. However people grow a lot more sympathetic to requiring doctors to change that, because people might not feel safe then. Even though obviously it&#8217;s just conceding to their præjudices.</p>
<p>Of course, there is a fundamental difference between being a woman and having a piercing and green hair, you can change the latter easily, but not the former. Or is that entirely true? Quite absurdly one can say: <q>&#8216;You can also change your sex!</q>, and that&#8217;s quite true. But of course, a very big sacrifice to make for most people to be a doctor. But perhaps not bigger than for some people to live their lives in a hair colour they do not like just because some people are small-minded bigots?</p>
<p>Piercings and green hair are again different, you can take out a piercing quite easily, but to die your hair back and forth from every interview is quite cumbersome, to cut it and let it re-grow is again completely impossible.</p>
<p>But this is all still the public service. Let&#8217;s say you are a commercial entity with a for-profit <span xml:lang="fr">raison d&#8217;être</span>, if the law would require you to hire women, even though the sad reality is that hiring women in certain positions will simply mean less profit—then you&#8217;re stuck with that. You might even think that this is a sad thing and honestly want to give these woman a chance to prove themselves, but the reality is that you&#8217;re primary responsibility as a <abbr title="chief executive officer">ceo</abbr> is delivering profit to your shareholders, and not hiring women accomplishes that. You cannot let your political convictions interfere with your job, so to speak.</p>
<p>As said, what the law requires and what not of employers is opaque. However it seems to have been established some-what by præcedence that sex and ethnicity are not a quality you cannot hire people on. Even though it will eventually hamper your profit because the world is simply filled with small-minded bigots. You can also argue that this has a good reason, as you cannot (easily) change these qualities of yourself. It&#8217;s imaginable that you for same reason also can&#8217;t disqualify short people on the argument that clients are simply still small-minded bigots.</p>
<p>But it seems to go deeper than that. Long hair poses a risk in various job situations, but women seem to never be required to cut their hair short even though it could hamper their performance. Women simply in various cultures conventionally have long hair, and you can&#8217;t ask them to cut it, because it would be seen as quite hard for a woman to live without long hair should she desire to have it.</p>
<p>However, say you&#8217;re a male waiter in a classy restaurant, it&#8217;s quite imaginable that they require you to cut your long hair. Admittedly it hampers with your job performance, and not even for a tangible reason, but only because the world is filled with small-minded bigots. But because it&#8217;s &#8216;unconventional&#8217; for males to have long hair, this can be required of them. Even though some security risks that are far more important cannot require women to cut their hair short. It would be unsurprising for me if some men have just as much troubles having short hair as some women. This can also be a cultural thing though, indeed, to ask a Sikh to cut his hair, a thing his religion forbids, is again more complicated.</p>
<p>A fundamental difference between public services like health-care and commercial things is though that health-care is seen as a right provided free of charge, at least in the civilized world outside of that isolated greatest nation in the world. While those commercial things are privileges you pay, if you pay for it, should you not be able to demand that you are assisted by some-one who is not a foreigner if you so please? While if it&#8217;s a thing the government provides free of charge, you have nothing to complain, take it or leave it. If you don&#8217;t like it, then try to pay a doctor out of your own pocket.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.nihilarchitect.net/archives/412/attire-and-work/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Why I don&#8217;t think that Terran is currently significantly over-powered.</title>
		<link>http://blog.nihilarchitect.net/archives/404/why-i-dont-think-that-terran-is-currently-significantly-over-powered/</link>
		<comments>http://blog.nihilarchitect.net/archives/404/why-i-dont-think-that-terran-is-currently-significantly-over-powered/#comments</comments>
		<pubDate>Sun, 10 Oct 2010 12:52:07 +0000</pubDate>
		<dc:creator>niarch</dc:creator>
				<category><![CDATA[gaming]]></category>
		<category><![CDATA[OP]]></category>
		<category><![CDATA[over-powered]]></category>
		<category><![CDATA[StarCraft]]></category>
		<category><![CDATA[StarCraft 2]]></category>
		<category><![CDATA[Terran]]></category>

		<guid isPermaLink="false">http://blog.nihilarchitect.net/?p=404</guid>
		<description><![CDATA[Yap, I actually play StarCraft II, as Protoss in fact, the one race full of whiners saying that Terran is OP. A stance with which I&#8217;m going to have to disagree.
Now, what&#8217;s often put forth is that there are no Protoss gateway units that can deal with marauders. Empirically if this was true then why [...]]]></description>
			<content:encoded><![CDATA[<p>Yap, I actually play <span class="title">StarCraft II</span>, as <em>Protoss</em> in fact, the one race full of whiners saying that Terran is <abbr title="over-powered">OP</abbr>. A stance with which I&#8217;m going to have to disagree.</p>
<p>Now, what&#8217;s often put forth is that there are no <span class="keyword">Protoss</span> gateway units that can deal with marauders. Empirically if this was true then why don&#8217;t Terrans just always march in with only marauders at early game to take the game with nothing to stop them? Rationally it&#8217;s more subtle. A naïve error a lot of Protoss players make is too much faith in the Stalker, confusing it too much for the Dragoon of <span class="title">Brood War</span>. Stalkers actually do only 10 damage per 1.44 time units, and 14 if the unit they deal against counts as armoured. This contrasts the zealots uniform damage of two attacks of 8 every 1.12 time units. For the marauder with 1 armour, this comes down to the Zealot doing 11.7 <abbr title="damage per second">dps</abbr> and the stalker 9. Of course, the zealot is melee and the stalker ranged and can thus be kited. But keep in mind that the marauder does double the damage to the stalker it does to the zealot because the stalker counts as armoured.</p>
<p>However, there is a crucial unit a lot of players forget, the Sentry, which is perhaps the one hard counter to the marauder the gateway has to offer. Keep in mind that the sentry is also ranged and does not count as armoured and more importantly, it offers an array of special abilities that do not only benefit itself but all units near it. Kiting becomes hard to do with a forcefield at your back. If you look at them, Sentries are extremely powerful units, their dps is very close to the Stalker versus unarmoured, and Protoss is the only race which gets a tier-1 spell-caster with impressive abilities at their disposal. Imagine if you could beat them without the Sentry? Surely then with the Sentry Protoss would be severely over-powered here? The sentry is your answer against Marauders, Zerglings and Roaches with force fields and against Marines and Mutalisks with the guardian shield. Of course, this requires some <acronyn title="micro-management">micro</acronyn> to pull it off. But then again, so does kiting and getting a good surround with Zerglings? Sentry does require click reflexes though.</p>
<p>Then the argument that&#8217;s often raised is Ghosts, who can <abbr title="electro-magnetic pulse">EMP</abbr> your units shields away and are supposedly too low in the tech tree. Yes, I agree that Ghosts are very low in the tech tree for their speciality and power. But don&#8217;t all races have things like that? When Protoss gets a cybernetic core down, it unlocks a plethora of upgrades including flyer upgrades. It allows for no less than <em>three</em> advanced structures to be built as well. And when we get the Robotics Facility down, we instantly get three units unlocked, and all three are quite specialized and powerful. The Ghost academy just unlocks ghosts. You might as well say that Zerg is OP because a hatchery is obviously superior to a nexus—we can&#8217;t really spawn like 7 probes at the same time, or things like roaches at nexus can we?—and costs less too. Of course, this is to make up for other deficiencies, such as that they can&#8217;t really spawn roaches at any other place.</p>
<p>The Tech Lab may not be required for the factory to be built, in the end, not getting one before it is a highly uncommon move, so you could say that after the Tech Lab they only have the factory and the ghost academy. While we have three advanced buildings. Of course, they get the orbital command and the bunker, but our turrets can also fire at the ground, and we don&#8217;t have to put infantry in them for them to function, of course, our turrets can&#8217;t shelter infantry either. Of course, the Tech Lab isn&#8217;t really comparable to the Core, its much cheaper and more easily built, but our Gateways don&#8217;t really stop producing when we build our Core do they? Also, we only need one, and not re-make it for every Gateway we put down. So in the end, Protoss has some other parts where our tech tree is quite luxurious.</p>
<p>The next thing of course is the dreaded <abbr title="Marines, Marauders, Medivacs, Ghosts, Vikings"> MMMGV</abbr>, the unstoppable ball of Marines, Marauders, Medivacs, Ghosts and Vikings, no Protoss army can withstand this, and depending on the size of this, I&#8217;d say it&#8217;s indeed very hard to withstand this. Just like an unstoppable ball of Zealots, Stalkers, Sentries, Immortals, Colossi and Phoenices is essentially unstoppable depending on how large it is. Especially when they think its twice as large due to all the hallucinations (people use this long not often enough). A way to stop either is simply having a lot of Dark Templar in your mix, for one. A huge ball of Brood Lords, Ultralisks, Hydralisks, Zerglings and Corruptors is probably unstoppable too. The issue is not as much how to &#8216;counter&#8217; this as how to stop someone from getting such a deadly maxed-out army.</p>
<p>In the case of the more modest <abbr title="Marines, Marauders, Ghosts">MMG</abbr> versus High Templars and some gateway stuff, neither counters the other really, it&#8217;s just who shoots first, if the storms go down before the EMP does then Protoss wins, if EMP goes down before the storms and Terran wins. But again, having some Dark Templar in the mix here can really turn the tide.</p>
<p>Then there&#8217;s œconomy, say one manages to kill your workers, a really dirty trick like suddenly Infestors unborrowing near all your workers, and bam, a fungal growth, they burrow and unborrow again for a second and all your workers are gone. In the case of Terran your œconomy still has a drive with a sudden mass call-down of MULE&#8217;s. In the case of zerg, one spawn-larva later on all your hatcheries and you 21 drones back on track, but in the case of Protoss, you have to start from scratch, painfully chronoboosting Probes.</p>
<p>However, let&#8217;s say it&#8217;s in reverse, all your production facilities are dead in an attack but your workers and nexus remains, it takes only one probe of the line for a moment to get it all back provided you banked enough. Terran would have to keep 18 workers occupied, Zerg would just lose 18 drones to that. Or say someone suddenly heavily supply blocks you with some attack, Protoss, you just warp in eight pylons with one probe and sit back and wait as long as it takes for one pylon. With Terran you have to take off 8 SCV&#8217;s, with Zerg you have to sacrifice eight larva which could be other units.</p>
<p>I actually several times managed to become the victor after my entire base was raided while I was ahead in some sneaky thing like suddenly a lot of cloaked banshees appearing while I had a superior army and was wrecking the other&#8217;s base or a last ditch void ray effort or dark templar. You need just a couple of probes to survice to get yourself back on track if you&#8217;re Protoss and rebuild it all at your expansion or just a completely random place if you have the army to defend it until your facilities are back up. I once managed to get back from as few as 4 probes escaping the sudden sentry+dark templar warp in.</p>
<p>So why do people say Terran is over-powered? Even the <a rel="external reference" title="Battle.net:Developer's Corner" href="http://us.battle.net/sc2/en/blog/882511">statistics</a> don&#8217;t really seem to back this up.  Maybe it&#8217;s the parroting effect? Some people started to say it on the <span class="title">Battle.net</span> fora and suddenly it was all over the place. Often when people start posts though complaining about it when you analyse the replay you find out that they made some severe errors and where behind in <acronym title="macro-management">macro</acronym> the entire time. Maybe with this new <q>Terran is over-powered</q>-thing, people have found a new way to blame their losses on?</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.nihilarchitect.net/archives/404/why-i-dont-think-that-terran-is-currently-significantly-over-powered/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>The plaza close to Ground Zero</title>
		<link>http://blog.nihilarchitect.net/archives/397/the-plaza-close-to-ground-zero/</link>
		<comments>http://blog.nihilarchitect.net/archives/397/the-plaza-close-to-ground-zero/#comments</comments>
		<pubDate>Mon, 23 Aug 2010 05:28:46 +0000</pubDate>
		<dc:creator>niarch</dc:creator>
				<category><![CDATA[Politics]]></category>
		<category><![CDATA[society]]></category>
		<category><![CDATA[9/11]]></category>
		<category><![CDATA[Ground Zero]]></category>
		<category><![CDATA[Islam]]></category>
		<category><![CDATA[Mosque]]></category>
		<category><![CDATA[People]]></category>
		<category><![CDATA[rant]]></category>

		<guid isPermaLink="false">http://blog.nihilarchitect.net/?p=397</guid>
		<description><![CDATA[There&#8217;s been a lot of confusion and fighting over this so called &#8216;Mosque&#8217; that&#8217;s being built at Ground Zero. Opponents noting the insensitivity, proponents saying this is religious freedom and one of the principles that Nation Under God was built on. Then there&#8217;s still the debate of Okay, it should be legal, religious freedom says [...]]]></description>
			<content:encoded><![CDATA[<p>There&#8217;s been a lot of confusion and fighting over this so called &#8216;Mosque&#8217; that&#8217;s being built at Ground Zero. Opponents noting the insensitivity, proponents saying this is religious freedom and one of the principles that Nation Under God was built on. Then there&#8217;s still the debate of <q>Okay, it should be legal, religious freedom says it is, but is it wise?</q>.</p>
<p>Well, wise, maybe not, probably not, but only because of the stupidity of man. Why is this &#8216;insensitive&#8217;? Is it &#8216;insensitive&#8217;, if a crime is done by Christian people to place a church close to that site? Many of the most infamous <abbr title="United States of America">US</abbr> criminals were Christians of course. Don&#8217;t ask me how they combine this, and don&#8217;t ask me how people combine Islam with suicide bombings either; people find their ways. There seems to be a sliding scale of acceptability of bigotry here. If your girlfriend was a bitch, to hate all women thenceforth is unacceptable and bigoted. If your boyfriend was one, to hate all men, well, that&#8217;s more acceptable. If you&#8217;re robbed by a black man, to then say all black people are scum goes too far and is præjudiced. But to think the same after being robbed by some obscure ethnicity such as Slovenes, that&#8217;s more acceptable again. To don&#8217;t trust punkers after a group of them beat you up, that&#8217;s just a nice argument to demonstrate why supposedly they [all] are scum.</p>
<p>So what is this &#8216;considering the sensitivity of the issue&#8217; really but compromising for the bigots that can&#8217;t see the difference between different people who just happen to all profess being &#8216;Islamic&#8217;; that&#8217;s really all it is. Islam, unlike various schools of Christianity is not monolithical in nature, there is no One Supreme Authority such as a pope, there are no churches and people above churches, no bishops and so on. There are people who say they are Muslim, and they of course each all mean a totally different thing with it. For some, being Muslim is little more than faith into The One God and his righteousness and almightiness, and to others, this involves covering women in elaborate cloths. So basically, wise as it may be to be &#8217;sensitive&#8217; to avoid further polarization, it&#8217;s still basically giving people what they want for their bigotry and ignorance.</p>
<p>And ignorance is quite the word to describe what most people know of this place, on the right we have a picture of how it&#8217;s going to look. Looks kind of like modern architecture nay? And it&#8217;s more like a <em>plaza</em> than a Mosque really. These are some of its features accordingly <a href="http://www.nydailynews.com/ny_local/2010/05/06/2010-05-06_plan_for_mosque_near_world_trade_center_site_moves_ahead.html" title="New York Daily News:Plan For Mosque Near World Trade Center Moves Ahead" rel="external reference">New York Daily News</a>:<br />
<img class="picture right-cleared" src="http://assets.nydailynews.com/img/2010/05/06/amd_wtc_mosque.jpg" alt="The 'Mosque'" /></p>
<ul>
<li>An auditorium</li>
<li>A theatre</li>
<li>A swimming pool</li>
<li>A child-care area</li>
<li>A basketball court</li>
<li>A performing arts centre</li>
<li>A book-store</li>
<li>A fitness centre</li>
<li>A restaurant, serving kosher dishes</li>
<li>&#8230; last but not least, an Islamic praying centre</li>
</ul>
<p>Obviously this thing has more in common with a plaza than a Mosque, indeed it&#8217;s modeled after <a href="http://en.wikipedia.org/wiki/92nd_Street_Y" rel="external reference" title="Wikipedia:92nd Street Y">92nd Y</a>. It&#8217;s just a plaza with a place people can also pray, how insensitive.</p>
<p>To put matters worse, the thing is not planned <em>at</em> <span class="title">Ground Zero</span> at all, rather so <em>near</em>, three blocks to be præcise&#8230; do we really have to pay that much for bigots that people who are part of some religion cannot built a modern art centre three blocks away from some sight that other people who are part of the same religion did some crime?</p>
<p>And I think the simple answer is <em>yes</em>, it&#8217;s stupid, but we have no other option. It will polarize people even more and lead to more deaths if they do not give. Just because people are so damned <em>stupid</em> and do so damned little research. Stupid people—alas—are surprisingly powerful when in large groups, and alas surprisingly numerous. Thank you Sarah.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.nihilarchitect.net/archives/397/the-plaza-close-to-ground-zero/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Perpetration of myths</title>
		<link>http://blog.nihilarchitect.net/archives/390/perpetration-of-myths/</link>
		<comments>http://blog.nihilarchitect.net/archives/390/perpetration-of-myths/#comments</comments>
		<pubDate>Mon, 21 Jun 2010 11:07:35 +0000</pubDate>
		<dc:creator>niarch</dc:creator>
				<category><![CDATA[Politics]]></category>
		<category><![CDATA[society]]></category>
		<category><![CDATA[child raising]]></category>
		<category><![CDATA[myth]]></category>
		<category><![CDATA[pet care]]></category>
		<category><![CDATA[rant]]></category>
		<category><![CDATA[scientific method]]></category>

		<guid isPermaLink="false">http://blog.nihilarchitect.net/?p=390</guid>
		<description><![CDATA[Friend of mine&#8217;s recently got a tortoise and commented to that he seems to reject food the information books and sides all say his species should really like, and seems to præfer food said media never even mentioned. But looking at such media like Tortoise Care the things that are immediately noticeable are:

The source does [...]]]></description>
			<content:encoded><![CDATA[<p>Friend of mine&#8217;s recently got a tortoise and commented to that he seems to reject food the information books and sides all say his species should really like, and seems to præfer food said media never even mentioned. But looking at such media like <a class="title" rel="external" title="Tortoise.org.uk:Tortoise Care" href="http://www.tortoise.org.uk/articles/6853/Tortoise-Care">Tortoise Care</a> the things that are immediately noticeable are:</p>
<ul>
<li>The source does not refer to many rational arguments, nor to any empirical research that can make compelling its claims.</li>
<li>For a very large portion of the things the source claims, testing the accuracy of it scientifically would either be very unethical and tortoise-abuse, or simply downright theoretically impossible.</li>
</ul>
<p>Which seems to be the trend on about <em>all</em> sites, books, professionals or what-ever that seem to deal in the care of pets or even children, many child psychologists and pædagogues will claim various things about child care that should raise the eye-brow &#8216;If they ever tested this hypothesis this means that they for 16 year long mistreated a group of children, lucky control group there&#8230;&#8217;, also, once in a while, these theories are outright <em>rejected</em>, again, with no real empirical or rational argument to support it. No-one nowadays will claim your child needs a substantial amount of physical punishment to grow up, nowadays that&#8217;s considered detrimental to the development of a child. Teenagers masturbating used to be a thing best prævented, nowadays part of a child&#8217;s &#8216;natural development&#8217;&#8230; I hope we all know that phrases like &#8216;natural&#8217; are best avoided in serious scientific literature, especially when used to communicate a value judgement about some practice&#8230;</p>
<p>The term <q>value judgement</q> might be essential, all these sources are inhærently <em>præscriptive</em>; sure, they bring it as descriptive, as simply describing what actions supposedly hurt a tortoise or a child. But in the end the main effort of people communicating and originating such information is to change the way people behave, not to simply inform them with knowledge for the sake of knowledge. Researches into things which can cause certain things in animals that have no such præscriptive character tend to indeed be based on the actual scientific method, whence things such as <q>your child should not be exposed to too much cursing</q> come, I haven&#8217;t an idea. Or wait, I do, quite obviously people just don&#8217;t want their children to curse and go invent whole faux-sciences like &#8216;child psychology&#8217; just to give this obviously moralistic notion some false illusion of a &#8217;scientific character&#8217;.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.nihilarchitect.net/archives/390/perpetration-of-myths/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Restrictions and clearer languages</title>
		<link>http://blog.nihilarchitect.net/archives/363/restrictions-and-clearer-languages/</link>
		<comments>http://blog.nihilarchitect.net/archives/363/restrictions-and-clearer-languages/#comments</comments>
		<pubDate>Mon, 14 Jun 2010 12:36:00 +0000</pubDate>
		<dc:creator>niarch</dc:creator>
				<category><![CDATA[coding]]></category>
		<category><![CDATA[society]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[dynamic typing]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[static typing]]></category>
		<category><![CDATA[type checking]]></category>

		<guid isPermaLink="false">http://blog.nihilarchitect.net/?p=363</guid>
		<description><![CDATA[After reading about this new C# language, some design choices of it baffled me, which were part of a new trend, I&#8217;m not talking about lambda abstractions, about some object oriented features, about things that drastically reduce performance, I&#8217;m talking about if(x = y) being illegal. Conditionals in C# apparently require their value to be [...]]]></description>
			<content:encoded><![CDATA[<p>After reading about this new <span class="title">C#</span> language, some design choices of it baffled me, which were part of a new trend, I&#8217;m not talking about lambda abstractions, about some object oriented features, about things that drastically reduce performance, I&#8217;m talking about <code language="C#">if(x = y)</code> being illegal. Conditionals in <span class="title">C#</span> apparently require their value to be of the type <code>bool</code>, if the compiler cannot prove they are of type <code>bool</code>, this is considered a static compile time error.</p>
<p>Now, to some programmers, <code language="C#">if(x = y)</code> would be naïvely perceived as a typo, or applying basic rules to a C-syntax. But it&#8217;s actually quite possibly intended code in many languages. <span class="title">C</span> popularized an interesting concept, assignment wasn&#8217;t a statement, but an <em>expression</em>, it had a well defined value, namely, the value that was being assigned. This allowed for &#8216;chain assignments&#8217; : <code>a = b= c = d</code>, and on most architectures this maps most efficiently to machine operations. It&#8217;s also a rather common way in JavaScript to loop over some list, and for that reason the &#8216;next&#8217; operation yields <code>null</code> rather than an error if there is no next, stopping the loop.</p>
<p>It&#8217;s also to many programmers a source of frustration, typos can often lead to unintended code, <code>if(x = 5)</code> is of course always true. Though a lot of programmers have taught themselves to use <code>if(5 == x)</code> to catch those errors early. So <span class="title">C#</span> has chosen to favour the latter problem, a restriction on power and expressiveness to protect people against themselves. Even though the problem could have just as easily been avoided by using <code>:=</code> for assignment, oh well.</p>
<p>And this seems to be the trend more and more, restrictions and restrictions on power to protect people &#8216;against themselves&#8217;, my rants on psychiatry and society should make it clear that I am generally opposed to protect people &#8216;against themselves&#8217;. Let people do what they want, maybe they do a thing they&#8217;ll regret, maybe they&#8217;ll stop doing it afterwards. It&#8217;s better to teach a child to not touch a pan by letting it burn its fingers then by just saying &#8216;don&#8217;t do it&#8217; and the child having grown up knowing it shouldn&#8217;t do it, but never really knew why. And this is also exactly what these restrictions do, instead of teaching people good programming, and the theory behind it and why they shouldn&#8217;t do certain things, you just don&#8217;t allow them to do it, they won&#8217;t do it because they have no choice, and they&#8217;ll never understand why they shouldn&#8217;t and they&#8217;ll be kept ignorant forever. My hunch is that there are more programmers on the planet that don&#8217;t realize why they use <code>==</code> &#8216;in an if-statement&#8217; and <code>=</code> outside it than those who realize why this is done. Which really was one of the beautiful things of C, it gave the programmer choice, and indeed, at some points it does pay to be able to use assignment inside a conditional. <code>while(obj = array[i++]) ...</code> is code which I very commonly use in languages where accessing outside of the bounds of an array yields <code>null</code> rather than an error, and it probably was designed so for this purpose. If this <span class="title">C#</span> idea catches on, people will probably be kept more and more ignorant and in the end completely be obscure to the fact that<code>==</code> is a binary operator, just like <code>+</code>.</p>
<p>A thing people often misunderstand about this issue is static versus dynamic typing, often things like <q>In statically typed languages, variables have a type, in dynamically typed languages, values have a type.</q> are uttered, quite a crude approximation. Static in most context is the same as &#8216;lexical&#8217;, a statically typed language is designed so that &#8216;types&#8217; can be inferred from analysing source code alone without running it or computing any values. Static typing is older, and less powerful than dynamic typing, but also more restrictive. Static typing is also easier to implement, for this reason, when the first high level languages came, people had the interesting idea of coming up with &#8216;type declarations&#8217;, so that a compiler could analyse these during compilation and safeguard a programmer against errors whose result may be well defined in machine term operations, but whose result is also &#8216;nonsensical&#8217; to any human reader. Applying float addition to integers is a perfectly defined operation that produces a new natural number in binary base which you can interpret as whatever you want, a character, an unsigned integer, a signed integer, a float, a four-character ASCII string, it&#8217;s all about <em>interpretation</em> of that scalar ordinal value. However in any of these interpretations, to human readers it&#8217;ll most likely not make any &#8217;sense&#8217;. So if in the source code of programs variables of the &#8216;wrong&#8217; type were used together, <em>lexically</em>, the code wouldn&#8217;t compile, and signal an error. In static typing, this can just be inferred from source code.</p>
<p>Dynamic typing is some-thing different, more powerful, and more dangerous, &#8216;dynamic&#8217; in this context has the usual meaning of &#8216;only known when the code is run&#8217;, in dynamic tying, values carry a label, which is checked when operations are applied, if it doesn&#8217;t match, a runtime error or exception is raised. Dynamic typing was a novelty due to <span class="title">Lisp</span>, a language in which source code itself was dynamic, a lexical analysis was insufficient to determine if types wouldn&#8217;t conflict, because the source code itself was no longer static. Other languages adopted this then-performance-costly idea because of the raw power it afforded, the downside is that programmers again had to manually verify their code and follow the logic of it to ensure that type errors would not occur. Which in statically typed languages can be proven by the compiler.</p>
<p>And <em>proven</em> is a very important word here, it can be proven by a compiler, but not <em>decided</em>, it&#8217;s theoretically impossible to <em>decide</em> if a type error is going to occur lexically. Where deciding means that all programs you reject will have type errors, and all you accept will not. Compilers only offer the guarantee that accepted programs will not have them. It&#8217;s quite possible that a rejected program will also not have it, but as long as the compiler can&#8217;t prove it, it will reject. This is a pretty awkward mentally. &#8216;I do not accept your program, for I cannot show it will work.&#8217;, rather than &#8216;I do not accept, for I can show that it will not work&#8217;, however, though the latter path is also possible, choosing it will necessarily leave open the option of type errors. A trivial example would be:</p>
<p><code class="block">{int a, b; float c; a = true ? b : c;}</code></p>
<p>This will usually be rejected in statically typed languages, even-though a type error will never occur from this, of course, this example is quite useless but a more useful example would be:</p>
<p><code class="JavaScript block">function concact(x,y) {<br />
   if("array" == typoeof x &#038;&#038; "array" == typeof y)<br />
     return (new Array).append(x,y);<br />
   else if ("string" == typoeof x &#038;&#038; "string" == typeof y)<br />
     return x + y;<br />
   else if("number" == typoeof x &#038;&#038; "number" == typeof y)<br />
     return x + y;<br />
   else return null;<br />
}</code></p>
<p>Dynamically typed languages often offer facilities for runtime type-checking to choose a program flow, the same thing happened as above, a statically typed language would reject this example, even though for whatever input it may get, a type error cannot possibly occur within this function, a compiler has no way to prove this algorithmically from a lexical analysis. Lexically the function <code>+</code> which applies to two numbers is applied to the same variables in the same lexical environment whereon <code>array_append</code> which applies to two arrays is also applied. The compiler cannot prove no type error is going to occur. Many people who coded in &#8216;archaic&#8217; static languages often felt the pain of having to re-write and overload functions that do the exact same thing that have to deal with both integers and floats, but templates and generics did offer a <em>marginal</em> solution.</p>
<p>The real rescue for this problem in statically typed languages is <a href="http://wikipedia.org/wiki/parametric_polymorphism" title="Wikipedia:Parametric polymorphism" rel="external reference" class="keyword">parametric polymorphism</a>, where types are not constants, but variables. The function above is then &#8216;typed&#8217; as simply &#8216;taking two identical types, producing a value of same type, or null&#8217;.</p>
<p>Static typing is not only a restriction on programmers to &#8216;protect them against themselves&#8217;, it&#8217;s also taking with it a lot of things that need no protecting. It&#8217;s banning cars because some of them are unsafe, and taking the safe one&#8217;s with it because you have no way to infer <em>præcisely</em> which are safe.</p>
<p>Other languages have evolved a different tactic, they aim to make their syntax &#8216;clear&#8217;, a well known and ridiculously failed example is a certain language where the now ubiquitously readable action of <code class="C++">C++;</code> would be similarly expressed as <code class="Cobol">ADD 1 TO COBOL GIVING COBOL</code>, as it turned out, use and conventions make readability, not natural language. Though the latter example is a lot clearer to people never having programmed. The sheer mass of exposure to the former form makes it immediately clear. A dynamically typed and less extreme example would be:</p>
<p><code class="Python block">def factorial(n):<br />
  if x > 1:<br />
    return factorial(n - 1)<br />
  else:<br />
    return 1</code></p>
<p>Python, often using English words, some-what reads like English, <q>define factorial in n: If x is greater than 1, return factorial of n minus 1, else return 1</q>. It has shown that it helps some people to read the code aloud in their mind, one of the ancestors of Python has a wholly different vision:</p>
<p><code class="Scheme block">(define (factorial n) (apply * (range 1 n)))</code></p>
<p>Or at least how I would write it, people often say that <span class="title">Lisp</span> is &#8216;unreadable&#8217; but I beg to differ, in my opinion <span class="title">Lisp</span> code is exceptionally clear, consistent, there is no such thing as operator præcedence, not only is the delimiting of lexical blocks explicit, the limit of an expression is, the range of an operation is and so on, with syntax highlighting there is no confusion if the code you edit is still inside of the scope of your control structure and so on, the one thing is, it&#8217;s impossible to read it like English. Why does infix notation exist even though it&#8217;s inconsistent, is it more clearer due to conventions, or because <code>x = y</code> can be read as &#8216;x is y&#8217; in English?</p>
<p>I know that to be able to read it as English or to be able to use layout indentation doesn&#8217;t work for me. I find myself counting invisible characters in Python and then summing them to determine block structure. I like the fact that in <span class="title">Scheme</span>, what it does is clear from a simple rule that requires no thought at all, the value of evaluating a list is the evaluation of the head as an expression applied to the evaluation of the other forms. But I&#8217;ve found that most people like to see &#8216;a variable&#8217; as being identical to the value, rather than evaluating to a value.</p>
<p>Another thing lately while discussing some features of Clojure is when I found that most Clojure programmers see &#8216;a list&#8217; as &#8216;an ordered collection&#8217; for all purposes not that different from a vector. Thinking about it that way just gives me shrivels when programming, &#8216;a list&#8217; to me is a binary tree which on its outer right leave points to a special <code>nil</code> constant, or that constant itself. This is what I &#8217;see&#8217; conceptually when I work with lists, when I get their head or their tail. I also found out there an interesting differing view in that those that advocated against using <code>cadddr</code> in lieu of simply <code>fourth</code> found themselves translating &#8216;the fourth item of the list&#8217; to &#8216;the head of the tail of the tail of the tail&#8217; of the list. Where those that insisted on <code>cadddr</code> being clearer found themselves wanting &#8216;the car of the cdr of the cdr of the cdr of the pair&#8217; and thinking &#8216;That would be uumm, the fourth of the list.&#8217;. The Zen of Python famously includes <q>There should be only one obvious way to do it.</q>, I find that when people have such conceptions about &#8216;clear code&#8217;, they forget that different people have a differing view on &#8216;clear code&#8217;, many people&#8217;ll call <span class="title">APL</span>, Forth or <span class="title">Lisp</span> a mistake because the code is unreadable, users of either often passionately disagree and say a program is instantly readable and very clear. The fact that these languages have endured so long should point to this. But they do have in common that they can&#8217;t be read out loud in English. I&#8217;m a visual thinker, most people I know that defend <span class="title">Lisp</span> are so likewise, maybe that explains some things. I never &#8216;read my code aloud&#8217;, I don&#8217;t think English is a very good language to express mathematical or sequential logic in. Notation like <code>forall x forall y : ( forall z : ¬(z in y)) -> x + y = x</code> is a lot clearer than &#8216;For all x for all y, if for all z, z is not in y, then x plus y æquals x&#8217;, but this is often shortened down to &#8216;x plus zero is always x, where we encode zero as the empty set.&#8217; Still, that doesn&#8217;t define the idea &#8216;empty set&#8217;. I personally rather see code as what it is, a series of expressions evaluating to a value, that value then taken as the value of an outer expression to work with. Different people, different methodology. Which is also a reason I don&#8217;t think people should be restricted, different restrictions work differently for different people.</p>
<p>From my perspective though, seeing code as English is a <em>bad</em> idea and I can imagine that people make errors like <code>if(x = y)</code> where they mean <code>if(x == y)</code>, once you see them both as binary in the same vein of <code>+</code> where the former simply evaluates to its second operant always and has the <em>side effect</em> of changing the value of the memory location the first points to that of the second. And the latter operation evaluates to <code>true</code> or <code>false</code> depending on the æquality of both. But some instead &#8216;choose&#8217; to read <code>if(x == y) a = b;</code> as &#8216;if x is y, then a is b&#8217;, which is where the trouble begins is my hunch. It&#8217;s a very approximate and awkward simulation of assertive mathematics, programming language are not assertive and do not constrain their variables concordantly the truth of the termination value.</p>
<p>Of course, I said I was averse to protecting people &#8216;from themselves&#8217;, I have nothing against protecting people &#8216;from others&#8217;. I think it&#8217;s perfectly acceptable that an aviation company demands its software be written in a very type safe and very restrictive language. But ideally this should already be done by people who&#8217;ve learnt the hard way what a simple typo can cause and understand <em>why</em> the restrictions are there and what exactly they prævent. Many people nowadays start learning programming with <span class="title">C#</span>, ideally people should be taught programming in a language without any type checking at all to firmly grasp the difference between float and integer operations.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.nihilarchitect.net/archives/363/restrictions-and-clearer-languages/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>General elections</title>
		<link>http://blog.nihilarchitect.net/archives/378/general-elections/</link>
		<comments>http://blog.nihilarchitect.net/archives/378/general-elections/#comments</comments>
		<pubDate>Thu, 10 Jun 2010 18:12:52 +0000</pubDate>
		<dc:creator>niarch</dc:creator>
				<category><![CDATA[Politics]]></category>
		<category><![CDATA[science]]></category>
		<category><![CDATA[Dutch General Election 2010]]></category>
		<category><![CDATA[Far Right]]></category>
		<category><![CDATA[Geert Wilders]]></category>
		<category><![CDATA[Islamophboia]]></category>

		<guid isPermaLink="false">http://blog.nihilarchitect.net/?p=378</guid>
		<description><![CDATA[General elections have just been in this district-less country, as it seems, The Christian Democrat Appeal (CDA), the People&#8217;s Party for Freedom and Democracy (VVD), and the Party for Freedom (PVV) have the majority they need by one seat in the parliament, they have 76/150 seats between them, enough to support themselves a coalition in [...]]]></description>
			<content:encoded><![CDATA[<p>General elections have just been in this district-less country, as it seems, The <span class="title">Christian Democrat Appeal</span> (<abbr title="Christen Democratisch Appel">CDA</abbr>), the <span class="title">People&#8217;s Party for Freedom and Democracy</span> (<abbr title="Volksparty voor Vrijheid en Democratie">VVD</abbr>), and the <span class="title">Party for Freedom</span> (<abbr title="Partij voor de Vrijheid">PVV</abbr>) have the majority they need by <em>one</em> seat in the parliament, they have 76/150 seats between them, enough to support themselves a coalition in our parliamentary constitutional monarchy. A thing some monkeys are satisfied with, and some other monkeys fear.</p>
<p><span class="title">PVV</span> being the important factor here, a party that&#8217;s spun of from the <span class="title">VVD</span>, probably internationally, and nationally known best, nay only for its leader, the enigmatic, charismatic and controversial <span class="person">Geert Wilders</span>; in the eyes of some monkeys, but not his own, a racist and most importantly <span class="neologism">Islamophobe</span>. As people&#8217;d expect, he initially got most of its vote from the lower-educated &#8216;common man&#8217;, but this trend has been decreasing slightly recently. He is partially one-issue, focussing a lot on the problems Islam brings, but he also has other issues, some his voter-base don&#8217;t know for a large deal. For instance, he wants the Dutch flag standing proudly on all official buildings, wants to have baby monkeys sing the anthem when classes start, focus more on getting them to know Dutch history, but conversely, wants to look into abolishing the international Dutch football-monkey team. He&#8217;s a nationalist, pretty much, he just hasn&#8217;t realized that a powerful tool to instigate nationalistic pride are the European Cups.</p>
<p>Any sane monkey would outright object to these guys getting into coalition, the party is quite new, very new, all members have next to no experience, they were personally picked by Geert, while most parties have a quasi-democratic voting model to settle these internal issues, Geert holds are the ropes here, he&#8217;s the autocrat of the party he founded, what he decides goes. And consequently, no one really knows all these people, all they know is Geert. As a fellow monkey I am partially guilty of this, one simply doesn&#8217;t hear any thing of it in the news outside Geert.</p>
<p>This echoes a prævious situation, the situation with the <span class="title">Pim Fortuyn Party</span> (<abbr title="Lijst Pim Fortuyn">LPF</abbr>), no one really knew any but <span class="person">Pim</span>, he hand-picked them all, and the party got in a coalition with same <span class="title">CDA</span>, and <span class="title">VVD</span>; <em>it was about the shortest lasting cabinet ever</em>. Except that in this case, they&#8217;re all even more faultering idiots than in the last case, the few exposures I had to these people seem to imply that they—including Geert—have no understanding of the Dutch political system <em>what-so-ever</em>.</p>
<p>The point it comes down to is if the <span class="title">VVD</span> (largest party) and the <span class="title">CDA</span>&#8216;ve learnt from this mistake to enter coalition with a bunch of far-right, populist newcomers that have no idea of how the political system works. Assuming they chose not to, what then? They heavily favour each other, and it means they&#8217;ll have to get their majority else-where, the other option would immediately be the <span class="title">Labour Party</span>, who is second in the elections and has more seats than the <span class="title">PVV</span>, but <span class="title">Labour</span>&#8217;s really not that eye-to-eye with <span class="title">VVD</span> or <span class="title">CDA</span> and is centre-left, opposed to their centre-right. To classify them, a thing I abhor, it would be <span class="keyword">liberal-right</span>, <span class="keyword">Christian-democrat</span>, and <span class="keyword">social-democrat</span> respectively, the former two associatively &#8216;right wing&#8217; in Dutch politics, the latter &#8216;left&#8217;.</p>
<p>What if they&#8217;d rather go with the <span class="title">PVV</span>? They only have a one vote majority, a vote of no confidence will be very easy to get, and I and all the other high-educated monkeys are all expecting them to bumble and screw things up beyond a reasonable margin. It&#8217;s a complex situation, but it&#8217;s not half as bad as people think, the last four governments fell before they had their four years due, it all started with the change of climate, towards open xenophobia. It&#8217;d be lovely to add this government to that list.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.nihilarchitect.net/archives/378/general-elections/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>On functional programming</title>
		<link>http://blog.nihilarchitect.net/archives/289/on-functional-programming/</link>
		<comments>http://blog.nihilarchitect.net/archives/289/on-functional-programming/#comments</comments>
		<pubDate>Thu, 22 Apr 2010 00:50:32 +0000</pubDate>
		<dc:creator>niarch</dc:creator>
				<category><![CDATA[Philosophy]]></category>
		<category><![CDATA[coding]]></category>
		<category><![CDATA[functional programming]]></category>
		<category><![CDATA[haskell]]></category>
		<category><![CDATA[javascrpt]]></category>
		<category><![CDATA[lisp]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[scheme]]></category>

		<guid isPermaLink="false">http://blog.nihilarchitect.net/?p=289</guid>
		<description><![CDATA[Aah, functional programming, a source of elitism, to separate the common from the elite, or according to the common just intellectual masturbation. What it is no-one really knows, endless wars fought over which languages are functional and which are not&#8230;
Now, functional programming seems to have some intrinsic link to the lambda calculus, many programming languages even introduce [...]]]></description>
			<content:encoded><![CDATA[<p>Aah, functional programming, a source of elitism, to separate the common from the elite, or according to the common just intellectual masturbation. What it is no-one really knows, endless wars fought over which languages are functional and which are not&#8230;</p>
<p>Now, functional programming seems to have some intrinsic link to the <a title="Wikipedia:Lambda calculus" rel="external reference" href="http://en.wikipedia.org/wiki/Lambda_calculus">lambda calculus</a>, many programming languages even introduce functions by a  &#8217;lambda keyword&#8217; for no good reason at all, just to be different, for the rest of this discourse I shall use the notation <code>(<var>x</var>.. . <var>E</var>..)</code> in favour of <code>λ<var>x</var>.. . <var>E</var>..</code>—I believe it suffices, it&#8217;s easier to type out, and nicely delimits the scope of symbols. That lambda was just an excluse to get a Greek letter into it any-way.</p>
<p>Well, I think that in the end, the relationship between lambda calculus and functional programming languages are completely overstated. In fact, I think lambda calculus has little to do with &#8216;functions&#8217; in the mathematical sense, what is a function? Commonly a function in mathematics is just defined as a collection of pairs in such a way that no first element of those pairs is ever paired with two distinct second elements, though the converse needn&#8217;t be true. So it&#8217;s just obviously a pairing of elements from the domain of the function to the image of that function. Are lambda abstractions a collection of pairings? Maybe they are in some interpretation, but I more like to see lambda abstractions as a way to get those pairings, they aren&#8217;t <em>functions</em>, they&#8217;re <em>algorithms</em>, a completely distinct concept. They are <em>instructions</em> to <em>compute</em> functions. They&#8217;re just a list of instructions some-one or some-thing can follow, you start with a random first element of such a pair, follow the instructions, and you end up with the second. Algorithms can thus be used as a way to define functions, by simply giving their algorithms, this practice of course has the immediate advantage that using the function then becomes an easy task. A disadvantage is that algorithms are often very long and not all functions can be expressed in algorithms.</p>
<h4>What is a lambda abstraction?</h4>
<p>I&#8217;ve yet to come to a standardized and authoritative definition of the concept, but I think we can safely say that a lambda application <code>(<var>x</var>. <var>E</var>) <var>A</var></code> with <var>x</var> a symbol and <var>E</var> string of symbols must be identical to <var>E</var> with all occurrences of <var>x</var> in that string replaced by <var>A</var>. Commonly written as <code><var>E</var>[<var>x</var>:=<var>A</var>]</code>. That was one of the interesting things about lambda calculus, that all one needed to define all algorithms was just basically a way to re-order symbols. Obviously this simple identity is not satisfied any more by a lot of languages that use the lambda keyword to introduce function literals, in fact, a lot have a well-defined evaluation order because the <a title="Wikipedia:Church-Rosser Theorem" rel="external reference" href="http://en.wikipedia.org/wiki/Church-Rosser_theorem">Church-Rosser Theorem</a>—which implies the order of evaluation to be irrelevant—doesn&#8217;t hold on those languages. Lambda calculus would become a lot more complex if an evaluation order had to be specified and one often cited beauty of it is its minimalism.</p>
<h4>Purely functional languages</h4>
<p>The poster child of &#8216;purely&#8217; functional programming languages is often held to be <a class="title" title="Wikipedia:Haskell (programming language)" rel="external reference" href="http://en.wikipedia.org/wiki/Haskell_language">Haskell</a>, named after the guy who if it wasn&#8217;t enough already got the term &#8216;currying&#8217; named wrongly after him. Haskell&#8217;s notation is a bit strange, to leech the examples from <span class="title">Wikipedia</span>:  (Hereby this document is licensed under the GNU Free documentation licence too)</p>
<p><code class="Haskell block">-- using recursion<br />
factorial 0 = 1<br />
factorial n = n * factorial (n - 1)</code></p>
<p><code class="Haskell block">-- using lists<br />
factorial n = product [1..n]</code></p>
<p><code class="Haskell block">-- using recursion but written without pattern matching<br />
factorial n = if n &gt; 0 then n * factorial (n-1) else 1</code></p>
<p><code class="Haskell block">-- using fold<br />
factorial n = foldl (*) 1 [1..n]</code></p>
<p><code class="Haskell block">-- using only prefix notation and n+k-patterns<br />
factorial 0 = 1<br />
factorial (n+1) = (*) (n+1) (factorial n)</code></p>
<p>Here we have no less than five definitions of the same function in <span class="title">Haskell</span>, we can group these in a number of ways, what&#8217;s interesting is the difference between the inner three and the outer two. The inner three are <em>algorithmic</em>, it defines it by giving a way to some reader who understands all those symbols but has an <abbr title="Intelligence Quotient">I.Q.</abbr> of 0 otherwise to also compute the function for any value we want. The other two rely on <a class="term" title="Wikipedia:Pattern matching" rel="external reference" href="http://en.wikipedia.org/wiki/pattern_matching">pattern matching</a>, that is, we simply give up a set of relations, two cases in each, with that function must satisfy and the implementation figures out its own algorithm, in fact, seeing that Haskell is purely functional, even though we could have specified an algorithm that was just inefficient, the implementation would be free to change our algorithm to something that&#8217;s more efficient, as long as the return value is the same, as long as the pairs end up being identical, clearly we&#8217;re not dealing with algorithms, we&#8217;re dealing with functions. It&#8217;s the hallmark of purely functional programming languages that algorithms can be changed by the implementation.</p>
<p>Some one once told me that the pattern matching version is just syntactic sugar for the if-then-else version. Well, what is syntactic sugar? I mean, you can in the end justify in some way that C, or even Haskell, is just &#8217;syntactic sugar&#8217; for assembly no? Clearly we need some restriction to that definition. One could propose that needing a <a class="term" title="Wikipedia:Turing Complete" rel="external reference" href="http://en.wikipedia.org/wiki/turing_complete">Turing Complete</a> model of computation to automate the re-write to what it&#8217;s supposedly sugar for exceeds the limits of syntactic sugar. Maybe even restrict it more, in any sense, it&#8217;s quite clear that in the <span class="title">C</span> code <code class="C">array[index]</code>—being sugar for <code class="C">*(array+index)</code>—needs a less powerful re-writing system than all the pattern matching that Haskell supports, to begin with the order of the patterns in many languages that support pattern matching is irrelevant, and other functions patterns, or relationships can freely be put in-between. In effect, Haskell is a sharp turn away from algorithms, the word programming itself comes from a Greek root which will be more recognisable in an uninflicted form &#8216;prographien&#8217;, essentially Greek for the latin &#8216;praescribere&#8217; or &#8216;to præscribe&#8217;, simply a set of instructions which tells some thing what to do. The English word &#8216;program&#8217; also has a certain connotation to &#8216;a list in which the order of the items is very much relevant&#8217;.</p>
<p><strong>Update:</strong>, some-one also pointed out to me correctly that case-statements and pattern matching are different than a true if-then-else in ML based languages because if-then-else&#8217;s require an else-branch whereas case-statements do not, which is essential for the type inference of ML-based languages showing that it cannot be replaced by a simple &#8216;internal-if-then-else&#8217;.</p>
<p>Often, people say that <span class="title">Haskell</span> is based on <a title="Wikipedia:System F" rel="external resource" href="http://en.wikipedia.org/wiki/System_F">System F</a>, what is the difference between System F and other lambda calculi any-way? All I know is the type system, that&#8217;s it, so the only reason it could be based on System F and not simply typed lambda calculus or untyped, is the type system. And that&#8217;s more or less the case I guess, Haskell hardly works with lambda applications and abstractions as its main building blocks, but its type system is indeed based on System F. Indeed, it wouldn&#8217;t even be Turing Complete using only lambda terms and that type system, it has to be extended with other constructs.</p>
<p>That&#8217;s not to say that there&#8217;s at all a thing wrong with Haskell or other purely functional languages, or that it&#8217;s easy to do, it&#8217;s just not algorithmic and therefore it deals in functions and not lambda abstractions. Haskell&#8217;s notation is intended to read like definitions in mathematical textbooks, (a thing that&#8217;s always amused me is that they use if-else-then as a language construct, while surely in a purely functional environment it could simply be a three-argument function?)</p>
<h4>The <a class="title" title="Wikipedia:Lisp (programming language)" rel="external reference" href="http://en.wikipedia.org/wiki/Lisp_(programming_language)">Lisp</a> language family</h4>
<p>One of the oldest language families still in use, and commonly credited with popularizing functional programming, and this is the point where I&#8217;ve lost any grip on the meaning of &#8216;functional programming&#8217;? I can see why purely functional languages are, because they don&#8217;t have <em>subroutines</em> as in <span class="title">C</span>, they have <em>functions</em> in the very mathematical sense of the word, doing what functions do, they define pairs of input and output, nothing more. Lambda abstractions as established before do a bit more, they also tell you how to calculate that output from that input. But surely I can just keep my C subroutines free from side-effects—except <code>main</code>,of course—and have the very same semantics <span class="title">Lisp</span>s; on top of that, <span class="title">Lisp</span>s actually allow side-effects to occur. The lexical scope of most mainstream variants today allows for functions to lose their referential transparency by re-defining global variables they use in their body, some <a class="title" title="Wikipedia:Scheme (programming language)" rel="external reference" href="http://en.wikipedia.org/wiki/Scheme_(programming_language)">Scheme</a> programmers see this as a mark of either supreme bad style, or simply having picked the wrong language, hence all procedures that allow for this all end in an exclamation mark, but <a class="title" title="Wikipedia:Common Lisp" rel="external reference" href="http://en.wikipedia.org/wiki/Common_Lisp">Common Lisp</a> programmers do this all the time and the language is a lot more tailored to this.</p>
<p>So why is it called functional programming then? and what&#8217;s the connexion people often point to purely functional languages and this? Is it some old relic because <span class="title">Lisp</span>&#8217;s just that old and was far more functional than any other language in its early days? Or the back-then prætentious use of the <code>lambda</code> keyword to introduce literal functions? Is it that <em>procedures</em> are first class-objects that can thus be passed as arguments to functions, and dynamically generated at run-time? <a class="title" title="Wikipedia:JavaScript" rel="external reference" href="http://en.wikipedia.org/wiki/JavaScript">JavaScript</a> has all those facilities, so why isn&#8217;t that functional? Because it simply uses the humble <code>function</code> keyword to introduce literals oppose to <code>lambda</code>?</p>
<p>Focussing on <span class="title">Scheme</span>, the clearly more-functional of the two main dialects in use today. To again leech from <span class="title">Wikipedia</span> to define the factorial:</p>
<p><code class="Scheme block">;using recursion<br />
(define (factorial n)<br />
 (if (= n 0)<br />
     1<br />
     (* n (factorial (- n 1)))))</code></p>
<p>I&#8217;ll also throw in the other variants <span class="title">Haskell</span> had in <span class="title">Scheme</span> analogy too for comparison:</p>
<p><code class="Scheme block">;using folding.<br />
(define (factorial n)<br />
 (foldr * (list-range 1 n)))</code></p>
<p><code class="Scheme block">;using list products<br />
(define (factorial n)<br />
 (list-product (list-range 1 n)))</code></p>
<p>Before I could even start I had to write these (yes, I like coding in <span class="title">Scheme</span>, why do you ask?):</p>
<p><code class="Scheme block">;folds with right-associativity<br />
(define (foldr binary-operator lst)<br />
 (binary-operator (car lst)<br />
  (if (null? (cddr lst)) (cadr lst)<br />
      (foldr binary-operator (cdr lst)))))</code></p>
<p><code class="Scheme block">;create a product out of a list of elements<br />
(define (list-product lst)<br />
 (if (null? (cdr lst)) (car lst)<br />
  (foldr * lst)))))</code></p>
<p><code class="Scheme block">;make a range<br />
(define (list-range start stop . step)<br />
 (let ((step (if (null? step) 1 (car step))))<br />
      (cons start<br />
      (if (&gt;= start stop) '()<br />
          (list-range (+ start step) stop step)))))</code></p>
<p>Yeah, hate me you zealots of tail-optimization. Now, the difference of the algorithmic paradigm with the purely functional paradigm is quite clear. In <span class="title">Haskell</span> and similar <span class="title">ML</span>-derived languages, we use <code>[1..n]</code> showing that it&#8217;s meant to resemble mathematical textbook notation, it&#8217;s a built in <em>language-construct</em> of some sorts. <span class="title">Lisp</span> is the antithesis of normal mathematical notation, the notation is purely algorithmic, and consistent above all, an implementation of <span class="title">Scheme</span> will just execute my algorithm, the <a title="Wikipedia:Glasgow Haskell Compiler" rel="external reference" href="http://en.wikipedia.org/wiki/Glasgow_Haskell_Compiler"><abbr title="Glasgow Haskell Compiler">GHC</abbr></a> would probably optimize all those variants to the very same algorithm.</p>
<p>Now, the result in each is the same, but the example I stole from that free encyclopædia is the præferred one by far, even if I had already written those other functions which would make those other implementations a lot faster to write. They both recurse <em>twice</em>, they first recurse to make that list, and secondly to fold a multiplication operator to it. The diligent reader also noticed that I used <code class="scheme">(null? (cddr lst))</code> instead of the more intuïtive <code class="scheme">(&lt; = (length? lst)  2)</code>, the simple answer is that again, the entire list has to be traversed to get the length. Of course, this one will give an error if the length is 0 or 1, but folding a list to a binary operator with 0 or 1 elements has no meaning. And I tend to write my code very insecure with very little error-catching if that means I have to check each and every time, I&#8217;d make sure at another point that I&#8217;m never folding a list with less than two elements. I also claimed all functions were the same, that&#8217;s not true, some will give an error when trying to get the factorial of a number lower than two, not exactly sure how <span class="title">Haskell</span>&#8216;d handle this one. Of course, simply using:</p>
<p><code class="Scheme block">;using apply<br />
(define (factorial n)<br />
 (apply * (list-range 1 n)))</code></p>
<p>Also does its work, and is probably the most efficient option. Which is by the way what I find to be the true distinguishing strength of <span class="title">Lisp</span>s, not first-class functions, but <a title="Wikipedia:Homoiconic" rel="external reference" href="http://en.wikipedia.org/wiki/Homoiconic">homo-iconicity</a> (what also helps is that multiplication can take as many arguments as it likes, it folds on its own). Interestingly, this implementation also returns the correct result for the factorial of 0. Because <code class="scheme">(list-range 1 0)</code> just happens to evaluate to a list containing only the number 1. This is hardly a thing I intended when I made the algorithm, I didn&#8217;t care because placing the lower bound higher than the upper is just nonsense, I could have let it return an error, but this shows the functioning of algorithms, there&#8217;s no deep underlying mathematical principle behind the correctness of this factorial algorithm, it just <em>works</em><em>, and by sheer </em><em>dumb luck</em>.</p>
<p>So, at the least I&#8217;ve hopefully made compelling that &#8216;functional programming&#8217;, isn&#8217;t as much one paradigm as many people think. I&#8217;d personally say that <span class="title">Lisp</span>s are is closer to <span class="title">Fortran</span> than they are to <span class="title">ML</span>-derivatives like Haskell, and those again are in fact quite close to <span class="title">Prolog</span>. In the former &#8216;functional paradigm&#8217; we express algorithms, in the latter we define relations and query over them.</p>
<h5>And lambda-<span class="title">Scheme</span>?</h5>
<p>To satisfy the idea of the lambda abstraction, we would have to remove the constructs <code>define</code>, <code>letrec</code> and obviously any-thing that ends with <code>!</code> from the language. The last is obvious, the first two are more subtle, they enable a function to occur within its own defining instance, within a lambda expression, the symbol referring to that function is either bound in the &#8216;parent&#8217; function, or simply free. In any case, the semantics are different.</p>
<p>&#8230;Or so we may be naïve to think, what if we just already had a symbol, let&#8217;s say <code>fact</code> that evaluated to the factorial function which we used in the definition of our local factorial function? We can easily just say that <code>letrec</code> without a symbol <code>fact</code> already bound in a higher scope has the very same semantics as <code>let</code> in our hypothetical situation. Some would say that we wound need <code>letrec</code> any way to make it. A: this is of course wrong, we can use a <a title="Wiki:Fixed point cominator" rel="external reference" href="http://en.wikipedia.org/wiki/Fixed_point_combinator">fixed  point combinator</a>; B: the same applies to any primitive function like <code>+</code>, we would need it defined to define it.</p>
<h4>Problems with recursion</h4>
<p>We know that in lambda calculus we have to use a fixed point combinator because we use symbols opposed to variables, all functions are literal and anonymous, the quæstion is if allowing a function to call itself in its body violates the notion of a lambda abstraction <em>per se</em>. One can call functions inside the body of a lambda abstraction, functions which needn&#8217;t have been defined before, in fact, this is a quintessential trait of many purely functional languages, use functions before one defines them, or rather, there is no &#8216;before&#8217; and &#8216;after&#8217;, and I wouldn&#8217;t know, it depends on one&#8217;s definition of lambda-abstraction again. Though, allowing for it would make them more complicated than they traditionally were, again pointing to the minimalsm. Considering notation such as:</p>
<p><code class="lambda-calculus block">T := (x y. x)<br />
F := (x y. y)<br />
...</code></p>
<p>where the dots would be a body that enable our shorthand, this is often seen as just defining a quick substitute, what a lot of people seem to forget is that this can in fact be expressed without any meta-language, completely in the lambda calculus itself:</p>
<p><code class="lambda-calculus block">(T F.<br />
...<br />
) (x y. x) (x y. y)</code></p>
<p>Where again, the dots signal a the scope of the body of our shorthand, from the very definition of a lambda application, and of course recursion without fixed point combinators cannot just be reduce to a simple lambda application any-more. It&#8217;s not a definition, it&#8217;s a substitution, hence it are symbols, not variables.</p>
<p>What is the difference between a symbol and a variable then? A naïve and simple definition is that a variable is&#8230; variable, and a symbol is not. However, I&#8217;m personally in favour of a stronger distinction, that is, a symbol can always without change of meaning exchanged for its value. Therefore, symbols truly are just to make things more readable, they aren&#8217;t <em>strictly</em> needed.</p>
<p><span class="title">ML</span>-derived languages being based on the non Turing-Complete System F typed lambda calculus however even need variables in lieu of symbols to be Turing Complete, <span class="title">Lisp</span>s can evade this by using fixed points, but a fixed point combinator cannot even be implemented in <span class="title">ML</span>-derived languages without functions being able to already refer to themselves before they are defined.</p>
<h4>Does the term &#8216;functional programming&#8217; have any meaning?</h4>
<p>I&#8217;ve earlier on already drawn some comparisons between <span class="title">Scheme</span>, and <span class="title">JavaScript</span>, the former&#8217;s often held to be of the functional family while the latter isn&#8217;t. Many&#8217;d probably hate me for comparing what is often held as a work of art and elegance to the often-abused scourge of <abbr title="Dynamic HTML">DHTML</abbr> scripting, but humour me.</p>
<p>Exactly what functional facility does  <span class="title">Scheme</span> have that <span class="title">JavaScript</span> lacks? Scheme doesn&#8217;t have pattern matching or type-inference like purely functional languages tend to have. It supports various features that a lot of <span class="title">C</span>-style languages lack such as dynamically creating functions at runtime, functions that can consume or return functions, <a class="term" title="Wikipedia:Closure (computer science)" rel="external reference" href="http://en.wikipedia.org/wiki/Closure_(computer_science)">closures</a>, anonymous functions, but really, so does <span class="title">JavaScript</span>. <span class="title">JavaScript</span> is often held to be <a class="term" title="Wikipedia:Object oriented" rel="external reference" href="http://en.wikipedia.org/wiki/Object_oriented">object oriented</a>, but <a class="person" title="Wikipedia:Alan Kay" rel="external reference" href="http://en.wikipedia.org/wiki/Alan_Kay">Alan Kay</a>, the man who coined that very term disputes this, and in fact said, ironically:</p>
<blockquote cite="Alan Kay"><p><abbr title="Object Oriented Programming">OOP</abbr> to me means only messaging, local retention and protection and hiding of state-process, and extreme late-binding of all things. It can be done in Smalltalk and in LISP. There are possibly other systems in which this is possible, but I&#8217;m not aware of them.</p></blockquote>
<p>Alternatively, we could try to establish that control structures in <span class="title">Scheme</span> are fundamentally different from <span class="title">JavaScript</span>, we have: <code class="Scheme">(if <var>condition</var> <var>then-branch</var> <var>else-branch</var>)</code> in <span class="title">Scheme</span> versus <code class="JavaScript">if (<var>condition</var>) <var>then-branch</var> else <var>else-branch</var></code> in <span class="title">JavaScript</span>. At first the former appears to be like any function in <span class="title">Scheme</span> while the latter seems to have a unique syntax to it, normal of control structures in <span class="title">JavaScript</span>. However, the shared syntax is all it shares with functions in the first example, the <span class="title">Scheme</span> <a title="Schemers:R5RS" rel="external reference" href="http://www.schemers.org/Documents/Standards/R5RS/">specs</a> are pretty transparent about it not being a function (procedure), in addition to not evaluating all of its arguments, it can also not be passed to functions as argument itself or just be returned from it, therefore even if it were a procedure, it isn&#8217;t first-class which removes any argument we could make about it in this context.</p>
<p>But obviously, even though the capabilities are the same, <span class="title">Scheme</span> is traditionally used in a much more functional manner, <span class="title">JavaScript</span> code is generally filled with assignment statements while a simple search on <code class="string">!</code> could provide us with a proof that a <span class="title">Scheme</span> source does not contain any. But why? it&#8217;s fairly obvious that <span class="title">Scheme</span>&#8217;s syntax lends itself a lot better to the functional paradigm, but <em>why</em>? consindering that</p>
<p><code class="JavaScript block">function factorial(n) {<br />
  var output = 1;<br />
  while(n &gt; 1)<br />
    output *= n--;<br />
  return output;<br />
}</code></p>
<p>Is in fact <em>easier</em> to do in the form:</p>
<p><code class="JavaScript block">function factorial(n) {<br />
  return (n == 0) ? 1 : n * factorial (n-1);<br />
}</code></p>
<p>Of course, the same choice of flavour is even offered in <span class="title">C</span>, but that doesn&#8217;t support first-class functions and closures, et cetera. Which leaves me but to wonder why the recursive expression of the factorial is often seen as a typical example of the use of functional programming, as many <span class="title">C</span>&#8216; programs also use it. The latter example also shows that if-then-else can be treated as a proper expression, and of course:</p>
<p><code class="JavaScript block">function factorial(n) {<br />
  return arrayRange(1,n).fold(multiplication);<br />
}</code></p>
<p>Is also supported, we would of course have to define <code class="JavaScript">arrayRange</code>, prototype <code class="JavaScript">fold</code> to arrays and create a <em>function</em> <code class="JavaScript">multiplication</code>, as unlike  in <span class="title">Lisp</span>, there is a proper distinction between operators and functions, so maybe that&#8217;s it? I believe that <span class="title">ML</span>-based purely functional languages also treat them differently though. In case you wonder why I didn&#8217;t make those functions here, I don&#8217;t like coding in JavaScript at all.</p>
<p>So, what is it? Maybe <span class="title">Lisp</span> lends itself better for functional programming because of its use of lists opposed to arrays? <span class="title">Lisp</span> has arrays though, they&#8217;re just called <dfn>vectors</dfn>, likewise, the <abbr title="Object Oriented">OO</abbr> paradigm of <span class="title">JavaScript</span> allows for an easy implementation of lists. There seems to be a trend amongst languages associated with functional programming to use lists in favour of vectors so that could be it, they do make recursion a lot more convenient.</p>
<p>Though the comparison of <span class="title">Scheme</span> and <span class="title">JavaScript</span> naturally doesn&#8217;t hold for all functional languages against all procedural languages, it does show that languages themselves aren&#8217;t as much functional as the way people use them, often for no good reason. The true difference between <span class="title">Lisp</span>s and <span class="title">JavaScript</span> to me is that the former&#8217;s homo-iconic. The obvious difference between <span class="title">Lisp</span>s and <span class="title">ML</span>s being static typing, type inference and above all pattern matching.</p>
<h4>And &#8216;declarative programming&#8217;?</h4>
<p>This term also surfaces a lot, which I find quite possibly even vaguer than functional programming, accordingly Wikipedia:</p>
<blockquote cite="http://en.wikipedia.org/wiki/Declarative_programming"><p>Declarative programming is often defined as any style of programming that is not imperative. A number of other common definitions exist that attempt to give the term a definition other than simply contrasting it with imperative programming. For example:</p>
<ul>
<li>A program that describes what computation should be performed and not how to compute it</li>
<li>Any programming language that lacks side effects (or more specifically, is referentially transparent)</li>
<li>A language with a clear correspondence to mathematical logic.</li>
</ul>
<p>These definitions overlap substantially.</p></blockquote>
<p>These are conveniently listed in ascending order of vagueness, and the first is pretty vague to begin with. The only sensible definition of the first I could give is to not use algorithms <em>at all</em>, this would make imperative programming synonymous with algorithmic programming, or simply&#8230; programming? As the word &#8216;imperative&#8217; already hints, you tell a computer what to do. Purely declarative programming would thus be describing what relationships your solution must satisfy, and telling the computer to give it, an art in itself, no doubt. We can clearly see this in <span class="title">Haskell</span>&#8217;s pattern matching and type inference. We just gave two relationships a factorial function must satisfy and <span class="title">Haskell</span> gives us that function, or maybe not? Seeing the quintessential:</p>
<p><code class="Haskell block">-- List reversing function<br />
rev [] = []<br />
rev (s:xs) = rev xs ++ [s]</code></p>
<p>To me, this is the on the line between algorithmic and non-algorithmic. The argument on the second function is given in a <em>pattern</em>, with <code class="Haskell">s:xs</code> standing for <code class="pseudocode">cons(s,xs)</code>, surely this is enough information to unambiguously tell <span class="title">Haskell</span> that the argument must be a list, and to bind the head the symbol <code>s</code> and the tail to <code>xs</code>? In <span class="title">Scheme</span> we would have:</p>
<p><code class="Scheme block">;more obviously algorithmic<br />
(define (rev lst)<br />
 (if (null? lst) lst<br />
     (append (rev (cdr lst)) (list (car lst)))))</code></p>
<p>How much does that decomposing argument compromise its status as an algorithm? the way it reads there is in fact a mathematical  <em>equation</em>, a property it must satisfy, but could it just be syntactic sugar for a decomposition of the argument? Let us after all not forget that in <span class="title">Scheme</span> in reality, all procedures are single-argument functions, they take a list as argument. Code like <code class="Scheme">(lambda (x y) (+ x y))</code> can also be expressed as <code class="Scheme">(lambda lst (+ (car lst) (cadr lst)))</code>, so clearly the list is bound to a pattern here, the only difference between these two literals is that the former raises an error on more than two arguments, and the latter simply throws the rest of the arguments away. So we could change our function to:</p>
<p><code class="Scheme block">;without argument patterns<br />
(define (rev . lst)<br />
 (if (null? lst) lst<br />
     (append (apply rev (cdr lst)) (list (car lst)))))</code></p>
<p>The difference in semantics is now of course that it expects <code class="Scheme">(rev 1 2 3)</code> instead of <code class="Scheme">(rev (list 1 2 3))</code>, the pattern matching also does not go infinitely high up, while <code class="Scheme">(lambda (x y . z) <var>expression</var> ...)</code> is acceptable in lieu of <code class="Scheme">(lambda lst <var>expression</var> ...)</code>, <code class="Scheme">(lambda ((x . y) z) <var>expression</var> ...)</code> simply returns an error instead of a procedure that demands the list it is applied to for its <code>car</code> to be pair and its <code>cddr</code> to both exist and be <code>()</code>. It would also be worth nothing that in <span class="title">Haskell</span> <code class="Haskell"> rev xs ++ [s] = rev (s:xs)</code> isn&#8217;t allowed, so clearly this <code class="Haskell">=</code> symbol here is not our very <em>symmetric</em> mathematical <a class="term" title="Wikipedia:Identity relation" rel="external reference" href="http://en.wikipedia.org/wiki/Identity_relation">identity relation</a>. It&#8217;s often called a &#8217;single assignment&#8217;, but how much can we really &#8216;assign&#8217; a value to a function applied to an argument whose argument is a <em>pattern</em> which is <em>decomposed</em> in the value of the assignment itself? I&#8217;m not really sure what it is, it&#8217;s neither a true assignment as <code class="Scheme">set!</code> is, nor is it defining a true æquality relation. </p>
<p>However, in <span class="title">Lisp</span> the notation <code class="Lisp">(a . b)</code>cannot be used to create a pair, <span class="title">Lisp</span>&#8217;s syntax itself is composed of lists and therefore also pairs, it&#8217;s not an operation, it&#8217;s syntax. In <span class="title">ML</span>-derivatives, <code class="ML">a:b</code> is an actual cons operation which may be used to return a consed value. The æquivalent in <span class="title">Lisp</span> would be <code class="Lisp">(cons a b)</code> or alternatively <code class="Lisp">(cons .  (a . (b . ())))</code>, which is evidently a completely different pair.</p>
<p>The second element on the list, having no side-effects is even more vague, of course this assumes our language has some intuïtive correspondence to the function or the subroutine, that a thing can be &#8216;evaluated&#8217; to produce one in along with the value of its evaluation, what is a &#8217;side-effect&#8217;? If I reduce <code class="lambda-calculus">(n. n (x. F) T) (x y. y)</code> to <code>T</code>, then this would take me 3 reductions. How do I know this? Well, every reduction obviously had an extra &#8216;effect&#8217; besides reducing, it also incremented a counter. And this brings us to the vagueness of &#8216;effect&#8217;, that abstraction cannot reach that &#8216;effect&#8217; can it? The program can&#8217;t either, is expending cycles on a <abbr title="Central Processing Unit">CPU</abbr> an &#8216;effect&#8217;?</p>
<p>Referential transparency is more clear, it simply says the return value of the function or subroutine must always be identical given the same arguments, well, what are arguments? Depending on the context of that lambda term above, surely <code class="lambda-calculus&gt;F&lt;/code&gt; and &lt;code class=">T</code> may differ, see the above example. So sending out side-effects that one cannot reach can&#8217;t be defined and is related to other similar problems in metaphysics, <q>How can I know if an Angel doesn&#8217;t die every time I take a dump if Angles are invisible to man?</q>, and receiving side-effects can just be seen as arguments. Furthermore, side-effects which only happen inside functions to local variables may be algorithmically different, but not functionally, it results into same collection of pairs.</p>
<p>It may not be referentially transparent for instance in <abbr title="PHP: Hypertext Preprocessor">PHP</abbr> to write:</p>
<p><code class="PHP block">// raises a global value by a given argument and returns the result<br />
function raise_by($raise_by) {<br />
  global $global_value;<br />
  return $global_value+$raise_by;<br />
}<br />
echo raise_by(5);</code></p>
<p>As it&#8217;s not immediately clear from the instance of the function itself unless one knows the definition, but it does the same as:</p>
<p><code class="PHP block">// raises a value by a given argument and returns the result<br />
  function raise_by($value,$raise_by) {<br />
  return $value+$raise_by;<br />
}<br />
echo raise_by($global_value,5);</code></p>
<p>However:</p>
<p><code class="PHP block">// updates a counter by a given value and outputs the new value.<br />
function increment_by($increment_by) {<br />
  global $global_value;<br />
  return $global_value+=$increment_by;<br />
}<br />
echo increment_by(5);</code></p>
<p>This is the point were we cannot reduce it any-more, it not only kills an Angel, it also has access to how many Angels it has killed. So clearly only outward, or only inward does not break referential transparency, but both at the same time surely do.</p>
<p>The third property is a good example of <dfn>The Law of Joost</dfn> <q>There are things that are correct, things that are wrong, and even worse, things that aren&#8217;t even wrong any-more.</q>, first to formalize it gets an honourable mention in this blog that no one reads, and those that do either hate or not understand.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.nihilarchitect.net/archives/289/on-functional-programming/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>On grammar and shorter sentences</title>
		<link>http://blog.nihilarchitect.net/archives/282/on-grammar-and-shorter-sentences/</link>
		<comments>http://blog.nihilarchitect.net/archives/282/on-grammar-and-shorter-sentences/#comments</comments>
		<pubDate>Thu, 15 Apr 2010 13:22:05 +0000</pubDate>
		<dc:creator>niarch</dc:creator>
				<category><![CDATA[Slice of life]]></category>
		<category><![CDATA[society]]></category>
		<category><![CDATA[language]]></category>
		<category><![CDATA[prescription]]></category>
		<category><![CDATA[præscription]]></category>
		<category><![CDATA[rant]]></category>

		<guid isPermaLink="false">http://blog.nihilarchitect.net/?p=282</guid>
		<description><![CDATA[Some people reading this Blog might find my grammatical capabilities dubious, those will probably give up. In fact, I was told from childhood on I should make my sentences shorter in essays, and I could divide native speakers over the fact if my grammar in a given language was correct or not. I&#8217;ve lately taken [...]]]></description>
			<content:encoded><![CDATA[<p>Some people reading this Blog might find my grammatical capabilities dubious, those will probably give up. In fact, I was told from childhood on I should make my sentences shorter in essays, and I could divide native speakers over the fact if my grammar in a given language was correct or not. I&#8217;ve lately taken an appreciation to realize that these are ultimately related, take this extreme example of a sentence I once posted in a thread about anti-piracy vs. anti-copyright.</p>
<blockquote cite="http://trance.nu/v4/forum/viewtopic.php?p=2679011"><p>So please, Micra, cut the holier-than-thou self-righteous attitude of that some how it&#8217;s a de facto moral absolutism that downloading is bad and your surprise that people here with tonnes more of rational arguments than your morally stagnated dogmatic view on the matter try to &#8216;justify&#8217; its taking place. [...]</p></blockquote>
<p>Some people would say that that is grammatically very bad, and all of those would not be able to point out <em>why</em> it&#8217;s so bad. A thing I always had, they said it was bad grammar, but they either admitted they couldn&#8217;t say why, or say they didn&#8217;t feel like it. Point is that it&#8217;s very much grammatically correct, allow me to show it by cutting it down and down:</p>
<p>First we remove some adjectives:</p>
<blockquote cite="http://trance.nu/v4/forum/viewtopic.php?p=2679011"><p>[...] Cut the [...] attitude of that [...] it&#8217;s a [...] absolutism that downloading is bad and your surprise that people here with tonnes more of [...] arguments than your [...] view on the matter try to &#8216;justify&#8217; its taking place. [...]</p></blockquote>
<p>Then we remove some embedded clauses:</p>
<blockquote cite="http://trance.nu/v4/forum/viewtopic.php?p=2679011"><p>[...] Cut the [...] attitude of that [...] it&#8217;s a [...] moral absolutism that downloading is bad and your surprise that people here [...] try to &#8216;justify&#8217; its taking place. [...]</p></blockquote>
<p>Finally the bare skeleton of the sentence:</p>
<blockquote cite="http://trance.nu/v4/forum/viewtopic.php?p=2679011"><p>[...] Cut the [...] attitude of that [...] it&#8217;s a [...] moral absolutism that downloading is bad. [A]nd [cut] your surprise that people here [...] try to &#8216;justify&#8217; its taking place. [...]</p></blockquote>
<p>Now, this is very obviously grammatically correct, and inserting extra adjectives and adpositional clauses surely shall not change this. So, what was wrong with it? It was just a very long sentence inside a very long sentence, maybe that&#8217;s hard to read, I can imagine that a lot of people would find a sentence to be grammatically incorrect even though they can&#8217;t point out why, simply because they can&#8217;t read it. One could call it a mark of supreme bad style in literature to write such sentences.</p>
<p>I can&#8217;t say I care, I don&#8217;t think about how I&#8217;ll word things or &#8216;prose&#8217; when I debate, I write down what I have to say. Of course this is all defeating to the goal to convince an opponent if he-or-she can&#8217;t even read what I&#8217;ve to say.</p>
<p>I also don&#8217;t believe in &#8216;good style&#8217;, most rules of style were invented at whim by some person at some time any-way, like split-infinitives, that&#8217;s just nonsense. But I&#8217;ve also come to appreciate this very simple fact reasoning; I write those sentences without thinking or trying, most people find them hard to read, I<em> </em>don&#8217;t find them hard to read at all, so does this say a lot about <em>my</em> capability with grammar, or <em>theirs</em>? I&#8217;m not stupid in learning languages or seeing patterns, far from it, so, the often told rule of &#8216;making shorter sentences&#8217;, couldn&#8217;t it all just be a warped way to say &#8216;Keep account to the grammatical deficiencies of your audience?&#8217;, people that often make long sentences and are perceived as &#8216;chaotic&#8217; by their audiences have a popular reputation to be quite intelligent nonetheless, what if people just perceive it as chaotic due to their own inability to perceive the more complicated patterns? I&#8217;ve made compelling the notion that my sentence was correct, even though a lot of natives would at first sight say that it obviously was not.</p>
<p>I&#8217;d find it a not-too unreasonable notion that children who&#8217;re told by their teachers to curb the length of their sentences are in fact being told implicitly &#8216;You&#8217;re smarter than I, therefore I find your sentences hard to read.&#8217;</p>
<p>But then again, who with half a mind&#8217;d deny the universal præsence of dubiousness in linguistic præscriptivism?</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.nihilarchitect.net/archives/282/on-grammar-and-shorter-sentences/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Salvation</title>
		<link>http://blog.nihilarchitect.net/archives/265/salvation/</link>
		<comments>http://blog.nihilarchitect.net/archives/265/salvation/#comments</comments>
		<pubDate>Wed, 17 Mar 2010 21:52:18 +0000</pubDate>
		<dc:creator>niarch</dc:creator>
				<category><![CDATA[Philosophy]]></category>
		<category><![CDATA[society]]></category>
		<category><![CDATA[crap]]></category>
		<category><![CDATA[humanity]]></category>
		<category><![CDATA[rant]]></category>
		<category><![CDATA[review]]></category>
		<category><![CDATA[Review review]]></category>

		<guid isPermaLink="false">http://blog.nihilarchitect.net/?p=265</guid>
		<description><![CDATA[In rough lines, the plot of The Terminator (1984):

Android gets sent back in time to kill a woman
Man gets sent after him to protect her
Lots of explosions that barely damage the robot
At the final end the android is caught in a huge explosion and and is finally visually severely maimed but continues its pursuit regardless
Man sacrifices himself [...]]]></description>
			<content:encoded><![CDATA[<p>In rough lines, the plot of <span class="title">The Terminator</span> (1984):</p>
<ol>
<li>Android gets sent back in time to kill a woman</li>
<li>Man gets sent after him to protect her</li>
<li>Lots of explosions that barely damage the robot</li>
<li>At the final end the android is caught in a <em>huge</em> explosion and and is finally visually severely maimed but continues its pursuit regardless</li>
<li>Man sacrifices himself to slay the android</li>
<li>Woman helps a little</li>
<li>Robot dies</li>
</ol>
<p><span class="title">Terminator 2: Judgement Day</span> (1991):</p>
<ol>
<li>Liquid gets sent back in time to kill a boy</li>
<li>Android gets sent after him to protect him</li>
<li>Lots of explosions that barely damage the liquid</li>
<li>At the final end, by random chance the liquid falls into molten steal and is slain</li>
<li>Android sacrifices himself to save the future</li>
</ol>
<p><span class="title">Terminator 3: Rise of the Machines</span> (2003):</p>
<ol>
<li><em>Gynoid</em> gets sent back in time to kill a teenager</li>
<li>Android gets sent after him to protect him</li>
<li>Lots of explosions that barely damage the gynoid</li>
<li>At the end, by some huge explosion the gynoid is finally visually severely maimed but continues its pursuit regardless</li>
<li>Android sacrifices himself to slay the gynoid</li>
</ol>
<p><span class="title">Terminator Salvation</span> (2009):</p>
<ol>
<li>In the præsent, death row convict signs over his body to medical purposes</li>
<li>Shit goes wrong</li>
<li>In a post apocalyptic world, a human resistence forms against an oppressive AI bent on destroying / enslaving mankind</li>
<li>Lots of explosions</li>
<li>The death row inmate emerges from the wreckage of one of such</li>
<li>Finds its way to the resistance</li>
<li>EPIC PLOT TWIST, turns out to be an android similar to the one in the first film</li>
<li>Denies this, but is finally shocked to see for himself that he&#8217;s been rebuilt.</li>
<li>They, being racist fags, try to kill him, he escapes</li>
<li>Finally wins their confidence by saving them</li>
<li>Gets a job to infiltrate the AI with his cybernetics</li>
<li>In there, realizes that the AI manipulated him the whole time, playing on his subconscious mind and using him as a spy apparatus</li>
<li>Breaks free of the AI&#8217;s control (literally) and goes of to save the person he trapped</li>
<li>Saves him from an android of the type of the first film, though he&#8217;s wounded</li>
<li>Sacrifices himself at the end to save that man, who just happens to be the leader of the resistance, the boy from the second and third film and the son of woman and the man of the first.</li>
</ol>
<p>Mainstream criticism on all films has been overwhelmingly positive, except the last one, let&#8217;s cite some examples:</p>
<p><span class="person">Roger Ebert</span> of the <span class="title">Chicago Sun Times</span>:</p>
<blockquote cite="Roger Ebert"><p>After scrutinizing the film, I offer you my summary of the story: Guy dies, finds himself resurrected, meets others, fights. That lasts for almost two hours.</p></blockquote>
<blockquote cite="Roger Ebert"><p>There is nothing visible in this world but a barren wasteland. No towns, no houses, no food, no farms, no nothing. Maybe they live on Spam. The resistance is run from a submarine commanded by Gen. Ashdown (Michael Ironside), who wants to destroy Skynet and all of its human POWs. Connor, who is not even human, vows to save them. Wait. That&#8217;s Marcus Wright (Sam Worthington), the guy from the past, who looks so much like Connor that maybe he only thinks he&#8217;s Wright. Marcus is a convicted murderer from the past, awakened from cryogenic sleep.</p></blockquote>
<blockquote cite="Roger Ebert"><p>The first &#8220;Terminator&#8221; movie I regret (I suppose) I did not see. &#8220;Terminator 2: Judgment Day&#8221; (1991) was a fairly terrific movie, set in the (then) future, to prevent the nuclear holocaust of 1997. You remember that. It was about something. In it, Edward Furlong was infinitely more human as John Connor than Christian Bale is in this film.</p></blockquote>
<p><span class="person">Claudia Puig</span> of <span class="title">USA Today</span>:</p>
<blockquote cite="Claudia Puig"><p>Bale is surprisingly one-dimensional as John Connor, the leader of the human Resistance movement whose destiny is linked to the future of mankind in this doomsday action franchise. He seems to be simply recycling his gravelly <span class="title">Dark Knight</span> growl.</p></blockquote>
<blockquote cite="Claudia Puig"><p>Director McG (both Charlie&#8217;s Angels movies) is all about visuals and creating an ominous sense of disorientation, but he&#8217;s not as deft with storytelling or eliciting performances. Few characters ever say more than a couple of sentences at a time, and when they do, it&#8217;s often to assert the obvious. The predictable story feels as if it were written by a computer program labeled &#8220;sequel.&#8221;</p></blockquote>
<p>I haven&#8217;t seen one of these films in full, just parts, action is not my style, I know most have, and you can probably look up the plot to confirm that the plots are really like that. Maybe <span class="title">Terminator Salvation</span> does suck, I can imagine that it does, from what I saw from the other films, they all suck. However I don&#8217;t think these reviewers are truly honest with themselves and their audience, and I see this happening all the time. They&#8217;re <em>trying to find a reason</em> to hate it, they just hate it, for whatever reason, maybe subconscious, maybe they had a bad day when they watched it, maybe they just don&#8217;t like <span class="person">Christian Bale</span> and it ruins the whole film for them, maybe it&#8217;s the power of suggestion in advance. But they just don&#8217;t like it and try to find some way to back this up and write it about it.</p>
<p>Criticizing a <span class="title">Terminator</span> film on one-dimensional acting? What? In the first three films <span class="person">Schwarzenegger</span> played the same character over and over again, he&#8217;s playing a robot for fucks sake, it&#8217;s one dimensional as can be and you can pardon him there for being a crap actor, especially at the end of Rise of the Machines it becomes so obvious that when he can&#8217;t use sunglasses to conceal his facial expression and actually has to make one it looks like a child attempt&#8217;s at acting.</p>
<p>And seriously, attacking it on not having enough plot? The First three films, all had the same basic plot. And in all three both time travellers die with the good guy sacrificing himself and in all cases the aggressor seems unstoppable and at the end always dies with some stupid dumb fuck luck <em>deus ex machina</em>, that&#8217;s right, it&#8217;s a bloody deus ex machina, it&#8217;s well hidden but crap, a helicopter out of no-where crashing on your enemy, your enemy randomly falling in molten steel? Seriously, that could have happened at any point in the film, there&#8217;s no progression whatsoever in any of those films, except maybe the end of them that usually reveals some strange often paradoxal plot-twist.</p>
<p>I&#8217;m not defending <abbr class="title" title="Terminator Salvation">Salvation</abbr> here, I&#8217;m criticizing these reviewers for not being honest with themselves and their audience, what-ever reasons they had for not liking it, it&#8217;s not mentioned in the reviews. It&#8217;s like school days all over again, you hate a classmate really for absurd reasons like his voice and then try to find a more tangible justification for yourself like that he&#8217;s an arse or that he&#8217;s arrogant while a lot of your friends are just as arrogant.</p>
<p>Which is in the end while film reviews or of art in general which have an opinion of the quality thereof are ultimately ridiculous as much as prætentious, one <em>cannot</em> give a true reason for hating these because it works more on the subconscious level than on &#8216;hard&#8217; things like plot or acting or scenery. People just hate these things for some subconscious reason and then try to find arguments. Of course, giving a <em>description</em> of the film without a value judgement is a lot more possible. But in the end people want a hierarchy, they want to be able to say that some things are &#8216;better&#8217; than others, and they want it to be a<em> total order</em>, they want to be able to place every film in it, and they want to præserve the idea that if film <var>x</var> is better than <var>y</var>, and <var>y</var> is better than <var title="Pronounced 'Zed'">z</var> than <var>x</var> is also better than <var>z</var>. Even though clearly you can&#8217;t do this in art, people still make up ways around it like collecting reviews from mainstream critics and normalizing them. You really can&#8217;t go further then &#8216;I like it&#8217;, or &#8216;I don&#8217;t', as soon as you give a reason you&#8217;re lying to yourself and your audience.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.nihilarchitect.net/archives/265/salvation/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

