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

<channel>
	<title>clojure Archives | Programming Zen</title>
	<atom:link href="https://programmingzen.com/tag/clojure/feed/" rel="self" type="application/rss+xml" />
	<link>https://programmingzen.com/tag/clojure/</link>
	<description>Meditations on programming, startups, and technology</description>
	<lastBuildDate>Fri, 29 Jul 2016 07:09:37 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>
<site xmlns="com-wordpress:feed-additions:1">1397766</site>	<item>
		<title>In Praise of Function Pre and Postconditions</title>
		<link>https://programmingzen.com/in-praise-of-function-pre-and-postconditions/</link>
					<comments>https://programmingzen.com/in-praise-of-function-pre-and-postconditions/#comments</comments>
		
		<dc:creator><![CDATA[Antonio Cangiano]]></dc:creator>
		<pubDate>Sun, 03 Jul 2016 13:00:59 +0000</pubDate>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[clojure]]></category>
		<category><![CDATA[defensive programming]]></category>
		<category><![CDATA[design by contract]]></category>
		<category><![CDATA[elixir]]></category>
		<category><![CDATA[postconditions]]></category>
		<category><![CDATA[preconditions]]></category>
		<category><![CDATA[whiley]]></category>
		<guid isPermaLink="false">http://programmingzen.com/?p=1694</guid>

					<description><![CDATA[<p>I call it my billion-dollar mistake. It was the invention of the null reference. &#x2014; Sir Tony Hoare In mathematics, functions have a domain and a codomain. These are respectively the set of inputs and the set of possible outputs. The function then simply relates an input to an output. For example, consider the square root function: A function&#x2019;s definition is only complete when its domain and codomain are defined. For such a common function we generally implicitly assume that the domain and codomain are the set of nonnegative real numbers: You could, however, change the function by simply extending </p>
<p>The post <a href="https://programmingzen.com/in-praise-of-function-pre-and-postconditions/">In Praise of Function Pre and Postconditions</a> appeared first on <a href="https://programmingzen.com">Programming Zen</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p style="text-align: right; font-style: italic; margin-bottom: 30px;">I call it my billion-dollar mistake. It was the invention of the null reference.<br />
— Sir Tony Hoare</p>
<p>In mathematics, functions have a domain and a codomain. These are respectively the set of inputs and the set of possible outputs. The function then simply relates an input to an output.</p>
<p>For example, consider the square root function:</p>
<div style="text-align: center;"><img decoding="async" src="https://s0.wp.com/latex.php?latex=f%28x%29+%3D+%5Csqrt%7Bx%7D&#038;bg=ffffff&#038;fg=000&#038;s=0&#038;c=20201002" alt="f(x) = &#92;sqrt{x}" class="latex" /></div>
<p>A function’s definition is only complete when its domain and codomain<a id="fnref:1" class="footnote" title="see footnote" href="#fn:1">[1]</a> are defined.</p>
<p>For such a common function we generally implicitly assume that the domain and codomain are the set of nonnegative real numbers:</p>
<div style="text-align: center;"><img decoding="async" src="https://s0.wp.com/latex.php?latex=f%3A+%5Cmathbb%7BR%7D%5E%7B%2B%7D+%5Crightarrow+%5Cmathbb%7BR%7D%5E%7B%2B%7D&#038;bg=ffffff&#038;fg=000&#038;s=0&#038;c=20201002" alt="f: &#92;mathbb{R}^{+} &#92;rightarrow &#92;mathbb{R}^{+}" class="latex" /></div>
<p>You could, however, change the function by simply extending the domain to all real numbers, which would require you to define the codomain as the set of complex numbers:</p>
<div style="text-align: center;"><img decoding="async" src="https://s0.wp.com/latex.php?latex=f%3A+%5Cmathbb%7BR%7D+%5Crightarrow+%5Cmathbb%7BC%7D&#038;bg=ffffff&#038;fg=000&#038;s=0&#038;c=20201002" alt="f: &#92;mathbb{R} &#92;rightarrow &#92;mathbb{C}" class="latex" /></div>
<p>This function can then relate, say, <code>-1</code> to <code>i</code>.</p>
<p>When it comes to programming, things are not much different.<a id="fnref:2" class="footnote" title="see footnote" href="#fn:2">[2]</a> In most languages, we still call them functions, and they still relate an input to an output (after some computation).<a id="fnref:3" class="footnote" title="see footnote" href="#fn:3">[3]</a></p>
<p>Much like in mathematics, the input doesn’t necessarily have to be a number and can often be a composite data type, a list of arguments, or even other functions (in the case of higher-order functions, for example).</p>
<h3>Domain and Codomain Defined via Type Signature</h3>
<p>As far as most mainstream programming languages go, the parallels essentially stop there. In fact, most languages fail to provide us with built-in features to completely define the function by specifying its domain and codomain. And I would argue that we are missing out.</p>
<p>Statically typed programming languages partially offer a way to define the domain and codomain of a function, by specifying the parameters and return value types. Take the <code>Sqrt</code> method definition in C#:</p>
<pre class="prettyprint lang:c# mark:1 decode:true" title="Type-level domain and codomain constraints (in C#)">public static double Sqrt(double x)
{
  &#47;&#47;...
}</pre>
<p>An exception will occur if the argument passed to the function is not a double (or can’t be cast into a double). The same goes for the return value.</p>
<p>This type signature provides a basic element of safety. It ensures that we are actually passing a number to the function, instead of, say, <code>null</code> by mistake. It also ensures that we are returning a value in the first place and that the function’s return value is of the double type.</p>
<p>We essentially narrowed down<a id="fnref:4" class="footnote" title="see footnote" href="#fn:4">[4]</a> our domain and codomain to:</p>
<div style="text-align: center;"><img decoding="async" src="https://s0.wp.com/latex.php?latex=f%3A+%5Cmathbb%7BR%7D+%5Crightarrow+%5Cmathbb%7BR%7D&#038;bg=ffffff&#038;fg=000&#038;s=0&#038;c=20201002" alt="f: &#92;mathbb{R} &#92;rightarrow &#92;mathbb{R}" class="latex" /></div>
<p>Amusingly, if we call <code>Math.Sqrt(-9)</code> in C#, the function will not raise an exception because both the argument and the return values fit the type declaration.</p>
<p>In fact, the function would return <code>Double.NaN</code>, which is the result of an undefined operation, but still technically a double. Other languages will handle the situation differently.<a id="fnref:5" class="footnote" title="see footnote" href="#fn:5">[5]</a></p>
<p>A significant number of software bugs are caused by programmer expectations being silently violated. Wouldn’t it be nice if we could use a feature to easily specify fine-tuned conditions on the acceptable input and output values like we do in mathematics?</p>
<p>For instance, ensuring that an error is automatically raised at runtime if the return value of the square root function isn&#8217;t a nonnegative number?</p>
<h3>Preconditions and Postconditions</h3>
<p>While developing the Eiffel programming language, Prof. Bertrand Meyer came up with the idea of <a href="https://en.wikipedia.org/wiki/Design_by_contract">Design by contract (DbC)</a>. Two key concepts of this software methodology are preconditions and postconditions, which are enforced integrity checks on specified input and output values, respectively.</p>
<p>Preconditions are slowly becoming more common. For example, Elixir has guard expressions, which allow us to limit the set of values the function will accept:</p>
<pre class="prettyprint lang:erlang mark:2,8 decode:true " title="Guards in Elixir">defmodule Math do
  def sqrt(x) when x &gt;= 0 do
    :math.sqrt(x)
  end
end

IO.puts Math.sqrt(9)    # Prints 3
IO.puts Math.sqrt(-9)   # Raises a FunctionClauseError</pre>
<p>Notice how an error is raised when we are trying to call the function with an input outside of the domain specified by the guard.</p>
<p>Guard expressions in named functions were introduced in Elixir in order to fully flesh out its powerful pattern matching capabilities.<a id="fnref:6" class="footnote" title="see footnote" href="#fn:6">[6]</a> Nevertheless, they act as preconditions that enable us to define the domain of the function.</p>
<p>To enforce checks on return values we need postconditions. For this example, I’ll use Clojure since it provides both preconditions and postconditions:</p>
<pre class="prettyprint lang:clojure mark:2,3,7,8 decode:true ">(defn limited-sqrt &#091;x&#093;
    {:pre  &#091;(pos? x)&#093;
     :post &#091;(&gt;= % 0), (&lt; % 10)&#093;}
    (Math&#47;sqrt x))

(limited-sqrt 9)   ;; 3.0
(limited-sqrt -9)  ;; AssertionError Assert failed: (pos? x)
(limited-sqrt 144) ;; AssertionError Assert failed: (&lt; % 10)
</pre>
<p>I intentionally made the example contrived by limiting the function codomain to values between 0 and 10, to demonstrate how postconditions are also caught at runtime (line 8).</p>
<h3>Extended Static Checking</h3>
<p>Some programming languages take the concept further by introducing <em>verifying compilers</em> that check the mathematical correctness and adherence to the formal specification.</p>
<p>The compiler will essentially take care of traversing all possible branches to determine whether the range of values the program could calculate meets the specification for the given function.</p>
<p>Creating such a compiler for an existing language is extremely hard. We are always contending with the <a href="https://en.wikipedia.org/wiki/Halting_problem" target="_blank">halting problem</a>. It is possible, however, to design languages specifically with that aim in mind.</p>
<p><a href="https://whiley.org/" target="_blank">Whiley</a> is one such language for the JVM.</p>
<p>Consider this example:</p>
<pre class="prettyprint lang:default mark:4,5 decode:true " title="Whiley example">import whiley.lang.System

function max(int x, int y) -&gt; (int z)
ensures x == z || y == z
ensures x &lt;= z &amp;&amp; y &lt;= z:
    if x &gt; y:
        return x
    else:
        return y

method main(System.Console console):
    console.out.println(max(4, 10))</pre>
<p>Whiley&#8217;s compiler will verify that x, y, and z meet the conditions indicated in the specification (on lines 4 and 5). Namely, that the returned value is either of the two arguments and that both of them are less than or equal to it.</p>
<p>If we create a faulty version of the algorithm as shown below, we’ll catch the error before even running the program:</p>
<pre class="prettyprint lang:default mark:6,8 decode:true ">import whiley.lang.System

&#47;&#47; Bad implementation
function max(int x, int y) -&gt; (int z)
ensures x == z || y == z
ensures x &lt;= z &amp;&amp; y &lt;= z:
    if x &gt; y:
        return y
    else:
        return x

method main(System.Console console):
    console.out.println(max(4, 10))</pre>
<p>In fact, although <code>max(4, 10)</code> does not enter the if branch, the compiler determines that there are inputs for which that return y would not satisfy the highlighted postcondition.</p>
<p>True enough if you consider <code>max(3, 2)</code> for a moment. x (3) &gt; y (2), so in this faulty implementation, we return z (2). However, x (3) is not less than or equal to z (2), so the postcondition fails.</p>
<p>Whiley is an extreme case of course, and as discussed, its verifying compiler is a virtually intractable problem for regular programming languages which were not specifically designed for it. Nevertheless, I wanted to show you how far this powerful concept can be pushed.</p>
<h3>Conclusion</h3>
<p>I would love to see pre and postconditions become built-in features of more mainstream programming languages.</p>
<p>Especially since many mainstream programming languages don’t offer referential transparency. Side effects caused by mutable data structures and having to account for state mean that we have even less predictability about return values than in purely functional programming languages.</p>
<p>As shown by Elixir, Clojure, and even Whiley, adding such specifications doesn&#8217;t require any significant syntactic overhead either.</p>
<p>With dynamically typed programming languages we stress the importance of having tests because we don’t have a compiler to catch as many of our mistakes. (Though testing is key either way.)</p>
<p>Pre and postconditions add a complementary layer of safety, regardless of the language&#8217;s typing system. By using both Design by Contract principles and testing, we can build more robust software. (Definitely check out other features of DbC as well, including class invariants. There are lots of good ideas in there.)</p>
<p>If you’d like to get started, you can probably find a library for your favorite language. If not, creating your own should be fairly easy.</p>
<p>However, I’d advocate for such conditions/assertions to be a core part of most languages. And that’s because of the difference in the adoption rate of opt-in vs opt-out features.</p>
<p>With pre and postconditions built into the language, documented in the intro tutorial that everyone reads, you’ll cultivate a community with a penchant for defensive programming, who will actually make use of the feature.</p>
<p>&nbsp;</p>
<div class="footnotes">
<hr />
<ol>
<li id="fn:1">Some readers might be more familiar with the word <em>range</em> or <em>image</em>. In our examples, range and codomain coincide, even though in general, the range is a subset of the codomain. <a class="reversefootnote" title="return to article" href="#fnref:1">^</a></li>
<li id="fn:2">When a function has an algorithmic bug and we get the wrong output, we are still defining a function. Just not the intended one. <a class="reversefootnote" title="return to article" href="#fnref:2">^</a></li>
<li id="fn:3">I’ll use the word function even when the proper nomenclature of the specific language might call for another word, such as <em>method</em>. <a class="reversefootnote" title="return to article" href="#fnref:3">^</a></li>
<li id="fn:4">Obviously, doubles are represented in memory as double precision floating-point numbers, and therefore not actual real numbers. So they are technically a subset of the rational numbers <img decoding="async" src="https://s0.wp.com/latex.php?latex=%5Cmathbb%7BQ%7D&#038;bg=ffffff&#038;fg=000&#038;s=0&#038;c=20201002" alt="&#92;mathbb{Q}" class="latex" />. <a class="reversefootnote" title="return to article" href="#fnref:4">^</a></li>
<li id="fn:5">Both Ruby and Julia, for example, will raise a <code>DomainError</code> in such a scenario. <a class="reversefootnote" title="return to article" href="#fnref:5">^</a></li>
<li id="fn:6">Here we could have a second declaration with <code>when x &lt; 0</code> to match function calls with negative arguments, perhaps leveraging that function implementation to provide a more informative error message. <a class="reversefootnote" title="return to article" href="#fnref:6">^</a></li>
</ol>
</div>
<p>The post <a href="https://programmingzen.com/in-praise-of-function-pre-and-postconditions/">In Praise of Function Pre and Postconditions</a> appeared first on <a href="https://programmingzen.com">Programming Zen</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://programmingzen.com/in-praise-of-function-pre-and-postconditions/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1694</post-id>	</item>
		<item>
		<title>A Language for the Next 10 Years</title>
		<link>https://programmingzen.com/next-programming-language/</link>
					<comments>https://programmingzen.com/next-programming-language/#comments</comments>
		
		<dc:creator><![CDATA[Antonio Cangiano]]></dc:creator>
		<pubDate>Tue, 14 Jun 2016 16:30:22 +0000</pubDate>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[beam]]></category>
		<category><![CDATA[clojure]]></category>
		<category><![CDATA[elixir]]></category>
		<category><![CDATA[erlang]]></category>
		<category><![CDATA[jvm]]></category>
		<category><![CDATA[language for the next decade]]></category>
		<category><![CDATA[programming languages]]></category>
		<category><![CDATA[trends]]></category>
		<guid isPermaLink="false">http://programmingzen.com/?p=1679</guid>

					<description><![CDATA[<p>In early 2006 I had just started my career in IBM. I was the &#x201C;Ruby Guy&#x201D; (or alternatively, the &#x201C;Rails Guy&#x201D;). During a meeting with a few high-profile engineers, I presented what Ruby brought to the table. An IBM Distinguished Engineer stopped me in my tracks and said, &#x201C;It sounds slow&#x201D;. I love Ruby as much as a programmer can possibly love a programming language, but that engineer&#x2019;s conjecture was right on the money. Ruby&#x2019;s emphasis has always been on programmer efficiency, not execution efficiency. Generally speaking, Ruby programs are significantly slower than equivalent programs in C or Java. A </p>
<p>The post <a href="https://programmingzen.com/next-programming-language/">A Language for the Next 10 Years</a> appeared first on <a href="https://programmingzen.com">Programming Zen</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>In early 2006 I had just started my career in IBM. I was the “Ruby Guy”<a id="fnref:1" class="footnote" title="see footnote" href="#fn:1">[1]</a> (or alternatively, the “Rails Guy”).</p>
<p>During a meeting with a few high-profile engineers, I presented what Ruby brought to the table. An IBM Distinguished Engineer<a id="fnref:2" class="footnote" title="see footnote" href="#fn:2">[2]</a> stopped me in my tracks and said, “It sounds slow”.</p>
<p>I love Ruby as much as a programmer can possibly love a programming language, but that engineer’s conjecture was right on the money. Ruby’s emphasis has always been on programmer efficiency, not execution efficiency.</p>
<p>Generally speaking, Ruby programs are significantly slower than equivalent programs in C or Java.</p>
<p>A lot of work has been done to improve Ruby’s performance, with a good degree of success, and that’s terrific &#8211; but is it enough in today’s world?</p>
<p>In many ways, yes. You’re not going to employ Ruby to calculate 13 trillion digits of Pi, nor will you use it to power the backend of a messaging app with millions of users.</p>
<p>However, Ruby will suit most scripts just fine. Further, I would argue that Rails still gives you the best bang for your buck in terms of web frameworks, when it comes to a large subset of CRUD-based web applications.</p>
<p>Ruby is lovely and has many uses, however, what Ruby is not, is the language that will define the next ten years. As beautifully designed as it is, it simply isn’t the ideal language to tackle the challenges that an increasingly distributed world throws at us.</p>
<p>Concurrency is the name of the game, and Ruby is, for the most part, limited in its ability to cope with it (despite <a href="https://github.com/ruby-concurrency/concurrent-ruby">valuable efforts</a>). It’s not that you can’t do concurrency in Ruby, it’s that there are much better, battle-tested tools to do so.</p>
<p>If you are a fellow Ruby developer who would like to remain relevant in the next decade, I highly suggest that you start looking for something new to pair to Ruby as your main language. (Though, fair warning, you might end up replacing Ruby with it.)</p>
<p>Your main language for the next ten years will be highly dependent on the development context, of course. If you develop iOS apps, Swift is such a language. Android apps? <a href="https://kotlinlang.org/">Kotlin</a> is looking good and might have a shot at that. Data Science? <a href="https://julialang.org/">Julia</a>, if they can sort out a few performance issues, could get the edge over Python and R. System programming? <a href="https://www.rust-lang.org/">Rust</a> and Go will be worth a close look, too.<a id="fnref:3" class="footnote" title="see footnote" href="#fn:3">[3]</a></p>
<p>I’m enough of a generalist to dabble in many programming domains, but above all, I’m a web developer, so my main language for the next decade will have to excel in distributed environments where n machines make m requests, for large values of n and m (e.g., IoT alone enables this scenario).</p>
<p>So what comes after Ruby? Some people might argue that it’s Node.js. Not for me personally, though. I’m afraid Ruby has spoiled me. I find Ruby to be a joy to use. JavaScript, not so much.</p>
<p>We are looking for a high-level language that can handle concurrency like a champ, has an elegant, highly readable syntax, provides a great user experience for the developer, and… is functional. In short, fun and functional. 🙂</p>
<p>I find functional programming (with immutable data types) to be a significantly better approach to thinking about most problems, and modeling solutions for them, than Object Oriented programming.<a id="fnref:4" class="footnote" title="see footnote" href="#fn:4">[4]</a> I blame my past dabbling with Haskell and Clojure for this.</p>
<p>Speaking of Clojure, on the JVM, both Scala (w/ Akka), and Clojure (w/ STM &amp; Pulsar) are valid options.</p>
<p>Of the two, Clojure is the one that comes closer to a great fit for me. Very close. Unfortunately, I&#8217;m somewhat of an aesthete, and coming from Ruby, the Lisp syntax still feels like a downgrade.<a id="fnref:5" class="footnote" title="see footnote" href="#fn:5">[5]</a></p>
<p>Further, the JVM is great, but when it comes to dependable concurrency, you really can’t beat what the Erlang VM (i.e., BEAM) has to offer (<a href="https://www.fastcompany.com/3026758/inside-erlang-the-rare-programming-language-behind-whatsapps-success">ask the team at Whatsapp</a>).</p>
<p>The problem with Erlang is that its Prolog-like syntax feels obsolete. I have never seen an Erlang program and said to myself, “Wow, that was a joy to read”. Or refactor. It’s not the worst, but I personally find it to be a fairly uninspiring language to work with.</p>
<p><img data-recalc-dims="1" fetchpriority="high" decoding="async" style="display: block; margin-left: auto; margin-right: auto;" title="Expression terminators in Erland.jpg" src="https://i0.wp.com/programmingzen.com/wp-content/uploads/2016/06/Expression-terminators-in-Erland.jpg?resize=500%2C272&#038;ssl=1" alt="Expression terminators in Erlang" width="500" height="272" border="0" /></p>
<p>Thankfully Erlang is not the only language for its highly fault-tolerant and concurrent VM. There is indeed a language worth getting excited about.</p>
<p>For me, that language is Elixir. Elixir fits all the requirements above and feels like a joy to both read and use.</p>
<p><img data-recalc-dims="1" decoding="async" style="float: right;" title="Elixir.gif" src="https://i0.wp.com/programmingzen.com/wp-content/uploads/2016/06/Elixir.gif?resize=100%2C191&#038;ssl=1" alt="Elixir" width="100" height="191" border="0" /></p>
<p>Like many other Rubyists, when I first found Elixir I thought of it as Ruby for the Erlang VM, due to its largely familiar syntax. But it turns out to be so much more than that. In fact, it’s much more than Erlang as well.</p>
<p>To hastily summarize, we get:</p>
<ul>
<li>A highly readable, elegant, concurrent, functional programming language.</li>
<li>The fantastic Erlang VM (i.e., BEAM) and OTP integration.</li>
<li>Shared nothing Actor-based concurrency.</li>
<li>Metaprogramming via macros.</li>
<li>Polymorphism via protocols.</li>
<li>A whole host of other nice features (pipeline operator, pattern matching, docstrings, streams, mix, etc).</li>
<li>An excellent web framework called <a href="https://www.phoenixframework.org/">Phoenix</a>.</li>
<li>A fast growing supportive community, that it’s reminiscent of Ruby during the early days of Rails.</li>
</ul>
<p>Ruby’s usage skyrocketed in the past decade and I would argue that Elixir, though not widely adopted as of yet, is well equipped to do the same in the coming ten years.</p>
<p><a href="https://elixir-lang.org/">Give it a try</a> and let me know how you like it.</p>
<div class="footnotes">
<hr />
<ol>
<li id="fn:1">Though <a href="https://en.wikipedia.org/wiki/Sam_Ruby">Sam</a> was both literally and figuratively a Ruby guy. 😉  <a class="reversefootnote" title="return to article" href="#fnref:1">^</a></li>
<li id="fn:2">Now an IBM Fellow, which is the highest honor a tech person at IBM can achieve. It’s worth noting that I had not mentioned performance at all until that point. He simply figured it out based on the features of the language.  <a class="reversefootnote" title="return to article" href="#fnref:2">^</a></li>
<li id="fn:3">Some might like <a href="https://nim-lang.org/">Nim</a>, instead. <a href="https://crystal-lang.org/">Crystal</a>, with its Ruby-like syntax, is probably the most interesting option for Rubyists, despite being at very early stages of development.  <a class="reversefootnote" title="return to article" href="#fnref:3">^</a></li>
<li id="fn:4">I suspect that the next decade, outside of system programming, will belong to functional languages (or hybrid languages heavily influenced by functional programming).  <a class="reversefootnote" title="return to article" href="#fnref:4">^</a></li>
<li id="fn:5">I know, I know, I’m putting a lot of emphasis on syntax. That’s because it matters more than most people give it credit for.  <a class="reversefootnote" title="return to article" href="#fnref:5">^</a></li>
</ol>
</div>
<p>The post <a href="https://programmingzen.com/next-programming-language/">A Language for the Next 10 Years</a> appeared first on <a href="https://programmingzen.com">Programming Zen</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://programmingzen.com/next-programming-language/feed/</wfw:commentRss>
			<slash:comments>16</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1679</post-id>	</item>
	</channel>
</rss>
