<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>Daniel Jomphe</title>
  <link href="http://danieljomphe.github.com/atom.xml" rel="self"/>
  <link href="http://danieljomphe.github.com/"/>
  <updated>2011-09-01T11:42:36-07:00</updated>
  <id>http://danieljomphe.github.com/</id>
  <author>
    <name>Daniel Jomphe</name>
    <email>danieljomphe@gmail.com</email>
  </author>
  
    <entry>
      <title>Understanding Dispatch</title>
      <link href="http://danieljomphe.github.com/2009/06/18/understanding-function-dispatch.html"/>
      <updated>2009-06-18T00:00:00-07:00</updated>
      <id>http://danieljomphe.github.com/2009/06/18/understanding-function-dispatch</id>
      <content type="html">&lt;h2&gt;Introduction&lt;/h2&gt;
&lt;p&gt;I believe multiple dispatch is known to be hard to understand. When I first read about it, for some reason, it took me quite a lot of thinking before I really understood it all. Now that I understand it very well, I find it odd that it felt so challenging at the time. For this reason, I wanted to try putting an end to this nonsense. There&amp;#8217;s probably other articles out there that explain it very well today. In any case, here&amp;#8217;s my take. As usual with me, it&amp;#8217;s pretty wordy: I like to surround that kind of knowledge with lots of useful observations.&lt;/p&gt;
&lt;p&gt;Before diving into the matter of the subject, I&amp;#8217;d like to mention the areas where I&amp;#8217;ve chosen conciseness or simplicity over exhaustivity or depth:&lt;/p&gt;
&lt;ol&gt;
	&lt;li&gt;I have decided to always prefer the former over the latter, even when the latter would have made more sense to the knowledgeable reader:
	&lt;ul&gt;
		&lt;li&gt;&lt;strong&gt;&lt;em&gt;Compiler&lt;/em&gt;&lt;/strong&gt; over &lt;em&gt;interpreter&lt;/em&gt;.&lt;/li&gt;
		&lt;li&gt;&lt;strong&gt;&lt;em&gt;Class&lt;/em&gt;&lt;/strong&gt; over &lt;em&gt;type&lt;/em&gt;.&lt;/li&gt;
		&lt;li&gt;&lt;strong&gt;&lt;em&gt;Instance&lt;/em&gt;&lt;/strong&gt; over its equivalents.&lt;/li&gt;
		&lt;li&gt;&lt;strong&gt;&lt;em&gt;Function&lt;/em&gt;&lt;/strong&gt; over &lt;em&gt;method&lt;/em&gt; and their equivalents.&lt;/li&gt;
	&lt;/ul&gt;&lt;/li&gt;
	&lt;li&gt;I have also decided to omit mentioning in-place:
	&lt;ul&gt;
		&lt;li&gt;Error handling.&lt;/li&gt;
		&lt;li&gt;Rules ignored or handled differently by some languages.&lt;/li&gt;
		&lt;li&gt;Extreme flexibility needs may warrant usage of reflection to replace static dispatch.&lt;/li&gt;
	&lt;/ul&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;In any case, these omissions should be easy to spot.&lt;/p&gt;
&lt;h2&gt;Definitions&lt;/h2&gt;
&lt;ol&gt;
	&lt;li&gt;&lt;strong&gt;Function Dispatch&lt;/strong&gt; happens when some code calls a function, and implies two phases &amp;#8211; &lt;strong&gt;search&lt;/strong&gt; and &lt;strong&gt;decide&lt;/strong&gt;:
	&lt;ul&gt;
		&lt;li&gt;First, a &lt;strong&gt;search&lt;/strong&gt; is made for functions of the same name:
		&lt;ul&gt;
			&lt;li&gt;that are accessible to the caller,&lt;/li&gt;
			&lt;li&gt;whose parameters match the call arguments, and&lt;/li&gt;
			&lt;li&gt;whose return type matches the context of the call.&lt;/li&gt;
			&lt;li&gt;This search is almost always done at &lt;em&gt;compile time&lt;/em&gt;. Thus, it&amp;#8217;s part of &lt;strong&gt;static dispatch&lt;/strong&gt;.&lt;/li&gt;
		&lt;/ul&gt;&lt;/li&gt;
		&lt;li&gt;Based on the results of the search, a &lt;strong&gt;decision&lt;/strong&gt; is made:
		&lt;ul&gt;
			&lt;li&gt;If one and only one candidate is found, there&amp;#8217;s no need to make any decision other than returning it to the compiler for its execution.&lt;/li&gt;
			&lt;li&gt;If there&amp;#8217;s more than one candidate, then we&amp;#8217;re in presence of polymorphism:
			&lt;ul&gt;
				&lt;li&gt;If the decision can be made during &lt;em&gt;compile time&lt;/em&gt;, then &lt;em&gt;dispatch&lt;/em&gt; makes it and returns the winner to the compiler.&lt;/li&gt;
				&lt;li&gt;Otherwise, if the compiler anticipates that the decision could be made during &lt;em&gt;run time&lt;/em&gt;, then it makes provision for the eventual &lt;em&gt;dynamic dispatch&lt;/em&gt; of the call.&lt;/li&gt;
			&lt;/ul&gt;&lt;/li&gt;
			&lt;li&gt;&lt;strong&gt;Dynamic Dispatch&lt;/strong&gt; is all about making a decision related to &lt;em&gt;run time&lt;/em&gt; polymorphism. It has access to the results of the search made during the static dispatch. Thus, it decides which candidate should be executed depending on the run time class information available:
			&lt;ul&gt;
				&lt;li&gt;&lt;strong&gt;Single Dispatch&lt;/strong&gt; pertains to the category of Object Oriented Programming where &lt;em&gt;Classes&lt;/em&gt; &lt;strong&gt;own&lt;/strong&gt; their functions. Typical &lt;span class=&quot;caps&quot;&gt;OOP&lt;/span&gt;. Thus, the polymorphism in single dispatch is all about making sure the proper function of &lt;strong&gt;the&lt;/strong&gt; instance&amp;#8217;s class hierarchy is executed.&lt;/li&gt;
				&lt;li&gt;&lt;strong&gt;Multiple Dispatch&lt;/strong&gt; pertains to what could be called a wider definition of Object Oriented Programming. Or, arguably, it&amp;#8217;s the polymorphism of Functional Programming. To define multiple dispatch, let&amp;#8217;s use contrasts:
				&lt;ul&gt;
					&lt;li&gt;&lt;em&gt;Single&lt;/em&gt; dispatch is &lt;strong&gt;only&lt;/strong&gt; concerned with the run time &lt;strong&gt;class&lt;/strong&gt; of &lt;strong&gt;the&lt;/strong&gt; instance to which a function &lt;strong&gt;belongs&lt;/strong&gt;.&lt;/li&gt;
					&lt;li&gt;&lt;em&gt;Multiple&lt;/em&gt; dispatch is concerned with the run time &lt;strong&gt;information&lt;/strong&gt; of &lt;strong&gt;all&lt;/strong&gt; the instance(s) to which a function &lt;strong&gt;is associated&lt;/strong&gt;.&lt;/li&gt;
					&lt;li&gt;That&amp;#8217;s it, and that&amp;#8217;s why they&amp;#8217;re called &lt;em&gt;single&lt;/em&gt; and &lt;em&gt;multiple&lt;/em&gt; dispatch.&lt;/li&gt;
				&lt;/ul&gt;&lt;/li&gt;
			&lt;/ul&gt;&lt;/li&gt;
		&lt;/ul&gt;&lt;/li&gt;
	&lt;/ul&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Observations&lt;/h2&gt;
&lt;ol&gt;
	&lt;li&gt;&lt;strong&gt;Single Dispatch&lt;/strong&gt;
	&lt;ul&gt;
		&lt;li&gt;Classes define which functions they provide. They &lt;em&gt;own&lt;/em&gt; them. Typically, the definition of each one of their functions is written &lt;em&gt;inside&lt;/em&gt; their own definition.&lt;/li&gt;
		&lt;li&gt;&lt;strong&gt;Thus in this model, classes rule.&lt;/strong&gt;&lt;/li&gt;
		&lt;li&gt;Closed. &lt;em&gt;If you own the class, you own its future.&lt;/em&gt;
		&lt;ul&gt;
			&lt;li&gt;The owner will need to evaluate and decide if it&amp;#8217;s wise-and how-to open the class properly for future evolution.&lt;/li&gt;
		&lt;/ul&gt;&lt;/li&gt;
		&lt;li&gt;&lt;strong&gt;Polymorphism is limited to happen only on the class of the instance of the function called, and nowhere else!&lt;/strong&gt;
		&lt;ul&gt;
			&lt;li&gt;Thus, it&amp;#8217;s the kind of run time polymorphism most programmers are used to.&lt;/li&gt;
		&lt;/ul&gt;&lt;/li&gt;
		&lt;li&gt;The associations expressed with this model are necessarily of cardinality 1 to N.&lt;/li&gt;
		&lt;li&gt;Mixins still fit in this category.&lt;/li&gt;
		&lt;li&gt;&lt;em&gt;That&amp;#8217;s typical &lt;span class=&quot;caps&quot;&gt;OOP&lt;/span&gt;!&lt;/em&gt;&lt;/li&gt;
	&lt;/ul&gt;&lt;/li&gt;
	&lt;li&gt;&lt;strong&gt;Multiple Dispatch&lt;/strong&gt;
	&lt;ul&gt;
		&lt;li&gt;Functions simply define which parameters they support as usual.
		&lt;ul&gt;
			&lt;li&gt;Each parameter may be expressed in a way to imply a run time polymorphism check.&lt;/li&gt;
		&lt;/ul&gt;&lt;/li&gt;
		&lt;li&gt;&lt;strong&gt;Thus in this model, functions rule.&lt;/strong&gt;&lt;/li&gt;
		&lt;li&gt;Closed. &lt;em&gt;If you own the function, you own its future.&lt;/em&gt;
		&lt;ul&gt;
			&lt;li&gt;The owner will need to evaluate and decide if it&amp;#8217;s wise-and how-to open the function properly for future evolution.&lt;/li&gt;
		&lt;/ul&gt;&lt;/li&gt;
		&lt;li&gt;&lt;strong&gt;Polymorphism happens &lt;em&gt;everywhere&lt;/em&gt; and &lt;em&gt;anyhow&lt;/em&gt; you want it!&lt;/strong&gt;
		&lt;ul&gt;
			&lt;li&gt;&lt;strong&gt;everywhere&lt;/strong&gt;: each parameter may use run time checks&lt;/li&gt;
			&lt;li&gt;&lt;strong&gt;anyhow&lt;/strong&gt;: polymorphism is not limited in terms of examining the identity of an instance&amp;#8217;s class. It may instead decide to inspect values, internal structure or metadata.&lt;/li&gt;
		&lt;/ul&gt;&lt;/li&gt;
		&lt;li&gt;This model may be used to express any kind of association: 1 to N and M to N.&lt;/li&gt;
		&lt;li&gt;&lt;em&gt;That&amp;#8217;s very powerful functional programming!&lt;/em&gt;&lt;/li&gt;
	&lt;/ul&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Of course, some languages mix together the models behind single dispatch and multiple dispatch. This yields languages that feel more familiar to typical Object Oriented programmers, while keeping all the advantages of multiple dispatch.&lt;/p&gt;
&lt;h2&gt;Examples&lt;/h2&gt;
&lt;p&gt;Are they still needed to grok it? Well, I suppose they could help. &amp;#8230;But they&amp;#8217;re scheduled for later! If someone mentions me that the great set of examples I have in mind might be very useful, it might accelerate a lot my settling on writing them.&lt;/p&gt;</content>
    </entry>
  
    <entry>
      <title>10 Reasons To Strictly Separate The V In MVC</title>
      <link href="http://danieljomphe.github.com/2009/03/31/x-reasons-to-strictly-separate-v-from-mc-in-mvc.html"/>
      <updated>2009-03-31T00:00:00-07:00</updated>
      <id>http://danieljomphe.github.com/2009/03/31/x-reasons-to-strictly-separate-v-from-mc-in-mvc</id>
      <content type="html">&lt;p&gt;A few months ago, I spent some time researching better &lt;acronym title=&quot;Model-View-Controller&quot;&gt;&lt;span class=&quot;caps&quot;&gt;MVC&lt;/span&gt;&lt;/acronym&gt; practices. After discussing about it with my colleagues, I researched the following reasons why a business would want to &lt;strong&gt;strictly&lt;/strong&gt; separate the V in &lt;span class=&quot;caps&quot;&gt;MVC&lt;/span&gt; from MC.&lt;/p&gt;
&lt;p&gt;Note that the following points are of course only true of a &lt;span class=&quot;caps&quot;&gt;MVC&lt;/span&gt; app which started from day 0 with a V template engine that strictly enforces separation of V from MC.&lt;/p&gt;
&lt;ol&gt;
	&lt;li&gt;&lt;strong&gt;V template engine easier and faster to learn&lt;/strong&gt;
	&lt;ul&gt;
		&lt;li&gt;No need to learn a (nearly-/fully-)turing-compliant language&lt;/li&gt;
		&lt;li&gt;No need to learn best practices to avoid entangling with MC&lt;/li&gt;
	&lt;/ul&gt;&lt;/li&gt;
	&lt;li&gt;&lt;strong&gt;V faster to write&lt;/strong&gt;
		&lt;ul&gt;
			&lt;li&gt;Impossible to write business logic in V&lt;/li&gt;
			&lt;li&gt;Programming constructs easier to use&lt;/li&gt;
			&lt;li&gt;Final appearance/structure easier to understand/visualize&lt;/li&gt;
			&lt;li&gt;No need to review to make sure V avoids entangling with MC&lt;/li&gt;
		&lt;/ul&gt;&lt;/li&gt;
	&lt;li&gt;&lt;strong&gt;V faster to maintain&lt;/strong&gt;
	&lt;ul&gt;
		&lt;li&gt;Impossible for V to introduce bugs in business logic&lt;/li&gt;
	&lt;/ul&gt;&lt;/li&gt;
	&lt;li&gt;&lt;strong&gt;V more generic/general/reusable&lt;/strong&gt;
	&lt;ul&gt;
		&lt;li&gt;Each part of a template is more applicable to other apps
		&lt;ul&gt;
			&lt;li&gt;A template can be composed of multiple templates&lt;/li&gt;
			&lt;li&gt;Each purpose-specific template will look pretty much the same in different apps.&lt;/li&gt;
		&lt;/ul&gt;&lt;/li&gt;
	&lt;/ul&gt;&lt;/li&gt;
	&lt;li&gt;&lt;strong&gt;V more easily secured&lt;/strong&gt;
	&lt;ul&gt;
		&lt;li&gt;No control structures used&lt;/li&gt;
		&lt;li&gt;No business logic in V&lt;/li&gt;
	&lt;/ul&gt;&lt;/li&gt;
	&lt;li&gt;&lt;strong&gt;V easier to swap for a sexier V&lt;/strong&gt;
	&lt;ul&gt;
		&lt;li&gt;No business logic in V&lt;/li&gt;
	&lt;/ul&gt;&lt;/li&gt;
	&lt;li&gt;&lt;strong&gt;V introduces 0 bugs in an app&amp;#8217;s business behavior&lt;/strong&gt;
	&lt;ul&gt;
		&lt;li&gt;Only possible bugs are presentation-related&lt;/li&gt;
	&lt;/ul&gt;&lt;/li&gt;
	&lt;li&gt;&lt;strong&gt;V can be written/maintained by designers (or others)&lt;/strong&gt;
	&lt;ul&gt;
		&lt;li&gt;See previous points.&lt;/li&gt;
	&lt;/ul&gt;&lt;/li&gt;
	&lt;li&gt;&lt;strong&gt;V and MC can be written concurrently more easily and naturally&lt;/strong&gt;
	&lt;ul&gt;
		&lt;li&gt;See previous points.&lt;/li&gt;
	&lt;/ul&gt;&lt;/li&gt;
	&lt;li&gt;&lt;strong&gt;Debugging faster than with traditional &lt;span class=&quot;caps&quot;&gt;MVC&lt;/span&gt; apps&lt;/strong&gt;
	&lt;ul&gt;
		&lt;li&gt;All business-related behavior bugs are in MC
		&lt;ul&gt;
			&lt;li&gt;No need to look at V for business logic&lt;/li&gt;
		&lt;/ul&gt;&lt;/li&gt;
		&lt;li&gt;Proper MC design more emphasized
		&lt;ul&gt;
			&lt;li&gt;MC completely reflects the business logic&lt;/li&gt;
		&lt;/ul&gt;&lt;/li&gt;
	&lt;/ul&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Consequently, I think it&amp;#8217;s safe to say that with strictly-enforced separation of V from MC:&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;Developing a &lt;span class=&quot;caps&quot;&gt;MVC&lt;/span&gt; application is faster&lt;/li&gt;
	&lt;li&gt;Maintaining a &lt;span class=&quot;caps&quot;&gt;MVC&lt;/span&gt; application is faster&lt;/li&gt;
	&lt;li&gt;Evolving a &lt;span class=&quot;caps&quot;&gt;MVC&lt;/span&gt; application is faster&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Or, &lt;strong&gt;on a business point of view&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;Developing, maintaining and evolving applications costs less.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;A Practical Solution&lt;/h2&gt;
&lt;p&gt;Although it&amp;#8217;s not yet as popular as some non-strict alternatives like Velocity and FreeMarker, &lt;a href=&quot;http://www.stringtemplate.org/&quot;&gt;StringTemplate&lt;/a&gt; is the most serious and solid strict V // MC template engine I know of. If you can integrate it in your projects, you won&amp;#8217;t be disappointed:&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;&lt;strong&gt;Benefits of the strict separation are backed by formal evidence&lt;/strong&gt;
	&lt;ul&gt;
		&lt;li&gt;&lt;a href=&quot;http://www.cs.usfca.edu/~parrt/papers/mvc.templates.pdf&quot;&gt;White Paper&lt;/a&gt; [pdf]&lt;/li&gt;
		&lt;li&gt;&lt;a href=&quot;/assets/mvc.templates-annotated.pdf&quot;&gt;My annotated version of the same White Paper&lt;/a&gt; [pdf]&lt;/li&gt;
	&lt;/ul&gt;&lt;/li&gt;
	&lt;li&gt;&lt;strong&gt;Mature&lt;/strong&gt;
	&lt;ul&gt;
		&lt;li&gt;Many years of development, evolution and usage
		&lt;ul&gt;
			&lt;li&gt;started in 1999&lt;/li&gt;
			&lt;li&gt;public since 2003&lt;/li&gt;
		&lt;/ul&gt;&lt;/li&gt;
	&lt;/ul&gt;&lt;/li&gt;
	&lt;li&gt;&lt;strong&gt;Used in critical software&lt;/strong&gt;
	&lt;ul&gt;
		&lt;li&gt;&lt;span class=&quot;caps&quot;&gt;ANTLR&lt;/span&gt;, one of the most widely recognized parser generators!&lt;/li&gt;
	&lt;/ul&gt;&lt;/li&gt;
	&lt;li&gt;&lt;strong&gt;Used by important industry players&lt;/strong&gt;
	&lt;ul&gt;
		&lt;li&gt;Adobe (Flex 3)&lt;/li&gt;
		&lt;li&gt;Jboss (Rules &amp;#8211; Drools)&lt;/li&gt;
		&lt;li&gt;Home Depot (a web site with &amp;gt; 500 000 hits per week)&lt;/li&gt;
		&lt;li&gt;Oracle&lt;/li&gt;
		&lt;li&gt;&lt;a href=&quot;http://www.squarespace.com&quot;&gt;Squarespace&lt;/a&gt;, a publishing platform. Their templates are editable by thousands of bloggers/businesses.
		&lt;ul&gt;
			&lt;li&gt;&amp;#8220;StringTemplate was &lt;span class=&quot;caps&quot;&gt;PERFECT&lt;/span&gt; for this. We needed a system that would: (1) Be &lt;strong&gt;extremely fast/simple&lt;/strong&gt; and (2) &lt;span class=&quot;caps&quot;&gt;ENSURE&lt;/span&gt; that &lt;strong&gt;users can do nothing to harm our system&lt;/strong&gt;.&amp;#8221;&lt;/li&gt;
			&lt;li&gt;&amp;#8220;[On the other hand,] Velocity would have been nearly impossible to enforce security with. There were numerous attacks related to invoking classLoaders by referencing getClass on random objects, not to mention that the very paradigm of the templates caused us to write code that did not strictly enforce view vs. controller, further resulting in code we had written that could have been insecure in many cases. It wasn&amp;#8217;t just impossible to stop users, but also ourselves in many cases.&amp;#8221;&lt;/li&gt;
			&lt;li&gt;This testimony is confirmed through its mention in the formal paper.&lt;/li&gt;
		&lt;/ul&gt;&lt;/li&gt;
	&lt;/ul&gt;&lt;/li&gt;
	&lt;li&gt;&lt;strong&gt;Capable of generating any kind of text (xml, html, css, java, etc.)&lt;/strong&gt;&lt;/li&gt;
	&lt;li&gt;&lt;strong&gt;Powerful enough to express your needs in a V&lt;/strong&gt;
	&lt;ul&gt;
		&lt;li&gt;This addresses the common fear that a template engine might not be powerful enough for some needs.&lt;/li&gt;
		&lt;li&gt;Evidence comes from &lt;span class=&quot;caps&quot;&gt;ANTLR&lt;/span&gt; being able to generate parsers using it.&lt;/li&gt;
	&lt;/ul&gt;&lt;/li&gt;
	&lt;li&gt;&lt;strong&gt;Code released under the generous &lt;span class=&quot;caps&quot;&gt;BSD&lt;/span&gt;-3 license.&lt;/strong&gt;&lt;/li&gt;
	&lt;li&gt;&lt;strong&gt;Implemented in Java&lt;/strong&gt;
	&lt;ul&gt;
		&lt;li&gt;Integrates with Spring &lt;span class=&quot;caps&quot;&gt;MVC&lt;/span&gt;.&lt;/li&gt;
		&lt;li&gt;Builds with Maven.&lt;/li&gt;
	&lt;/ul&gt;&lt;/li&gt;
	&lt;li&gt;&lt;strong&gt;Ported to other languages&lt;/strong&gt;
	&lt;ul&gt;
		&lt;li&gt;Official ports: C# and Python&lt;/li&gt;
		&lt;li&gt;Unofficial ports for your favorite language may exist.&lt;/li&gt;
	&lt;/ul&gt;&lt;/li&gt;
	&lt;li&gt;&lt;strong&gt;Also available as a command-line tool.&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;http://www.artima.com/lejava/articles/stringtemplate.html&lt;/p&gt;</content>
    </entry>
  
    <entry>
      <title>The Case For Functional Programming</title>
      <link href="http://danieljomphe.github.com/2009/01/29/the-case-for-functional-programming.html"/>
      <updated>2009-01-29T00:00:00-08:00</updated>
      <id>http://danieljomphe.github.com/2009/01/29/the-case-for-functional-programming</id>
      <content type="html">&lt;h2 id=&quot;contents&quot;&gt;What Is Discussed Here?&lt;/h2&gt;
&lt;ul&gt;
	&lt;li&gt;&lt;a href=&quot;#comparing&quot;&gt;Comparing Different Language Levels&lt;/a&gt;
	&lt;ul&gt;
		&lt;li&gt;&lt;a href=&quot;#how-to-conclude&quot;&gt;How To Reach Truthful Conclusions&lt;/a&gt;
		&lt;ul&gt;
			&lt;li&gt;&lt;a href=&quot;#daniel-jomphe&quot;&gt;Qualifications Of Yours Truly&lt;/a&gt;&lt;/li&gt;
			&lt;li&gt;&lt;a href=&quot;#john-smith&quot;&gt;Qualifications Of John Smith&lt;/a&gt;&lt;/li&gt;
		&lt;/ul&gt;&lt;/li&gt;
		&lt;li&gt;&lt;a href=&quot;#natural-language&quot;&gt;Natural Language &amp;#8211; The Testbed&lt;/a&gt;
		&lt;ul&gt;
			&lt;li&gt;&lt;a href=&quot;#english-dialect&quot;&gt;Some English Dialect&lt;/a&gt;&lt;/li&gt;
		&lt;/ul&gt;&lt;/li&gt;
		&lt;li&gt;&lt;a href=&quot;#declarative-language&quot;&gt;Declarative Language&lt;/a&gt;
		&lt;ul&gt;
			&lt;li&gt;&lt;a href=&quot;#lisp-dialect&quot;&gt;Some Functional Lisp Dialect&lt;/a&gt;&lt;/li&gt;
			&lt;li&gt;&lt;a href=&quot;#haskell-dialect&quot;&gt;Some Functional Haskell Dialect&lt;/a&gt;&lt;/li&gt;
		&lt;/ul&gt;&lt;/li&gt;
		&lt;li&gt;&lt;a href=&quot;#imperative-language&quot;&gt;Imperative Language&lt;/a&gt;
		&lt;ul&gt;
			&lt;li&gt;&lt;a href=&quot;#java-dialect&quot;&gt;Some Object-Oriented Java Dialect&lt;/a&gt;&lt;/li&gt;
			&lt;li&gt;&lt;a href=&quot;#c-dialect&quot;&gt;Some Procedural C Dialect&lt;/a&gt;&lt;/li&gt;
			&lt;li&gt;&lt;a href=&quot;#assembly-dialect&quot;&gt;Some Procedural Assembly Language Dialect&lt;/a&gt;&lt;/li&gt;
		&lt;/ul&gt;&lt;/li&gt;
		&lt;li&gt;&lt;a href=&quot;#chef-is-no-fool&quot;&gt;Stop taking the Chef for a fool!&lt;/a&gt;
		&lt;ul&gt;
			&lt;li&gt;&lt;a href=&quot;#our-comparison-conclusion&quot;&gt;Conclusion&lt;/a&gt;&lt;/li&gt;
			&lt;li&gt;&lt;a href=&quot;#chef-dialect&quot;&gt;Some Chef Dialect&lt;/a&gt;&lt;/li&gt;
			&lt;li&gt;&lt;a href=&quot;#whos-the-chef&quot;&gt;Who&amp;#8217;s The Chef?&lt;/a&gt;&lt;/li&gt;
		&lt;/ul&gt;&lt;/li&gt;
	&lt;/ul&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href=&quot;#stronger-comparisons&quot;&gt;Stronger Comparisons Of Language Levels&lt;/a&gt;
	&lt;ul&gt;
		&lt;li&gt;&lt;a href=&quot;#backus&quot;&gt;1977 &amp;#8211; John Backus&lt;/a&gt;
		&lt;ul&gt;
			&lt;li&gt;&lt;a href=&quot;#backus-frustrations&quot;&gt;Frustrations And Solutions&lt;/a&gt;&lt;/li&gt;
			&lt;li&gt;&lt;a href=&quot;#backus-comparison&quot;&gt;On Imperative Programming Languages&lt;/a&gt;&lt;/li&gt;
			&lt;li&gt;&lt;a href=&quot;#backus-references&quot;&gt;References&lt;/a&gt;&lt;/li&gt;
		&lt;/ul&gt;&lt;/li&gt;
		&lt;li&gt;&lt;a href=&quot;#turner&quot;&gt;1982 &amp;#8211; David Turner&lt;/a&gt;
		&lt;ul&gt;
			&lt;li&gt;&lt;a href=&quot;#turner-solutions&quot;&gt;Problems And Solutions&lt;/a&gt;&lt;/li&gt;
			&lt;li&gt;&lt;a href=&quot;#turner-mathematics&quot;&gt;The Desirable Properties Of Mathematical Language&lt;/a&gt;&lt;/li&gt;
			&lt;li&gt;&lt;a href=&quot;#turner-comparison&quot;&gt;On Imperative Programming Languages&lt;/a&gt;&lt;/li&gt;
			&lt;li&gt;&lt;a href=&quot;#turner-references&quot;&gt;References&lt;/a&gt;&lt;/li&gt;
		&lt;/ul&gt;&lt;/li&gt;
		&lt;li&gt;&lt;a href=&quot;#hughes&quot;&gt;1984 &amp;#8211; John Hughes&lt;/a&gt;
		&lt;ul&gt;
			&lt;li&gt;&lt;a href=&quot;#hughes-references&quot;&gt;References&lt;/a&gt;&lt;/li&gt;
		&lt;/ul&gt;&lt;/li&gt;
	&lt;/ul&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;comparing&quot;&gt;Comparing Different Language Levels&lt;/h2&gt;
&lt;p&gt;In this section, we will derive important conclusions from real life observations.&lt;/p&gt;
&lt;h3 id=&quot;how-to-conclude&quot;&gt;How To Reach Truthful Conclusions&lt;/h3&gt;
&lt;p&gt;To this avail, we need to pick someone very special.&lt;/p&gt;
&lt;h4 id=&quot;daniel-jomphe&quot;&gt;Qualifications Of Yours Truly&lt;/h4&gt;
&lt;p&gt;Well, ehr, we can&amp;#8217;t use me. Why? Because I&amp;#8217;m a Java and C++ programmer. Because I&amp;#8217;m no expert. Because I&amp;#8217;m not used to any other kind of programming than what is called Imperative Programming. You know, although I certainly ain&amp;#8217;t nobody, I&amp;#8217;m still not too far from being your regular Joe.&lt;/p&gt;
&lt;p&gt;Now, thinking of this, I know &lt;em&gt;someone&lt;/em&gt; who&amp;#8217;s not your average Joe at all. Yes, that&amp;#8217;s right: we&amp;#8217;ll pick him! This guy&amp;#8217;s uniquely qualified to derive objective conclusions. Ladies and Gentlemen, allow me to present you &lt;em&gt;the&lt;/em&gt; John Smith.&lt;/p&gt;
&lt;h4 id=&quot;john-smith&quot;&gt;Qualifications Of John Smith&lt;/h4&gt;
&lt;p&gt;Why &lt;strong&gt;John Smith&lt;/strong&gt;? Because, you see, John Smith is the only guy in the world who&amp;#8217;s a complete expert of all the programming language dialects I&amp;#8217;m going to use in this article. All of them, no trick!&lt;/p&gt;
&lt;p&gt;More importantly and more impressively, &lt;em&gt;John Smith learned those languages perfectly concurrently&lt;/em&gt;, and &lt;em&gt;used them equally ever since&lt;/em&gt;. And yet, as if this was not enough qualifications for him, John has been spending 1 hour per working day since the start of his career in 1996, speaking about these different languages with his dozens of siblings who go by the same name as his&amp;#8217;, but work in very different contexts. And guess what? &lt;em&gt;They all share this very same background.&lt;/em&gt; They all think along the same lines as John&amp;#8217;s. Can you believe it? Incredible, isn&amp;#8217;t it?&lt;/p&gt;
&lt;p&gt;Now, consequently, allow me to truthfully claim that John Smith is, &lt;em&gt;out of any possible doubt&lt;/em&gt;, the very best person to help us reach meaningful conclusions about the fundamental differences of these languages.&lt;/p&gt;
&lt;p&gt;Doesn&amp;#8217;t it feel great to have John Smith with us to help us think this all through? Thanks John, I owe you one!&lt;/p&gt;
&lt;h3 id=&quot;natural-language&quot;&gt;Natural Language &amp;#8211; The Testbed&lt;/h3&gt;
&lt;p&gt;Now that we have introduced John Smith, let&amp;#8217;s talk about the program we will use to compare our different languages.&lt;/p&gt;
&lt;p&gt;John said any program could do, so for illustration purposes, this program will be a recipe I chose by asking Google&amp;#8217;s first result for &lt;code&gt;recipe&lt;/code&gt;, and clicking on two links. The first one led me to a deserts page, and the second one to the yummy-looking &lt;a href=&quot;http://allrecipes.com/Recipe/Blueberry-Buckle/Detail.aspx&quot;&gt;Blueberry Buckle&lt;/a&gt;. This recipe&amp;#8217;s directions are what we will program.&lt;/p&gt;
&lt;h4 id=&quot;english-dialect&quot;&gt;Some English Dialect&lt;/h4&gt;
&lt;p&gt;For the sake of simplicity, I have inserted the ingredients and their measures right into their preparation directions:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;ol&gt;&lt;li&gt;Preheat oven to 375 degrees. Grease one 8&amp;#215;8 inch pan.&lt;/li&gt;&lt;li&gt;Cream together 3/4 cup sugar, 1/4 cup shortening, and one egg.&lt;/li&gt;&lt;li&gt;In a separate bowl mix together 2 cups flour, 2 teaspoons baking powder, and 1/2 teaspoon salt. Stir into sugar mixture, alternating with 1/2 cup milk. Stir in 2 cups fresh blueberries. Pour into greased 8&amp;#215;8 inch pan.&lt;/li&gt;&lt;li&gt;To make topping: Combine 1/2 cup sugar, 1/3 cup flour, 1/2 teaspoon ground cinnamon, and 1/4 cup butter. Sprinkle over cake batter.&lt;/li&gt;&lt;li&gt;Bake at 375 degree for 25-30 minutes.&lt;/li&gt;&lt;/ol&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Now, let&amp;#8217;s see how this may be programmed. Please note that in the following versions of these directions, I have, out of pure laziness, left some functions undefined.&lt;/p&gt;
&lt;h3 id=&quot;declarative-language&quot;&gt;Declarative Language&lt;/h3&gt;
&lt;p&gt;Understanding the concept of &lt;strong&gt;declarative&lt;/strong&gt; programming is useful to see the simplicity of &lt;strong&gt;functional&lt;/strong&gt; programming, since the latter is a special case of the former. Therefore, the following definition should help.&lt;/p&gt;
&lt;p&gt;One could think of a declarative language as one which expresses computations as &lt;em&gt;a hierarchy of &lt;strong&gt;result descriptions&lt;/strong&gt;&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Following this line of thinking, functional programming expresses computations as &lt;em&gt;a hierarchy of &lt;strong&gt;function applications&lt;/strong&gt;&lt;/em&gt;, where each function produces a result.&lt;/p&gt;
&lt;p&gt;When a programmer uses the functional style, he is mostly concerned with defining and combining functions and their applications.&lt;/p&gt;
&lt;p&gt;Since the mechanism of function application, or in other words, &lt;strong&gt;function call&lt;/strong&gt;, is universally known, functional programming is far from being inaccessible. And that&amp;#8217;s precisely what might come as a surprise to one who has heard that functional programming is a weird way of thinking of the process of writing software.&lt;/p&gt;
&lt;p&gt;Before we ponder onto why and how we&amp;#8217;ve got to think that functional programming is weird, let&amp;#8217;s dive into a few declarative languages to see how they look.&lt;/p&gt;
&lt;p&gt;Note that I have taken the liberty to personalize their syntaxes so that they read more easily to the eyes of a java-like language programmer. Therefore, please try not to reason too much about the meaning of how the parenthesises are used. The code examples are not there to help you learn these languages. They&amp;#8217;re rather there to help you see more quickly the fundamental semantics of each language. The biggest changes I&amp;#8217;ve made was adding a bunch of parenthesises that should not be where they are, and removing some others whose placement would have felt awkward to any java-like language programmer.&lt;/p&gt;
&lt;h4 id=&quot;lisp-dialect&quot;&gt;Some Functional Lisp Dialect&lt;/h4&gt;
&lt;p&gt;Remark how this code says only what&amp;#8217;s needed:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;clojure&quot;&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;defn &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;blueberry-buckle&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;bake&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;oven&lt;/span&gt;       &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;375&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;ready-cake&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;([&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;25&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;..&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;30&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]))))&lt;/span&gt;

&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;defn &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;ready-cake&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;sprinkle&lt;/span&gt;
    &lt;span class=&quot;nv&quot;&gt;topping&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;pan-cake&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))))&lt;/span&gt;

&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;defn &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;pan-cake&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;pour&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;blue-cake&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;pan&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;([&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;8&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;8&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;crisco&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))))&lt;/span&gt;

&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;defn &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;blue-cake&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;stir&lt;/span&gt;
    &lt;span class=&quot;nv&quot;&gt;blueberries&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;cup&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;smooth-cake&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)))&lt;/span&gt;

&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;defn &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;smooth-cake&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;mix-progressively&lt;/span&gt;
    &lt;span class=&quot;nv&quot;&gt;milk&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;cup&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;/4&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;nv&quot;&gt;cream&lt;/span&gt;
    &lt;span class=&quot;nv&quot;&gt;base&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Now, here are a few global variables. They would normally be included as local variables of the functions that need them, but I wanted the code to be easier for you to read, hence these separate definitions:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;clojure&quot;&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;def &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;topping&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;mix&lt;/span&gt;
    &lt;span class=&quot;nv&quot;&gt;sugar&lt;/span&gt;    &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;cup&lt;/span&gt;      &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;/2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;nv&quot;&gt;flour&lt;/span&gt;    &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;cup&lt;/span&gt;      &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;/3&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;nv&quot;&gt;cinnamon&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;teaspoon&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;/2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;nv&quot;&gt;butter&lt;/span&gt;   &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;cup&lt;/span&gt;      &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;/4&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)))&lt;/span&gt;

&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;def &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;cream&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;mix&lt;/span&gt;
    &lt;span class=&quot;nv&quot;&gt;sugar&lt;/span&gt;  &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;cup&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;/4&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;nv&quot;&gt;crisco&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;cup&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;/4&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;nv&quot;&gt;egg&lt;/span&gt;    &lt;span class=&quot;p&quot;&gt;()))&lt;/span&gt;

&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;def &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;base&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;mix&lt;/span&gt;
    &lt;span class=&quot;nv&quot;&gt;flour&lt;/span&gt;         &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;cup&lt;/span&gt;        &lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;nv&quot;&gt;baking-powder&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;teaspoon&lt;/span&gt;   &lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;nv&quot;&gt;salt&lt;/span&gt;          &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;teaspoon&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;/2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Here are a few interesting properties of this code:&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;It seems to put an emphasis on the functional forms used.&lt;/li&gt;
	&lt;li&gt;It&amp;#8217;s laid out in a kind of vertical, narrow column.&lt;/li&gt;
	&lt;li&gt;Types are &lt;strong&gt;strongly&lt;/strong&gt; and &lt;strong&gt;dynamically checked&lt;/strong&gt;.&lt;/li&gt;
	&lt;li&gt;It uses only one programming technique: function application.&lt;/li&gt;
	&lt;li&gt;The order in which each expression is written doesn&amp;#8217;t matter.&lt;/li&gt;
&lt;/ul&gt;
&lt;h5&gt;John Smith&amp;#8217;s Objective Opinion&lt;/h5&gt;
&lt;p&gt;According to John Smith, this version of the program is &lt;em&gt;the&lt;/em&gt; &lt;strong&gt;fastest&lt;/strong&gt; and &lt;strong&gt;easiest&lt;/strong&gt; to read and write. He says it&amp;#8217;s also one of the &lt;strong&gt;fastest&lt;/strong&gt; and &lt;strong&gt;easiest&lt;/strong&gt; to maintain.&lt;/p&gt;
&lt;p&gt;(He already took a look at the other versions of this code example that follow. What a dude!)&lt;/p&gt;
&lt;h6&gt;Reactions&lt;/h6&gt;
&lt;p&gt;Hey, &lt;em&gt;doesn&amp;#8217;t this mean that the Java version isn&amp;#8217;t the fastest and easiest one&lt;/em&gt;?&lt;/p&gt;
&lt;p&gt;Doesn&amp;#8217;t this feel weird to you? John may say this, but what&amp;#8217;s the heck anyway with these weird functional, academic-level languages, right? Such languages aren&amp;#8217;t fit for critical production usage. They would crumble under hardship. They&amp;#8217;re not battle-tested. They&amp;#8217;re not widely used. They&amp;#8217;re too hard to learn. Right?&lt;/p&gt;
&lt;p&gt;Wait, John says these assumptions of ours are all false. How could it be? Let&amp;#8217;s skip to the next section, may we?&lt;/p&gt;
&lt;h4 id=&quot;haskell-dialect&quot;&gt;Some Functional Haskell Dialect&lt;/h4&gt;
&lt;p&gt;In this language, each function name is written on the left side of &lt;code&gt;=&lt;/code&gt;, which means &amp;#8220;&amp;#8230; is described as &amp;#8230;&amp;#8221;. Obviously, the right side of &lt;code&gt;=&lt;/code&gt; describes what computations each function depends on to produce its result.&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;haskell&quot;&gt;&lt;span class=&quot;nf&quot;&gt;blueberryBuckle&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;bake&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;Oven&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;375&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;readyCake&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;([&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;25&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;..&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;30&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]))&lt;/span&gt;

&lt;span class=&quot;nf&quot;&gt;readyCake&lt;/span&gt;       &lt;span class=&quot;ow&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;sprinkle&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;topping&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;panCake&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;kr&quot;&gt;where&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;topping&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;mix&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;([&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;Sugar&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;Cup&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)),&lt;/span&gt;         &lt;span class=&quot;kt&quot;&gt;Flour&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;Cup&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)),&lt;/span&gt;
                       &lt;span class=&quot;kt&quot;&gt;Cinnamon&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;Teaspoon&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)),&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Butter&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;Cup&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))])&lt;/span&gt;

&lt;span class=&quot;nf&quot;&gt;panCake&lt;/span&gt;         &lt;span class=&quot;ow&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;pour&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;blueCake&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Pan&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;([&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;8&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;8&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Crisco&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;

&lt;span class=&quot;nf&quot;&gt;blueCake&lt;/span&gt;        &lt;span class=&quot;ow&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;stir&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;BlueBerries&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;Cup&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)),&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;smoothCake&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; 

&lt;span class=&quot;nf&quot;&gt;smoothCake&lt;/span&gt;      &lt;span class=&quot;ow&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;mixProgressively&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;([&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;Milk&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;Cup&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)),&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;cream&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;base&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;])&lt;/span&gt;
  &lt;span class=&quot;kr&quot;&gt;where&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;cream&lt;/span&gt;   &lt;span class=&quot;ow&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;mix&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;([&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;Sugar&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;Cup&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)),&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Crisco&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;Cup&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)),&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Egg&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;()&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;])&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;base&lt;/span&gt;    &lt;span class=&quot;ow&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;mix&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;([&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;Flour&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;Cup&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)),&lt;/span&gt;   &lt;span class=&quot;kt&quot;&gt;BakingPowder&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;Teaspoon&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)),&lt;/span&gt;
                       &lt;span class=&quot;kt&quot;&gt;Salt&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;Teaspoon&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))])&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Now, let&amp;#8217;s implement three of the unimplemented functions, just to see how algorithms are expressed in Haskell:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;haskell&quot;&gt;&lt;span class=&quot;nf&quot;&gt;mix&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ings&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;              &lt;span class=&quot;ow&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;stir&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ings&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Mixture&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;()&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;nf&quot;&gt;mixProgressively&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ings&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;                 &lt;span class=&quot;ow&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;mixParts&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;map&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ings&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Mixture&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;()&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ings&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;kr&quot;&gt;where&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;mixParts&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;    &lt;span class=&quot;kr&quot;&gt;_&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;mixed&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;[]:&lt;/span&gt;&lt;span class=&quot;kr&quot;&gt;_&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;])&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;mixed&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;mixParts&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;parts&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;mixed&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;rests&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;  &lt;span class=&quot;ow&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;mixParts&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;parts&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
                                                  &lt;span class=&quot;n&quot;&gt;stir&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;parts&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;mixed&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt;
                                                  &lt;span class=&quot;n&quot;&gt;map&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;parts&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;rests&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;

&lt;span class=&quot;nf&quot;&gt;stir&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ings&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;mixture&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;    &lt;span class=&quot;ow&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;foldr&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;incorporate&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;mixture&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ings&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Here are a few interesting properties of this code:&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;It seems to put an emphasis on the equational nature of the program.&lt;/li&gt;
	&lt;li&gt;It&amp;#8217;s laid out much more horizontally than vertically.&lt;/li&gt;
	&lt;li&gt;Types are &lt;strong&gt;strongly&lt;/strong&gt; and &lt;strong&gt;statically inferred&lt;/strong&gt;.&lt;/li&gt;
	&lt;li&gt;It uses only one programming technique: function application.&lt;/li&gt;
	&lt;li&gt;The order in which each expression is written doesn&amp;#8217;t matter.&lt;/li&gt;
&lt;/ul&gt;
&lt;h5&gt;John Smith&amp;#8217;s Objective Opinion&lt;/h5&gt;
&lt;p&gt;According to John Smith, this version of the program is the &lt;em&gt;second&lt;/em&gt; &lt;strong&gt;fastest&lt;/strong&gt; and &lt;strong&gt;easiest&lt;/strong&gt; to read and write. He adds, though, that out of the box, Haskell goes great lengths to guarantee a lot of things that are impossible to guarantee in most other languages&amp;#8217; proposed usage. Therefore, he says, Haskell is &lt;em&gt;the&lt;/em&gt; &lt;strong&gt;fastest&lt;/strong&gt; and &lt;strong&gt;easiest&lt;/strong&gt; to maintain. And for big programs, he says it&amp;#8217;s also &lt;em&gt;the&lt;/em&gt; &lt;strong&gt;fastest&lt;/strong&gt; to write.&lt;/p&gt;
&lt;h6&gt;Reactions&lt;/h6&gt;
&lt;p&gt;What, &lt;em&gt;again&lt;/em&gt;? Where&amp;#8217;s Java?&lt;/p&gt;
&lt;h3 id=&quot;imperative-language&quot;&gt;Imperative Language&lt;/h3&gt;
&lt;p&gt;Aside from the fact that &lt;strong&gt;imperative&lt;/strong&gt; languages are the tool to which we&amp;#8217;re used, how could one define this concept?&lt;/p&gt;
&lt;p&gt;One could think of an imperative language as one which expresses computations as &lt;em&gt;a sequence of manipulations, which must imperatively be followed in the order in which they are expressed, affecting the state of named memory blocks that are shared, so as to progressively build a result out of them&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;When a programmer uses the imperative style, he is mostly concerned with the interactions of his code lines with the named variables that progressively help building the result.&lt;/p&gt;
&lt;h4 id=&quot;java-dialect&quot;&gt;Some Object-Oriented Java Dialect&lt;/h4&gt;
&lt;p&gt;Ah, &lt;em&gt;home, sweet home&lt;/em&gt;. How reassuring is the smell of &lt;em&gt;home, sweet home&lt;/em&gt;, isn&amp;#8217;t it?&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;java&quot;&gt;&lt;span class=&quot;kd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Chef&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;kd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;BlueberryBuckle&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;main&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;String&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;args&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[])&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;Chef&lt;/span&gt;   &lt;span class=&quot;n&quot;&gt;chef&lt;/span&gt;       &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Chef&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;();&lt;/span&gt;

    &lt;span class=&quot;n&quot;&gt;Oven&lt;/span&gt;   &lt;span class=&quot;n&quot;&gt;oven&lt;/span&gt;       &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Oven&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;();&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;Pan&lt;/span&gt;    &lt;span class=&quot;n&quot;&gt;pan&lt;/span&gt;        &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Pan&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;8&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;8&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;Grease&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;shortening&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Crisco&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;();&lt;/span&gt;

    &lt;span class=&quot;n&quot;&gt;chef&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;prepare&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;oven&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;375&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;chef&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;prepare&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;pan&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt;  &lt;span class=&quot;n&quot;&gt;shortening&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;);&lt;/span&gt;

    &lt;span class=&quot;n&quot;&gt;Mixture&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;cream&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;chef&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;mix&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;
      &lt;span class=&quot;n&quot;&gt;chef&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;prepare&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Sugar&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(),&lt;/span&gt;        &lt;span class=&quot;n&quot;&gt;Units&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;cup&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)),&lt;/span&gt;
      &lt;span class=&quot;n&quot;&gt;chef&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;prepare&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;shortening&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt;         &lt;span class=&quot;n&quot;&gt;Units&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;cup&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)),&lt;/span&gt;
      &lt;span class=&quot;n&quot;&gt;chef&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;prepare&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Egg&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;()));&lt;/span&gt;

    &lt;span class=&quot;n&quot;&gt;Mixture&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;cake&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;chef&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;mix&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;
      &lt;span class=&quot;n&quot;&gt;chef&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;prepare&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Flour&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(),&lt;/span&gt;        &lt;span class=&quot;n&quot;&gt;Units&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;cup&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)),&lt;/span&gt;
      &lt;span class=&quot;n&quot;&gt;chef&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;prepare&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;BakingPowder&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(),&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Units&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;teaspoon&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)),&lt;/span&gt;
      &lt;span class=&quot;n&quot;&gt;chef&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;prepare&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Salt&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(),&lt;/span&gt;         &lt;span class=&quot;n&quot;&gt;Units&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;teaspoon&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)));&lt;/span&gt;

    &lt;span class=&quot;n&quot;&gt;cake&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;chef&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;mixProgressively&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;
      &lt;span class=&quot;n&quot;&gt;cake&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;n&quot;&gt;cream&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;n&quot;&gt;chef&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;prepare&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Milk&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(),&lt;/span&gt;         &lt;span class=&quot;n&quot;&gt;Units&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;cup&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)));&lt;/span&gt;

    &lt;span class=&quot;n&quot;&gt;cake&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;chef&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;stir&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;
      &lt;span class=&quot;n&quot;&gt;cake&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;n&quot;&gt;chef&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;prepare&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Blueberries&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(),&lt;/span&gt;  &lt;span class=&quot;n&quot;&gt;Units&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;cup&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)));&lt;/span&gt;

    &lt;span class=&quot;n&quot;&gt;chef&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;pour&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;cake&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;pan&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;);&lt;/span&gt;

    &lt;span class=&quot;n&quot;&gt;Mixture&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;topping&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;chef&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;mix&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;
      &lt;span class=&quot;n&quot;&gt;chef&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;prepare&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Sugar&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(),&lt;/span&gt;        &lt;span class=&quot;n&quot;&gt;Units&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;cup&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)),&lt;/span&gt;
      &lt;span class=&quot;n&quot;&gt;chef&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;prepare&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Flour&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(),&lt;/span&gt;        &lt;span class=&quot;n&quot;&gt;Units&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;cup&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)),&lt;/span&gt;
      &lt;span class=&quot;n&quot;&gt;chef&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;prepare&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Cinnamon&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(),&lt;/span&gt;     &lt;span class=&quot;n&quot;&gt;Units&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;teaspoon&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)),&lt;/span&gt;
      &lt;span class=&quot;n&quot;&gt;chef&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;prepare&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Butter&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(),&lt;/span&gt;       &lt;span class=&quot;n&quot;&gt;Units&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;cup&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)));&lt;/span&gt;

    &lt;span class=&quot;n&quot;&gt;chef&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;sprinkle&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;topping&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;pan&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;);&lt;/span&gt;

    &lt;span class=&quot;n&quot;&gt;chef&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;waitFor&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;oven&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;);&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;chef&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;bake&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;pan&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;oven&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;25&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;30&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;);&lt;/span&gt;
  &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Now, try to imagine how you would program the unimplemented methods, like chef.mixProgressively(&amp;#8230;). Try a little more. Form yourself a mental picture. Continue, it&amp;#8217;s not clear enough. Ok, now it looks like something.&lt;/p&gt;
&lt;h5&gt;John Smith&amp;#8217;s Objective Opinion&lt;/h5&gt;
&lt;p&gt;According to John Smith, this version of the program is the &lt;em&gt;third&lt;/em&gt; &lt;strong&gt;fastest&lt;/strong&gt; and &lt;strong&gt;easiest&lt;/strong&gt; to read, write, and maintain.&lt;/p&gt;
&lt;p&gt;John also mentions the unimplemented methods are much more involving to write than with our Haskell dialect.&lt;/p&gt;
&lt;p&gt;Moreover, John mentions he uses quite a few faster- and easier-to-use languages than this one, that still fit in the category of object-oriented, imperative languages.&lt;/p&gt;
&lt;h6&gt;Reactions&lt;/h6&gt;
&lt;p&gt;Isn&amp;#8217;t this surprising, again? Let&amp;#8217;s not hear him anymore on Java.&lt;/p&gt;
&lt;h4 id=&quot;c-dialect&quot;&gt;Some Procedural C Dialect&lt;/h4&gt;
&lt;p&gt;So, where&amp;#8217;s the program?&lt;/p&gt;
&lt;p&gt;Wait, we know it would look almost the same as that of Java, just much more awkward in large systems. No need to bother writing this, right?&lt;/p&gt;
&lt;p&gt;I know you can easily imagine how you would program the unimplemented functions, like mixProgressively(&amp;#8230;). We can easily see how awkward it would be to write them without them fitting in the greater scheme of the object-oriented paradigm.&lt;/p&gt;
&lt;h5&gt;John Smith&amp;#8217;s Objective Opinion&lt;/h5&gt;
&lt;p&gt;According to John Smith, this version of the program is the &lt;em&gt;second&lt;/em&gt; &lt;strong&gt;longest&lt;/strong&gt; and &lt;strong&gt;hardest&lt;/strong&gt; to read, write, and maintain.&lt;/p&gt;
&lt;h6&gt;Reactions&lt;/h6&gt;
&lt;p&gt;Rock on, John! We now understand each other. No need to spend more time with C. Let&amp;#8217;s see what&amp;#8217;s next.&lt;/p&gt;
&lt;h4 id=&quot;assembly-dialect&quot;&gt;Some Procedural Assembly Language Dialect&lt;/h4&gt;
&lt;p&gt;So, where&amp;#8217;s the program?&lt;/p&gt;
&lt;p&gt;Wait, did you really expect me to write this whole stuff in assembly language!? I mean, isn&amp;#8217;t it, by all means, completely evident how hard and long it would take me to write and debug this stuff?&lt;/p&gt;
&lt;p&gt;Try to imagine how you would program everything, including the unimplemented procedures, like mixProgressively. Wouldn&amp;#8217;t it be longer to do than with Java&amp;#8217;s &lt;code&gt;for&lt;/code&gt; comprehensions or C&amp;#8217;s &lt;code&gt;for&lt;/code&gt; statement, and all those neat features we&amp;#8217;re used to?&lt;/p&gt;
&lt;h5&gt;John Smith&amp;#8217;s Objective Opinion&lt;/h5&gt;
&lt;p&gt;Now, according to John Smith, this version of the program is &lt;em&gt;the&lt;/em&gt; &lt;strong&gt;longest&lt;/strong&gt; and &lt;strong&gt;hardest&lt;/strong&gt; to read, write, and maintain.&lt;/p&gt;
&lt;h6&gt;Reactions&lt;/h6&gt;
&lt;p&gt;Ah! Rock on, John! We truly understand each other. &lt;em&gt;Wait&lt;/em&gt;, that&amp;#8217;s right, we weren&amp;#8217;t used to think like you just some time ago&amp;#8230;&lt;/p&gt;
&lt;h3 id=&quot;chef-is-no-fool&quot;&gt;Stop taking the Chef for a fool!&lt;/h3&gt;
&lt;p&gt;If we consider that:&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;starting when we stopped looking at declarative language examples, each one of the program versions we looked at was successively closer to machine-level details, and&lt;/li&gt;
	&lt;li&gt;John&amp;#8217;s opinions were really true,&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;then we can safely derive some conclusions.&lt;/p&gt;
&lt;h4 id=&quot;our-comparison-conclusion&quot;&gt;Conclusion&lt;/h4&gt;
&lt;table&gt;
	&lt;tr&gt;
		&lt;td&gt; Each time we step &lt;strong&gt;closer&lt;/strong&gt; to the &lt;strong&gt;machine-level&lt;/strong&gt; details&amp;#8230; &lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr&gt;
		&lt;td style=&quot;text-align:right;&quot;&gt;&amp;#8230;we need to invest &lt;strong&gt;more mental effort&lt;/strong&gt; and &lt;strong&gt;more time&lt;/strong&gt; to write something. &lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr&gt;
		&lt;td&gt; &lt;br /&gt; &lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr&gt;
		&lt;td&gt; Each time we step &lt;strong&gt;farther&lt;/strong&gt; away from the &lt;strong&gt;machine-level&lt;/strong&gt; details&amp;#8230; &lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr&gt;
		&lt;td style=&quot;text-align:right;&quot;&gt;&amp;#8230;we need to invest &lt;strong&gt;less mental effort&lt;/strong&gt; and &lt;strong&gt;less time&lt;/strong&gt; to write something. &lt;/td&gt;
	&lt;/tr&gt;
&lt;/table&gt;
&lt;h5&gt;Rants&lt;/h5&gt;
&lt;p&gt;Now, my question is, &lt;em&gt;who on earth&lt;/em&gt; decided that Java was far enough from machine-level details?&lt;/p&gt;
&lt;p&gt;In other words, who, after having known the enlightenment coming from stepping away from the machine-level details, decided it would be wrong to pursue further enlightenment by continuing to step away from the machine-level details?&lt;/p&gt;
&lt;p&gt;Well, let&amp;#8217;s get back to constructive stuff.&lt;/p&gt;
&lt;h4 id=&quot;chef-dialect&quot;&gt;Some Chef Dialect&lt;/h4&gt;
&lt;p&gt;Isn&amp;#8217;t it worth to pursue such clarity and succinctness?&lt;/p&gt;
&lt;pre&gt;
Buckle (Blueberry)
&lt;/pre&gt;
&lt;p&gt;Of course, no general-purpose programming language allows that level of expressivity (that is, without writing anything to back the expression given in the example). This example is clearly an exaggeration of what the perfect programming language could be. It&amp;#8217;s meant to illustrate how Domain-Specific Languages (DSLs) can be interesting.&lt;/p&gt;
&lt;p&gt;Now, this is where we raise an interesting question. Which kind of programming language would be the most effective at writing DSLs?&lt;/p&gt;
&lt;p&gt;John says the answer is to be found somewhere in the category of declarative languages. Functional languages are the most widely used class of declarative languages.&lt;/p&gt;
&lt;h4 id=&quot;whos-the-chef&quot;&gt;Who&amp;#8217;s The Chef?&lt;/h4&gt;
&lt;p&gt;Or, in another words, who&amp;#8217;s the one taken for a fool?&lt;/p&gt;
&lt;h5&gt;It&amp;#8217;s The Compiler!&lt;/h5&gt;
&lt;p&gt;Obviously, the Chef is our programming language&amp;#8217;s compiler. Right? After all, whatever was the level of programming language we used, we always wrote the instructions that it needed to produce what we wanted to eat.&lt;/p&gt;
&lt;p&gt;Of course, the more succinctly the compiler allows us to express what we want, the better Chef it is.&lt;/p&gt;
&lt;h5&gt;The Dynamics Of Compilers&lt;/h5&gt;
&lt;p&gt;But it&amp;#8217;s us, isn&amp;#8217;t it, who programmed the behavior of the Chef, in our object-oriented version? Yes, that&amp;#8217;s right. Each one of Chef&amp;#8217;s unimplemented methods would have to be written by us. And each one of Chef&amp;#8217;s method calls, too, have been written by us. And in the non-object-oriented languages, although we didn&amp;#8217;t explicitly mention Chef, we were still writing equivalent code. So we understand that whatever the paradigm and language we use to program a computer, we always end up writing everything the compiler doesn&amp;#8217;t write for us.&lt;/p&gt;
&lt;p&gt;In other words, we write the reciprocal of what the compiler writes:&lt;/p&gt;
&lt;pre&gt;
ourCode + compilerCode = program
&lt;/pre&gt;
&lt;p&gt;From this, we can derive:&lt;/p&gt;
&lt;pre&gt;
ourCode      = program - compilerCode
compilerCode = program - ourCode
&lt;/pre&gt;
&lt;p&gt;Now, if this doesn&amp;#8217;t make perfect sense to you, there&amp;#8217;s a good reason for it. &lt;em&gt;Any&lt;/em&gt; successful high-schooler could beat my long-forgotten (poor) maths skills. Therefore, please correct me if I&amp;#8217;m wrong in any way.&lt;/p&gt;
&lt;h5&gt;Then Who&amp;#8217;s The Compiler?&lt;/h5&gt;
&lt;p&gt;So in reality, the Chef is made up of two entities. First, human-generated code. Second, compiler-generated code. In other words, the compiler is made up of a human compiler and a machine compiler. &lt;em&gt;Hey!&lt;/em&gt; don&amp;#8217;t call me a compiler, that&amp;#8217;s &lt;em&gt;gross&lt;/em&gt;!&lt;/p&gt;
&lt;h5&gt;Our Choice&lt;/h5&gt;
&lt;p&gt;Now, trust John, we don&amp;#8217;t want to be the Chef. That&amp;#8217;s why we don&amp;#8217;t use assembly language unless we really don&amp;#8217;t have any other choice. It&amp;#8217;s better to have a Chef at our service. And it&amp;#8217;s even much, much better if our Chef is intelligent enough that we don&amp;#8217;t have to go at lengths for him to understand what we truly want to eat.&lt;/p&gt;
&lt;p&gt;Therefore, if we could find a Chef that allows us to express our desires five times more succinctly and clearly than the one that comes with Java, wouldn&amp;#8217;t we be up for total enlightenment? We could either write five times faster the same programs as what we write today with Java, or take the same time that we&amp;#8217;re used to, but to get programs five times more interesting.&lt;/p&gt;
&lt;p&gt;Wow! I want to work with a better Chef. Don&amp;#8217;t you?&lt;/p&gt;
&lt;h2 id=&quot;stronger-comparisons&quot;&gt;Stronger Comparisons Of Language Levels&lt;/h2&gt;
&lt;p&gt;Now, let&amp;#8217;s put aside our own conclusions to hear other kinds of wisdom.&lt;/p&gt;
&lt;p&gt;After all, who knows if I can prove Johm Smith&amp;#8217;s existence?&lt;/p&gt;
&lt;h3 id=&quot;backus&quot;&gt;1977 &amp;#8211; John Backus&lt;/h3&gt;
&lt;p&gt;We are now reaching one of the most interesting parts of this article.&lt;/p&gt;
&lt;p&gt;Here are a few reasons why you might already know of &lt;strong&gt;John Backus&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;He created the first compiler and high-level programming language: &lt;span class=&quot;caps&quot;&gt;FORTRAN&lt;/span&gt; (1958).&lt;/li&gt;
	&lt;li&gt;He&amp;#8217;s also known for his work on other early languages, including &lt;span class=&quot;caps&quot;&gt;ALGOL&lt;/span&gt;.&lt;/li&gt;
	&lt;li&gt;In 1959, he contributed the definition of the Backus Normal Form (&lt;span class=&quot;caps&quot;&gt;BNF&lt;/span&gt;), which was later improved by Peter Naur, becoming the Backus-Naur Form.&lt;/li&gt;
	&lt;li&gt;We were reminded of his life&amp;#8217;s works when he died in 2007.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Now, why do you think I&amp;#8217;m mentioning the creator of the first high-level programming language?&lt;/p&gt;
&lt;h4 id=&quot;backus-frustrations&quot;&gt;Frustrations And Solutions&lt;/h4&gt;
&lt;p&gt;Let&amp;#8217;s hear Alex Aiken, from Stanford University:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;He grew frustrated with the limitations of imperative-style programming and felt that there must be a better, higher-level way to develop software.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I certainly can relate to this, even 30 years later.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;He eventually came to the realization that a core difficulty with &lt;span class=&quot;caps&quot;&gt;FORTRAN&lt;/span&gt;-style languages was that programmers were reduced to reasoning about a long sequence of small state changes to understand their programs, and that a much simpler and more compositional method of reasoning would be to think in terms of the net effect of a computation, where the only thing that mattered was the mapping from function inputs to function outputs.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Functional programming! Or, should I say, function-level programming. Why? Because Backus&amp;#8217; ideas go even further than what we use now.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;There were others, including Robin Milner [&lt;span class=&quot;caps&quot;&gt;SML&lt;/span&gt;] and David Turner [&lt;span class=&quot;caps&quot;&gt;SASL&lt;/span&gt;, Miranda ~&amp;gt; Haskell], who were thinking along similar lines at about the same time, but as yet there was no functional programming community.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;One might want to include Lisp in this list, but should not overlook that Lisp, being a multi-paradigm programming language, embraced very openly many imperative programming techniques.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;That all changed with Backus&amp;#8217; Turing Award lecture, published in 1978. His paper, &amp;#8220;Can Programming Be Liberated from the von Neumann&amp;#8217;s Style?&amp;#8221;, did something very unusual, perhaps unique: it attacked his own previous work, his own legacy, and furthermore proposed an alternative that was far out of the mainstream. His paper had an electric effect; I think it is fair to say that it jump-started the field of functional programming. Certainly the number of researchers in the area, and the amount of funding for that research, increased dramatically in the years just after John received the Turing Award. His Turing Award remains his most cited paper, and indeed remains the most cited of all the Turing Award lectures in the 40 year history of that prize.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;History now tells us that it&amp;#8217;s in the 10 years following Backus&amp;#8217; lecture that researchers found most major ways of optimizing compilers to narrow the performance gap between functional languages and their imperative counterparts.&lt;/p&gt;
&lt;p&gt;So, although John Backus is most remembered for his first works on &lt;span class=&quot;caps&quot;&gt;FORTRAN&lt;/span&gt;, &lt;span class=&quot;caps&quot;&gt;BNF&lt;/span&gt; and &lt;span class=&quot;caps&quot;&gt;ALGOL&lt;/span&gt;, we should not forget why he devoted the last 15 years of his career to the field of functional programming.&lt;/p&gt;
&lt;h4 id=&quot;backus-comparison&quot;&gt;On Imperative Programming Languages&lt;/h4&gt;
&lt;p&gt;Now, let&amp;#8217;s see exactly how Backus described, in his famous lecture, imperative programming languages:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Conventional programming languages are growing &lt;em&gt;ever more enormous, but not stronger&lt;/em&gt;. &lt;strong&gt;Inherent defects at the most basic level&lt;/strong&gt; cause them to be both &lt;strong&gt;fat&lt;/strong&gt; and &lt;strong&gt;weak&lt;/strong&gt;:&lt;ol&gt;&lt;li&gt;their primitive [&amp;#8230;] style of programming inherited from their common ancestor&amp;#8212;the von Neumann computer,&lt;/li&gt;&lt;li&gt;their close coupling of semantics to state transitions,&lt;/li&gt;&lt;li&gt;their division of programming into a world of expressions and a world of statements,&lt;/li&gt;&lt;li&gt;their inability to effectively use powerful combining forms for building new programs from existing ones, and&lt;/li&gt;&lt;li&gt;their lack of useful mathematical properties for reasoning about programs.&lt;/li&gt;&lt;/ol&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;em&gt;Ouch!&lt;/em&gt; One could hardly find a harder critique of his own work!&lt;/p&gt;
&lt;p&gt;If you would like to understand precisely what he means by these five arguments, you should definitely read at least the first 7 pages of his paper.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Each new language claims new and fashionable features, [&amp;#8230;] but the plain fact is that few languages make programming sufficiently cheaper or more reliable to justify the cost of producing and learning to use them. [&amp;#8230;] Since large increases in size bring only small increases in power, smaller, more elegant languages [&amp;#8230;] continue to be popular. But there is a desperate need for a powerful methodology to help us think about programs, and no conventional language even begins to meet that need. In fact, conventional languages create unnecessary confusion in the way we think about programs. [&amp;#8230;] Although I refer to conventional languages as &amp;#8220;von Neumann languages&amp;#8221; to take note of their origin and style, I do not, of course, blame the great mathematician for their complexity. In fact, some might say that I bear some responsibility for that problem.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;See? And that&amp;#8217;s not all.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Before discussing alternatives to von Neumann languages, let me remark that I regret the need for the above negative and not very precise discussion of these languages. But the complacent acceptance most of us give to these enormous, weak languages has puzzled and disturbed me for a long time. I am disturbed because that acceptance has consumed a vast effort toward making von Neumann languages fatter that might have been better spent in looking for new structures. For this reason I have tried to analyze some of the basic defects of conventional languages and show that those defects cannot be resolved unless we discover a new kind of language framework.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Reading Backus&amp;#8217; paper has been a profoundly enlightening experience for me.&lt;/p&gt;
&lt;p&gt;I definitely suggest you schedule some time to read at least the first 12 pages of his lecture. The first 7 pages will shed out more light on what&amp;#8217;s wrong with imperative languages; then, the next pages will explain how a language can be implemented on top of a very small number of sound and simple concepts that can be used and powerfully combined in all sorts of natural ways to describe computations.&lt;/p&gt;
&lt;h4 id=&quot;backus-references&quot;&gt;References&lt;/h4&gt;
&lt;h5&gt;Bibliography&lt;/h5&gt;
&lt;ul&gt;
	&lt;li&gt;&lt;a href=&quot;http://theory.stanford.edu/~aiken/other/backus.pdf&quot;&gt;Alex Aiken&amp;#8217;s Memorial&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href=&quot;http://www.stanford.edu/class/cs242/readings/backus.pdf&quot;&gt;Can Programming Be Liberated from the von Neumann Style?&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h5&gt;Further Reading&lt;/h5&gt;
&lt;ul&gt;
	&lt;li&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/John_Backus&quot;&gt;Wikipedia: John Backus&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href=&quot;http://www-03.ibm.com/ibm/history/exhibits/builders/builders_backus.html&quot;&gt;&lt;span class=&quot;caps&quot;&gt;IBM&lt;/span&gt;: Builders Exhibit&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;turner&quot;&gt;1982 &amp;#8211; David Turner&lt;/h3&gt;
&lt;p&gt;John Backus has often been caught saying of himself that he&amp;#8217;s lazy. It was one of his ways of explaining why he created high level languages. Nonetheless, the computer scientist the most remembered when it comes to laziness isn&amp;#8217;t Backus, but &lt;strong&gt;David Turner&lt;/strong&gt;, who brought us the concept of &lt;strong&gt;lazy evaluation&lt;/strong&gt;. Incidentally, we also owe him a great deal for the concept of &lt;strong&gt;purity&lt;/strong&gt; in functional programming.&lt;/p&gt;
&lt;p&gt;Both the purity and laziness concepts are central to what Turner wrote in 1981-1982 in his paper called &lt;strong&gt;Recursion Equations As A Programming Language&lt;/strong&gt;.&lt;/p&gt;
&lt;h4 id=&quot;turner-solutions&quot;&gt;Problems And Solutions&lt;/h4&gt;
&lt;blockquote&gt;
&lt;p&gt;The importance of [functional] languages lies in the fact that they hold out the promise of being able to solve both of these problems at the same time [1: software costs, 2: taking advantage of a very large degree of concurrency in the machine]. In both cases the key step is the abolition of the assignment statement, and with it the notion of sequencing.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;em&gt;Ouch!&lt;/em&gt; Abolition of the assignment statement might sound incredibly alien to your ears, but please bear with him. It makes much more sense than it might appear to the functional programming neophyte. And by &lt;em&gt;sequencing&lt;/em&gt;, David means how imperative languages oblige us to control explicitly, instead of implicitly, the order in which things are supposed to happen.&lt;/p&gt;
&lt;h4 id=&quot;turner-mathematics&quot;&gt;The Desirable Properties Of Mathematical Language&lt;/h4&gt;
&lt;blockquote&gt;
&lt;p&gt;When we compare our programming languages with all previous mathematical notation, however, the differences are very striking. Mathematical notation has evolved over many centuries and obeys certain basic rules, which are common to every area of mathematics, and which give mathematical notation its deductive power.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;First of all mathematics is static. There is no equivalent, in mathematics, of the programming language notion of a procedure which gives a different answer each time you call it. The mathematical idea of a function is a fixed table of input-output pairs. [&amp;#8230;] This is so even when mathematics is used to describe processes of change as in physics. [&amp;#8230;] Physics as a science became possible only because Newton showed us how to reduce dynamics to statics in this way.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;Secondly, and relatedly, there is in mathematics a certain kind of consistency in the use of names [&amp;#8230;] Paradoxical though it may sound, in mathematics variables do not vary; they stand for a constant value throughout their scope.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;These basic properties of mathematical notation have been termed by logicians, &amp;#8220;referential transparency&amp;#8221; [&amp;#8230;] An immediate consequence of referential transparency is that equality is substitutive &amp;#8211; equal expressions are always and everywhere interchangeable. It is this which gives mathematical notation its deductive power.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Thus, we shouldn&amp;#8217;t spit on the semantics of such a notation.&lt;/p&gt;
&lt;h4 id=&quot;turner-comparison&quot;&gt;On Imperative Programming Languages&lt;/h4&gt;
&lt;blockquote&gt;
&lt;p&gt;[&amp;#8230;] In introducing the assignment statement, which can change the value of a variable in the middle of its scope, they have broken the basic ground-rules of mathematical notation. Instead of being referentially transparent, programming languages are referentially opaque. In fact, the things that we call &amp;#8220;variables&amp;#8221; [&amp;#8230;] are not really variables [&amp;#8230;] &amp;#8211; in the last analysis they are names for registers in the store of a Von-Neumann computer.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;It is because of this that it is so difficult to reason about programs. Since expressions can change their value through time, equality is not substitutive. Indeed, [&amp;#8230;] it does not even have to be true that an expression is equal to itself (because the presence of side effects may mean that evaluating the same expression twice in succession can produce two different answers)! In general it is not possible to reason about such programs on the basis of a static analysis of the program text &amp;#8211; instead we have to think of the program dynamically and follow the detailed flow of control [&amp;#8230;].&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Thus, to one equally used to imperative and declarative languages, it takes more time to read and understand properly imperative code. And that&amp;#8217;s not all.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;A number of studies carried out in the industry have shown that a given programmer tends to produce, per year, a relatively fixed number of lines of code [&amp;#8230;] and while the number of lines varies quite a lot from programmer to programmer, it is for a given individual largely independent of the language in which he is working (for example, it doesn&amp;#8217;t seem to matter whether it is assembly code or PL/1).&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;The significance of this result is that it means that the most important single variable in determining software production costs, apart from the quality of the programmers, is the level of language at which they are working. [&amp;#8230;] programs written in &lt;span class=&quot;caps&quot;&gt;FORTRAN&lt;/span&gt; are from five to ten times shorter than the equivalent assembly code. Other things being equal, then, the &lt;span class=&quot;caps&quot;&gt;FORTRAN&lt;/span&gt; programmer is from five to ten times more productive than the assembly code programmer.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The same kind of rule applies to today&amp;#8217;s mainstream languages.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Our problem today is that in the 25 years that have elapsed since the invention of &lt;span class=&quot;caps&quot;&gt;FORTRAN&lt;/span&gt; we have failed to produce any further substantial improvement in this basic ratio of expressive power. If you compare a program written in a &amp;#8220;modern&amp;#8221; imperative language, such as &lt;span class=&quot;caps&quot;&gt;PASCAL&lt;/span&gt; or &lt;span class=&quot;caps&quot;&gt;ADA&lt;/span&gt; with its &lt;span class=&quot;caps&quot;&gt;FORTRAN&lt;/span&gt; equivalent, you will not find it very much shorter (in fact it might even be longer, because of the extra declaratory information necessitated by the current fad for very restrictive forms of strong typing).&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Since then, some things changed:&lt;/p&gt;
&lt;ol&gt;
	&lt;li&gt;First, object orientation completely replaced our simple procedural practices, with many good results. Overall, it&amp;#8217;s recognized that object orientation made our programs slightly less verbose, but more complicated.&lt;/li&gt;
	&lt;li&gt;Second, some arduous things, like memory management, have been removed from our hands, thanks to garbage collection. This change is recognized as being the one that contributed the most to improving our productivity in the last 20 years.&lt;/li&gt;
	&lt;li&gt;Third, our languages started to adopt more functional techniques, like those of higher-order programming.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Taken together, these changes enabled us to create programs in some of our modern languages which are probably five to ten times shorter than they would have been in the C++ of 10 years ago. All of this being said, let&amp;#8217;s mention that our imperative languages have continued to use this very restrictive form of strong typing that David wrote about. It&amp;#8217;s only recently that some of our languages started to improve on this basic type checking by inferring some types; but even this is a far cry from the kind of type checking that exists in the functional breed of languages.&lt;/p&gt;
&lt;p&gt;All of this being said, what needs to be emphasized is that even though our languages have evolved, they are still fundamentally oriented towards an imperative usage.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;[&amp;#8230;] We can give a general reason why the change from an imperative language to a descriptive one should lead to programs becoming so much shorter. Expressed at an appropriate level of abstraction [&amp;#8230;], an algorithm is a partially ordered set of computations &amp;#8211; the partial ordering being imposed by the data dependencies.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;In order to execute an algorithm on a Von-Neumann computer, however, we have to convert this to a total ordering (in any one of the many possible ways) and organise storage for the intermediate results. In an imperative language both of these tasks must be carried out explicitly by the programmer with the result that he has to specify a great deal of extra information.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;In summary, a good case can be made out for saying that the fundamental cause of the software crisis is the imperative and machine oriented nature of our programming languages, and that to overcome it we have to abandon the use of side effects and programmer control of sequencing in favour of purely functional notation.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Radical, but true. There&amp;#8217;s been a time when programmers felt garbage collection was an unacceptable way of managing memory. Nowadays, we wouldn&amp;#8217;t want to part with such a facility unless it was of the utmost importance to do so. The same can be said of what I will call &lt;em&gt;manual computation order management&lt;/em&gt;. It&amp;#8217;s time for us let it loose in most of our code. Smart compilers can give us another big increase in productivity, if we will let them decide how to order our computations, within the limits of our very clear functional semantics.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The theoretical possibility of programming in a purely functional style has been known about for two decades &amp;#8211; the obstacle to its use in practice has always been the difficulty of achieving acceptable efficiency in the use of existing hardware while using such techniques.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;A few years after he wrote his paper, the technology used to create optimizing compilers for functional languages started to become competitive. Since then, the gap has been closed. That is, of course, if you compare those functional and imperative languages whose compiler is designed for performance.&lt;/p&gt;
&lt;h4 id=&quot;turner-references&quot;&gt;References&lt;/h4&gt;
&lt;h5&gt;Bibliography&lt;/h5&gt;
&lt;ul&gt;
	&lt;li&gt;&lt;a href=&quot;http://books.google.com/books?id=O_M8AAAAIAAJ&amp;amp;lpg=PP1&amp;amp;pg=PA1#v=onepage&amp;amp;q=&amp;amp;f=false&quot;&gt;Recursion Equations As A Programming Language&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;hughes&quot;&gt;1984 &amp;#8211; John Hughes&lt;/h3&gt;
&lt;h4 id=&quot;hughes-references&quot;&gt;References&lt;/h4&gt;
&lt;ul&gt;
	&lt;li&gt;&lt;a href=&quot;www.address.com&quot;&gt;Why Functional Programming Matters&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;More to come in the future&amp;#8230;&lt;/h2&gt;
&lt;p&gt;More papers, more data&lt;/p&gt;
&lt;p&gt;Formality&lt;/p&gt;
&lt;p&gt;Provability&lt;/p&gt;
&lt;p&gt;Value Transparency, not Opaqueness&lt;/p&gt;
&lt;h3&gt;Fundamental Problems Of The Imperative Way&lt;/h3&gt;
&lt;h4&gt;The Assignment Statement&lt;/h4&gt;
&lt;h4&gt;Manual Computation Order Management&lt;/h4&gt;
&lt;h3&gt;The Imperative Coalition&amp;#8217;s Last Hopes&lt;/h3&gt;
&lt;h4&gt;Object Orientation&lt;/h4&gt;
&lt;h4&gt;Higher-Order Functions&lt;/h4&gt;
&lt;h4&gt;Limits&lt;/h4&gt;</content>
    </entry>
  
</feed>