<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>Latest articles on xrefactor.com</title>
  <id>https://xrefactor.com/</id>
  <link href="https://xrefactor.com/" />
  <link href="https://xrefactor.com/atom.xml" rel="self" type="application/atom+xml" />
  <author>
    <name>Philip Xu</name>
    <email>pyx@xrefactor.com</email>
  </author>
  <updated>2016-12-31T04:43:20Z</updated>
  <generator uri="https://xrefactor.com/projects/ena/">Ena Batch Document Processor</generator>
  <entry>
    <title type="html">Linux Desktop Screenshots 2016</title>
    <id>https://xrefactor.com/blog/linux-desktop-screenshots-2016.html</id>
    <link href="https://xrefactor.com/blog/linux-desktop-screenshots-2016.html" />
    <published>2016-12-31T04:20:07Z</published>
    <updated>2016-12-31T04:20:07Z</updated>
    <content type="html">
      &lt;div class=&#34;section&#34; id=&#34;linux-desktop-screenshots-2016&#34;&gt;
&lt;h1&gt;Linux Desktop Screenshots 2016&lt;/h1&gt;
&lt;p&gt;In keeping with tradition, here is what I used in 2016:&lt;/p&gt;
&lt;div class=&#34;figure&#34;&gt;
&lt;img alt=&#34;i3&#34; src=&#34;../static/img/blog/ss2016/i3.png&#34; /&gt;
&lt;p class=&#34;caption&#34;&gt;Four years in a row, &lt;a class=&#34;reference external&#34; href=&#34;http://i3wm.org/&#34;&gt;i3&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;2016 was the year of computing.  Leading the charge, &lt;a class=&#34;reference external&#34; href=&#34;https://en.wikipedia.org/wiki/AlphaGo&#34;&gt;AlphaGo&lt;/a&gt; and
&lt;a class=&#34;reference external&#34; href=&#34;https://www.tensorflow.org/&#34;&gt;TensorFlow&lt;/a&gt; are just the tip of the iceberg, with other breakthroughs in the
field of machine learning, 2016 was the year to be remembered.&lt;/p&gt;
&lt;/div&gt;

    </content>
  </entry>
  <entry>
    <title type="html">How to Use Mercurial as Git Front-end</title>
    <id>https://xrefactor.com/blog/how-to-use-mercurial-as-git-front-end.html</id>
    <link href="https://xrefactor.com/blog/how-to-use-mercurial-as-git-front-end.html" />
    <published>2016-01-02T17:10:02Z</published>
    <updated>2016-01-02T17:10:02Z</updated>
    <content type="html">
      &lt;div class=&#34;section&#34; id=&#34;how-to-use-mercurial-as-git-front-end&#34;&gt;
&lt;h1&gt;How to Use Mercurial as Git Front-end&lt;/h1&gt;
&lt;p&gt;In this document, I am going to show you how to use &lt;a class=&#34;reference external&#34; href=&#34;https://www.mercurial-scm.org/&#34;&gt;mercurial&lt;/a&gt; as a &lt;a class=&#34;reference external&#34; href=&#34;https://git-scm.com/&#34;&gt;git&lt;/a&gt;
front-end.  This is about a &lt;strong&gt;mercurial&lt;/strong&gt; extension called &lt;a class=&#34;reference external&#34; href=&#34;http://hg-git.github.io/&#34;&gt;Hg-Git&lt;/a&gt;, if you
are already using it, or not going to use &lt;strong&gt;mercurial&lt;/strong&gt; to push and pull from a
&lt;strong&gt;git&lt;/strong&gt; server, then this guide is not for you.&lt;/p&gt;
&lt;div class=&#34;admonition note&#34;&gt;
&lt;p class=&#34;first admonition-title&#34;&gt;Note&lt;/p&gt;
&lt;p class=&#34;last&#34;&gt;If you want to learn how to use &lt;strong&gt;mercurial&lt;/strong&gt;, please check out the new
&lt;a class=&#34;reference external&#34; href=&#34;http://hgbook.org/&#34;&gt;mercurial book&lt;/a&gt;, it is free online.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&#34;section&#34; id=&#34;why-mercurial&#34;&gt;
&lt;h2&gt;Why Mercurial?&lt;/h2&gt;
&lt;p&gt;I hear you, why &lt;strong&gt;mercurial&lt;/strong&gt;?  Why, when seemingly open source projects are
migrating to &lt;strong&gt;git&lt;/strong&gt; &lt;em&gt;en masse&lt;/em&gt;?  Why, when &lt;strong&gt;git&lt;/strong&gt; and to some extent
&lt;a class=&#34;reference external&#34; href=&#34;https://github.com/&#34;&gt;Github&lt;/a&gt; had become the &lt;em&gt;de facto&lt;/em&gt; tool-chain for OOS development?  Why, when
&lt;strong&gt;python&lt;/strong&gt; itself is &lt;a class=&#34;reference external&#34; href=&#34;https://mail.python.org/pipermail/core-workflow/2016-January/000345.html&#34;&gt;moving away from mercurial&lt;/a&gt; (actually, this document is
a response to this decision)?  Isn&#39;t it the DVCS flame war long gone and
&lt;strong&gt;git&lt;/strong&gt; is the declared winner?  Isn&#39;t it &lt;strong&gt;mercurial&lt;/strong&gt; no longer relevant,
like &lt;a class=&#34;reference external&#34; href=&#34;http://bazaar.canonical.com/&#34;&gt;bzr&lt;/a&gt; became long ago.  This is 2016, not 2006 when both &lt;strong&gt;git&lt;/strong&gt; and
&lt;strong&gt;mercurial&lt;/strong&gt; are barely one-year-old.&lt;/p&gt;
&lt;p&gt;To begin answering these questions, I need to state my observation first, that
the &lt;strong&gt;git&lt;/strong&gt; dominance is not because of &lt;strong&gt;mercurial&lt;/strong&gt; is a less capable
contender, it is mostly because of celebrity endorsement (&lt;strong&gt;git&lt;/strong&gt; was written
by &lt;a class=&#34;reference external&#34; href=&#34;https://en.wikipedia.org/wiki/Linus_Torvalds&#34;&gt;Linus Torvalds&lt;/a&gt; and used in &lt;a class=&#34;reference external&#34; href=&#34;https://www.kernel.org/&#34;&gt;Linux Kernel&lt;/a&gt;) and &lt;a class=&#34;reference external&#34; href=&#34;https://github.com/&#34;&gt;Github&lt;/a&gt;&#39;s dominance and
social lock down.&lt;/p&gt;
&lt;p&gt;Feature-wise, there is no clear winner between &lt;strong&gt;git&lt;/strong&gt; and &lt;strong&gt;mercurial&lt;/strong&gt;
technically, in some scenarios &lt;strong&gt;git&lt;/strong&gt; works better while in some cases
&lt;strong&gt;mercurial&lt;/strong&gt; works better.  So, there is no evidence that &lt;strong&gt;mercurial&lt;/strong&gt; is
superior than &lt;strong&gt;git&lt;/strong&gt;, why &lt;strong&gt;mercurial&lt;/strong&gt;?&lt;/p&gt;
&lt;p&gt;I am not going to get into details about these in this document, just pointing
out that &lt;strong&gt;mercurial&lt;/strong&gt; has some unique features that one may find useful and
cannot be found in other alternatives, such as:&lt;/p&gt;
&lt;ol class=&#34;arabic simple&#34;&gt;
&lt;li&gt;Specifically designed query languages &lt;em&gt;revset&lt;/em&gt; and &lt;em&gt;fileset&lt;/em&gt; for searching
in history&lt;/li&gt;
&lt;li&gt;Built-in web server for quick one-off pulling/pushing/reviewing session&lt;/li&gt;
&lt;li&gt;Extension for large files&lt;/li&gt;
&lt;li&gt;Extension Mercurial Queues (mq), like multi-level index (in &lt;strong&gt;git&lt;/strong&gt;&#39;s
parlance), the mq patches can also be put under revision control&lt;/li&gt;
&lt;li&gt;Phase, a feature that provide fine-grained control about changesets&#39;
publicity, no more accidental push of secret, private changes&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Mercurial&lt;/strong&gt; are easy to customize, read &lt;a class=&#34;reference external&#34; href=&#34;https://code.facebook.com/posts/218678814984400/scaling-mercurial-at-facebook/&#34;&gt;scaling mercurial&lt;/a&gt; for a real
world example&lt;/li&gt;
&lt;li&gt;Some interesting ideas, like &lt;a class=&#34;reference external&#34; href=&#34;https://www.mercurial-scm.org/wiki/ChangesetEvolution&#34;&gt;Changeset Evolution&lt;/a&gt; for safe sharing of
history rewrites, most are experimental right now, though&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Nothing is perfect, &lt;strong&gt;mercurial&lt;/strong&gt; is no exception, besides the smaller market
share, there is currently no plan to port the code base from python 2 to python
3 due to technical restriction.  That being said, with those unique features
and intuitive user interface, &lt;strong&gt;mercurial&lt;/strong&gt; is a viable option even today.&lt;/p&gt;
&lt;p&gt;I am a strong believer in &lt;em&gt;&amp;quot;biodiversity and competition are good for a
ecosystem&amp;quot;&lt;/em&gt;, this is another reason that I keep using &lt;strong&gt;mercurial&lt;/strong&gt; and
promoting &lt;strong&gt;mercurial&lt;/strong&gt; whenever possible, and the reason behind writing this
document.&lt;/p&gt;
&lt;p&gt;Okay, enough talk, so how do we use &lt;strong&gt;mercurial&lt;/strong&gt; as a &lt;strong&gt;git&lt;/strong&gt; client?  You
need an extension called &lt;a class=&#34;reference external&#34; href=&#34;http://hg-git.github.io/&#34;&gt;Hg-Git&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&#34;section&#34; id=&#34;installing-hg-git&#34;&gt;
&lt;h2&gt;Installing Hg-Git&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Hg-Git&lt;/strong&gt; can be installed as normal &lt;strong&gt;mercurial&lt;/strong&gt; extension, please follow
the instructions on the &lt;a class=&#34;reference external&#34; href=&#34;http://hg-git.github.io/&#34;&gt;Hg-Git&lt;/a&gt; official site.  &lt;strong&gt;Hg-Git&lt;/strong&gt; might as well be
able to be installed from your linux distribution&#39;s software repository
directly.&lt;/p&gt;
&lt;p&gt;Please make sure both extensions &lt;code&gt;bookmarks&lt;/code&gt; and &lt;code&gt;hggit&lt;/code&gt; are
enabled afterward.&lt;/p&gt;
&lt;p&gt;For example, with these lines in &lt;code&gt;~/.hgrc&lt;/code&gt;:&lt;/p&gt;
&lt;pre class=&#34;code literal-block&#34;&gt;
[extensions]
hgext.bookmarks =
hggit =
&lt;/pre&gt;
&lt;/div&gt;
&lt;div class=&#34;section&#34; id=&#34;talking-to-git-server&#34;&gt;
&lt;h2&gt;Talking to Git Server&lt;/h2&gt;
&lt;p&gt;When properly setup, you can use &lt;code&gt;hg clone&lt;/code&gt;, &lt;code&gt;hg push&lt;/code&gt; and
&lt;code&gt;hg pull&lt;/code&gt; against a &lt;strong&gt;git&lt;/strong&gt; server as if it is serving &lt;strong&gt;mercurial&lt;/strong&gt;
repositories.  Just remember the difference in uri schema, for example, to
clone from one of my projects on github, using &lt;strong&gt;git&lt;/strong&gt;:&lt;/p&gt;
&lt;pre class=&#34;code sh literal-block&#34;&gt;
git clone git&amp;#64;github.com:pyx/hymn.git
&lt;/pre&gt;
&lt;p&gt;while using &lt;strong&gt;mercurial&lt;/strong&gt;, the command will be:&lt;/p&gt;
&lt;pre class=&#34;code sh literal-block&#34;&gt;
hg clone git+ssh://git&amp;#64;github.com/pyx/hymn.git
&lt;/pre&gt;
&lt;p&gt;Notice the difference in schema part &lt;code&gt;git+ssh://&lt;/code&gt; and the separator
&lt;code&gt;:&lt;/code&gt; between host and user directory became a &lt;code&gt;/&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;You can simply &lt;code&gt;hg push&lt;/code&gt; and &lt;code&gt;hg pull&lt;/code&gt; from then on.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&#34;section&#34; id=&#34;caveat&#34;&gt;
&lt;h2&gt;Caveat&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Hg-Git&lt;/strong&gt; keeps track of the changesets under the bookmark &lt;code&gt;master&lt;/code&gt;, so
any destructive changes, e.g &lt;code&gt;hg strip&lt;/code&gt; or &lt;code&gt;hg histedit&lt;/code&gt; involving
&lt;code&gt;master&lt;/code&gt; will be recorded and visible in &lt;strong&gt;git&lt;/strong&gt;&#39;s history.  To avoid
this, deactivate bookmark &lt;code&gt;master&lt;/code&gt; before applying any destructive
changes.&lt;/p&gt;
&lt;p&gt;For the same reason, only history up to the point of &lt;code&gt;master&lt;/code&gt; will be
pushed, and I suggest to first deactivate bookmark &lt;code&gt;master&lt;/code&gt; while working
on development branches, you are supposed to checkout a &lt;code&gt;dev&lt;/code&gt; branch
anyway, right?&lt;/p&gt;
&lt;p&gt;It is so important that I have to mention again that, if you rewrite history
involving bookmark &lt;code&gt;master&lt;/code&gt;, &lt;strong&gt;Hg-Git&lt;/strong&gt; will record the changes while
&lt;strong&gt;mercurial&lt;/strong&gt; will not, so things will get really messy if you forget about
that.  Please work on development branches with bookmark &lt;code&gt;master&lt;/code&gt;
deactivated, when you finish all the history rewriting and rebasing and the
changes are ready to be published, then and only then can you checkout
&lt;code&gt;master&lt;/code&gt; and push the changes to a &lt;strong&gt;git&lt;/strong&gt; server.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Mercurial&lt;/strong&gt; use explicit files to track some metadata, such as
&lt;code&gt;.hgtags&lt;/code&gt; for tags, it is of no use to &lt;strong&gt;git&lt;/strong&gt;, but it is there, and the
sha-1 hash for the same changeset is different in &lt;strong&gt;mercurial&lt;/strong&gt; and &lt;strong&gt;git&lt;/strong&gt;
because they have different strategies in calculating them, so keep that in mind.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&#34;section&#34; id=&#34;conclusion&#34;&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;With &lt;strong&gt;Hg-Git&lt;/strong&gt;, one can use &lt;strong&gt;mercurial&lt;/strong&gt; as a client for a &lt;strong&gt;git&lt;/strong&gt; server,
and publishes &lt;strong&gt;mercurial&lt;/strong&gt; repositories as &lt;strong&gt;git&lt;/strong&gt; repositories at the same
time, without much work, this is how I managed to publish my open source
projects to both &lt;a class=&#34;reference external&#34; href=&#34;https://bitbucket.org&#34;&gt;Bitbucket&lt;/a&gt; (as &lt;strong&gt;mercurial&lt;/strong&gt; repositories) and &lt;a class=&#34;reference external&#34; href=&#34;https://github.com/&#34;&gt;Github&lt;/a&gt;.
To people who prefer &lt;strong&gt;mercurial&lt;/strong&gt; like me, but are forced to use &lt;strong&gt;git&lt;/strong&gt;, it
is the best of both worlds.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;

    </content>
  </entry>
  <entry>
    <title type="html">Linux Desktop Screenshots 2015</title>
    <id>https://xrefactor.com/blog/linux-desktop-screenshots-2015.html</id>
    <link href="https://xrefactor.com/blog/linux-desktop-screenshots-2015.html" />
    <published>2015-12-31T21:17:27Z</published>
    <updated>2015-12-31T21:17:27Z</updated>
    <content type="html">
      &lt;div class=&#34;section&#34; id=&#34;linux-desktop-screenshots-2015&#34;&gt;
&lt;h1&gt;Linux Desktop Screenshots 2015&lt;/h1&gt;
&lt;p&gt;What I used in 2015:&lt;/p&gt;
&lt;div class=&#34;figure&#34;&gt;
&lt;img alt=&#34;i3&#34; src=&#34;../static/img/blog/ss2015/i3.png&#34; /&gt;
&lt;p class=&#34;caption&#34;&gt;Boring as always, that&#39;s the norm with tiling wm, still &lt;a class=&#34;reference external&#34; href=&#34;http://i3wm.org/&#34;&gt;i3&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Since &lt;a class=&#34;reference external&#34; href=&#34;https://perl6.org/&#34;&gt;perl 6&lt;/a&gt; was released few days ago, I guess 2015 was the year of linux
desktop, too. :)&lt;/p&gt;
&lt;/div&gt;

    </content>
  </entry>
  <entry>
    <title type="html">R.I.P Ian Murdock</title>
    <id>https://xrefactor.com/blog/rip-ian-murdock.html</id>
    <link href="https://xrefactor.com/blog/rip-ian-murdock.html" />
    <published>2015-12-30T23:19:05Z</published>
    <updated>2015-12-30T23:19:05Z</updated>
    <content type="html">
      &lt;div class=&#34;section&#34; id=&#34;r-i-p-ian-murdock&#34;&gt;
&lt;h1&gt;R.I.P Ian Murdock&lt;/h1&gt;
&lt;p&gt;It was a shock to hear the news of the passing of &lt;a class=&#34;reference external&#34; href=&#34;https://en.wikipedia.org/wiki/Ian_Murdock&#34;&gt;Ian Murdock&lt;/a&gt; (1973-2015),
the creator of &lt;a class=&#34;reference external&#34; href=&#34;https://www.debian.org/&#34;&gt;Debian&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;As the father of Debian, the second oldest GNU/Linux distribution that is still
in widely used and in existence (the oldest being Slackware), Ian Murdock was a
true pioneer, his great contribution to the Open Source Movement and in
building a healthy open source community benefits us all and helped make the
world a better place.&lt;/p&gt;
&lt;p&gt;Debian is the first ever open source operating system I used, and am still
using day-to-day, for over a decade.  It is also the go-to distro for new
installations whenever I do not need the flexibility of compiling from source.
Like many others, I&#39;ve learned a lot from the project, the community, and the
people therein.&lt;/p&gt;
&lt;p&gt;It is a tragic loss for his family and for our open source community, he will
be terribly missed, may his soul rest in peace.&lt;/p&gt;
&lt;p&gt;My sincere condolences.&lt;/p&gt;
&lt;/div&gt;

    </content>
  </entry>
  <entry>
    <title type="html">The Frist Public Release of Hymn</title>
    <id>https://xrefactor.com/blog/the-first-public-release-of-hymn.html</id>
    <link href="https://xrefactor.com/blog/the-first-public-release-of-hymn.html" />
    <published>2015-12-09T20:45:21Z</published>
    <updated>2015-12-09T20:45:21Z</updated>
    <content type="html">
      &lt;div class=&#34;section&#34; id=&#34;the-frist-public-release-of-hymn&#34;&gt;
&lt;h1&gt;The Frist Public Release of Hymn&lt;/h1&gt;
&lt;p&gt;I am happy to announce the first public release of &lt;a class=&#34;reference external&#34; href=&#34;https://xrefactor.com/projects/hymn&#34;&gt;hymn&lt;/a&gt;, a new &lt;a class=&#34;reference external&#34; href=&#34;https://en.wikipedia.org/wiki/Monad_%28functional_programming%29&#34;&gt;monad&lt;/a&gt;
library for &lt;a class=&#34;reference external&#34; href=&#34;http://hylang.org/&#34;&gt;Hy&lt;/a&gt; and &lt;a class=&#34;reference external&#34; href=&#34;https://www.python.org/&#34;&gt;Python&lt;/a&gt;.  In addition to implementing many common monad
types, with the help of lisp macro, it is possible to write monadic code in do
notation, like so (example in Reader Monad):&lt;/p&gt;
&lt;pre class=&#34;code clojure literal-block&#34;&gt;
&lt;span class=&#34;nv&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;require&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;hymn.dsl&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;span class=&#34;nv&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;import &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;hymn.types.reader&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;lookup&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]])&lt;/span&gt;
&lt;span class=&#34;nv&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&#34;c1&#34;&gt;;; do notation with reader monad, lookup assumes the environment is subscriptable&lt;/span&gt;
&lt;span class=&#34;nv&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;def &lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;r&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;do-monad&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;a&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;lookup&lt;/span&gt; &lt;span class=&#34;ss&#34;&gt;&#39;a&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;b&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;lookup&lt;/span&gt; &lt;span class=&#34;ss&#34;&gt;&#39;b&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)]&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;+ &lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;a&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;b&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)))&lt;/span&gt;
&lt;span class=&#34;nv&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&#34;c1&#34;&gt;;; run reader monad r with environment&lt;/span&gt;
&lt;span class=&#34;nv&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;.run&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;r&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;ss&#34;&gt;&#39;a&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt; &lt;span class=&#34;ss&#34;&gt;&#39;b&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;})&lt;/span&gt;
&lt;span class=&#34;mi&#34;&gt;3&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;I also wrote some interesting examples with it, just check out the
&lt;code&gt;examples&lt;/code&gt; directory, to get a taste of it, here is the example that
using writer monad for logging:&lt;/p&gt;
&lt;pre class=&#34;code clojure literal-block&#34;&gt;
&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;import &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;hymn.dsl&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;tell&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]])&lt;/span&gt;

&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;require&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;hymn.dsl&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;

&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;defn &lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;gcd&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;a&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;b&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;
  &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;if &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;zero? &lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;b&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
    &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;do-monad&lt;/span&gt;
      &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;_&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;tell&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;.format&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;quot;the result is: {}\n&amp;quot;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;abs&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;a&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)))]&lt;/span&gt;
      &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;abs&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;a&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt;
    &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;do-monad-m&lt;/span&gt;
      &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;_&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;tell&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;.format&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;quot;{} mod {} = {}\n&amp;quot;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;a&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;b&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;%&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;a&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;b&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)))]&lt;/span&gt;
      &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;gcd&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;b&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;%&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;a&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;b&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)))))&lt;/span&gt;

&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;defmain&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;rest &lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;args&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;
  &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;if &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;-&amp;gt; &lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;args&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;len&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;!=&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;3&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt;
    &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;print &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;usage:&amp;quot;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;get &lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;args&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;quot;number1 number2&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
    &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;let &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[[&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;a&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;int &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;get &lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;args&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))]&lt;/span&gt;
          &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;b&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;int &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;get &lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;args&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))]]&lt;/span&gt;
      &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;print &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;calculating the greatest common divisor of&amp;quot;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;a&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;quot;and&amp;quot;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;b&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
      &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;print &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;.execute&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;gcd&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;a&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;b&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))))))&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;And here is the state monad example, using monte carlo method to calculate pi:&lt;/p&gt;
&lt;pre class=&#34;code clojure literal-block&#34;&gt;
&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;import&lt;/span&gt;
  &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;collections&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;Counter&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]]&lt;/span&gt;
  &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;time &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;time&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]]&lt;/span&gt;
  &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;hymn.dsl&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;get-state&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;replicate &lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;set-state&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]])&lt;/span&gt;

&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;require&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;hymn.dsl&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;

&lt;span class=&#34;c1&#34;&gt;;;; Knuth!&lt;/span&gt;
&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;def &lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;a&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;6364136223846793005&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;def &lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;c&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;1442695040888963407&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;def &lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;m&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;**&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;2&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;64&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt;

&lt;span class=&#34;c1&#34;&gt;;;; linear congruential generator&lt;/span&gt;
&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;def &lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;random&lt;/span&gt;
  &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;do-monad&lt;/span&gt;
    &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;seed&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;get-state&lt;/span&gt;
     &lt;span class=&#34;nv&#34;&gt;_&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;set-state&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;-&amp;gt; &lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;seed&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;* &lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;a&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;+ &lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;c&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;%&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;m&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)))&lt;/span&gt;
     &lt;span class=&#34;nv&#34;&gt;new-seed&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;get-state&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;
    &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;/ &lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;new-seed&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;m&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)))&lt;/span&gt;

&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;def &lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;random-point&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;do-monad&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;x&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;random&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;y&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;random&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;, &lt;span class=&#34;nv&#34;&gt;x&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;y&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)))&lt;/span&gt;

&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;defn &lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;points&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;seed&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;
  &lt;span class=&#34;s&#34;&gt;&amp;quot;stream of random points&amp;quot;&lt;/span&gt;
  &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;while&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;true&lt;/span&gt;
    &lt;span class=&#34;c1&#34;&gt;;; NOTE:&lt;/span&gt;
    &lt;span class=&#34;c1&#34;&gt;;; limited by the maximum recursion depth, we take 150 points each time&lt;/span&gt;
    &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;setv&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;random-points&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;seed&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;.run&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;replicate &lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;150&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;random-point&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;seed&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt;
    &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;for &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;point&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;random-points&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;
      &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;yield&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;point&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))))&lt;/span&gt;

&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;defn &lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;monte-carlo&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;number-of-points&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;
  &lt;span class=&#34;s&#34;&gt;&amp;quot;use monte carlo method to calculate value of pi&amp;quot;&lt;/span&gt;
  &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;def &lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;samples&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;take &lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;number-of-points&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;points&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;int &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;time&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)))))&lt;/span&gt;
  &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;def &lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;result&lt;/span&gt;
    &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;Counter&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;genexpr&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;&amp;gt;= &lt;/span&gt;&lt;span class=&#34;mf&#34;&gt;1.0&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;+ &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;**&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;x&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;**&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;y&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)))&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[[&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;x&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;y&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;samples&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;])))&lt;/span&gt;
  &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;-&amp;gt; &lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;result&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;get &lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;true&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;/ &lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;number-of-points&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;* &lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;4&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)))&lt;/span&gt;

&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;defmain&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;rest &lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;args&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;
  &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;if &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;-&amp;gt; &lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;args&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;len&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;!=&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt;
    &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;print &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;usage:&amp;quot;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;get &lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;args&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;quot;number-of-points&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
    &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;print &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;the estimate for pi =&amp;quot;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;-&amp;gt; &lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;args&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;get &lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;int &lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;monte-carlo&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))))&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;This should replace the older &lt;a class=&#34;reference external&#34; href=&#34;https://xrefactor.com/projects/monad&#34;&gt;monad library&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;

    </content>
  </entry>
  <entry>
    <title type="html">Linux Desktop Screenshots 2014</title>
    <id>https://xrefactor.com/blog/linux-desktop-screenshots-2014.html</id>
    <link href="https://xrefactor.com/blog/linux-desktop-screenshots-2014.html" />
    <published>2014-12-31T16:03:45Z</published>
    <updated>2014-12-31T16:03:45Z</updated>
    <content type="html">
      &lt;div class=&#34;section&#34; id=&#34;linux-desktop-screenshots-2014&#34;&gt;
&lt;h1&gt;Linux Desktop Screenshots 2014&lt;/h1&gt;
&lt;p&gt;What I used in 2014:&lt;/p&gt;
&lt;div class=&#34;figure&#34;&gt;
&lt;img alt=&#34;i3&#34; src=&#34;../static/img/blog/ss2014/i3.png&#34; /&gt;
&lt;p class=&#34;caption&#34;&gt;Nothing changed, except wallpapers, &lt;a class=&#34;reference external&#34; href=&#34;http://i3wm.org/&#34;&gt;i3&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;

    </content>
  </entry>
  <entry>
    <title type="html">2048 in OCaml</title>
    <id>https://xrefactor.com/blog/2048-in-ocaml.html</id>
    <link href="https://xrefactor.com/blog/2048-in-ocaml.html" />
    <published>2014-03-21T11:56:14Z</published>
    <updated>2014-03-21T11:56:14Z</updated>
    <content type="html">
      &lt;div class=&#34;section&#34; id=&#34;in-ocaml&#34;&gt;
&lt;h1&gt;2048 in OCaml&lt;/h1&gt;
&lt;div class=&#34;section&#34; id=&#34;a-new-flappy-bird&#34;&gt;
&lt;h2&gt;A New Flappy Bird&lt;/h2&gt;
&lt;p&gt;Have you ever heard about a game called &lt;a class=&#34;reference external&#34; href=&#34;https://github.com/gabrielecirulli/2048/&#34;&gt;2048&lt;/a&gt;? There are discussions about it
everywhere recently, be it on &lt;em&gt;Stack Overflow&lt;/em&gt;, &lt;em&gt;hacker news&lt;/em&gt;, &lt;em&gt;reddit&lt;/em&gt;,
&lt;em&gt;twitter&lt;/em&gt;, &lt;em&gt;facebook&lt;/em&gt;, you name it.  It even got its own &lt;a class=&#34;reference external&#34; href=&#34;http://en.wikipedia.org/wiki/2048_%28game%29&#34;&gt;wikipedia entry&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The gameplay is simple, you have a 4 x 4 grid with numbers, you can move all
tiles in four directions, while moving, a couple adjacent tiles with same
number will collide and be merged into a new tile with the number of their
values added up, a new tile with number 2 or 4 will also appear randomly after
each move, your goal is to come up with a tile with value &lt;strong&gt;2048&lt;/strong&gt; &lt;em&gt;(hence the
name)&lt;/em&gt; before the game board is too crowded for new tile, in which case, you
lose the game.&lt;/p&gt;
&lt;p&gt;If you haven&#39;t already, please try to play it a few times, it&#39;s quite
straightforward and fun to play, yet challenging and somewhat addictive.  You
will not regret, or you will, for it&#39;s such a time sink.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&#34;section&#34; id=&#34;nih-syndrome-anybody&#34;&gt;
&lt;h2&gt;NIH Syndrome, anybody?&lt;/h2&gt;
&lt;p&gt;Do you know what&#39;s more fun to do?  &lt;a class=&#34;reference external&#34; href=&#34;https://en.wikipedia.org/wiki/Eating_your_own_dog_food&#34;&gt;Dogfooding&lt;/a&gt;, that&#39;s correct, write your
own version of &lt;strong&gt;2048&lt;/strong&gt;, because that&#39;s fun and doable in a few hours.  This is
why all the cool kids in town were busy reimplementing &lt;strong&gt;2048&lt;/strong&gt; using their
favorite programming languages lately.&lt;/p&gt;
&lt;p&gt;In just a few days, I have seen many implementations and variants, in varying
languages and technologies: &lt;em&gt;javascript&lt;/em&gt; (same as the original one), &lt;em&gt;C&lt;/em&gt;,
&lt;em&gt;C++&lt;/em&gt;, &lt;em&gt;java&lt;/em&gt;, &lt;em&gt;C#&lt;/em&gt;, &lt;em&gt;python&lt;/em&gt;, &lt;em&gt;ruby&lt;/em&gt;, &lt;em&gt;Objective-C&lt;/em&gt;, &lt;em&gt;haskell&lt;/em&gt;, etc., and the
number keeps growing.&lt;/p&gt;
&lt;p&gt;It seems like this thing is becoming the new &lt;a class=&#34;reference external&#34; href=&#34;https://en.wikipedia.org/wiki/Hello_world_program&#34;&gt;Hello world&lt;/a&gt;, just like
&lt;em&gt;&amp;quot;roll-your-own-static-website-generator&amp;quot;&lt;/em&gt; was last year, and
&lt;em&gt;&amp;quot;write-your-own-dynamic-blog-engine-with-a-framework&amp;quot;&lt;/em&gt; a few years before
that.&lt;/p&gt;
&lt;p&gt;What I found interesting is, the game can make good use of &lt;a class=&#34;reference external&#34; href=&#34;https://en.wikipedia.org/wiki/Monad_%28functional_programming%29&#34;&gt;monad&lt;/a&gt;, each game
move can be implemented as &lt;strong&gt;monadic function&lt;/strong&gt; and be chained, composed,
transformed as such.  So, with that pattern, I wrote &lt;a class=&#34;reference external&#34; href=&#34;https://xrefactor.com/projects/2048-ml&#34;&gt;my own version&lt;/a&gt; of
&lt;strong&gt;2048&lt;/strong&gt;, in &lt;a class=&#34;reference external&#34; href=&#34;http://ocaml.org/&#34;&gt;OCaml&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&#34;section&#34; id=&#34;monadic-wtf&#34;&gt;
&lt;h2&gt;Monadic WTF?&lt;/h2&gt;
&lt;p&gt;For one thing, &lt;strong&gt;monad&lt;/strong&gt; yields beautiful code, for example, the following code
snippet from my version shows how to initialize a game board and then place two
tiles randomly to begin with:&lt;/p&gt;
&lt;pre class=&#34;code ocaml literal-block&#34;&gt;
&lt;span class=&#34;k&#34;&gt;let&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;init&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;x&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;y&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;
  &lt;span class=&#34;nn&#34;&gt;Random&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;self_init&lt;/span&gt; &lt;span class=&#34;bp&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;;&lt;/span&gt;
  &lt;span class=&#34;k&#34;&gt;let&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;board&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;Board&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;init&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;x&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;y&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;in&lt;/span&gt;
  &lt;span class=&#34;k&#34;&gt;let&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;open&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;Infix&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;in&lt;/span&gt;
  &lt;span class=&#34;n&#34;&gt;playing&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;board&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;gt;&amp;gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;spawn&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;gt;&amp;gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;spawn&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;Notice how I implemented this action &lt;em&gt;&amp;quot;placing a new tile randomly&amp;quot;&lt;/em&gt;, as a
&lt;em&gt;monadic function&lt;/em&gt; (&lt;code&gt;spawn&lt;/code&gt;) and how actions are chained with &lt;em&gt;bind
operator&lt;/em&gt; (&lt;code&gt;&amp;gt;&amp;gt;=&lt;/code&gt;), magnificent, isn&#39;t it?.&lt;/p&gt;
&lt;p&gt;You don&#39;t have to be able to read &lt;em&gt;OCaml&lt;/em&gt; to agree.&lt;/p&gt;
&lt;p&gt;The following shows how to handle move:&lt;/p&gt;
&lt;pre class=&#34;code ocaml literal-block&#34;&gt;
&lt;span class=&#34;k&#34;&gt;let&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;move&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;m&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;game&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;
  &lt;span class=&#34;k&#34;&gt;let&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;open&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;Infix&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;in&lt;/span&gt;
  &lt;span class=&#34;k&#34;&gt;let&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;action&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;match&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;m&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;with&lt;/span&gt;
  &lt;span class=&#34;o&#34;&gt;|&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;Up&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;Board&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;move_up&lt;/span&gt;
  &lt;span class=&#34;o&#34;&gt;|&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;Down&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;Board&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;move_down&lt;/span&gt;
  &lt;span class=&#34;o&#34;&gt;|&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;Left&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;Board&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;move_left&lt;/span&gt;
  &lt;span class=&#34;o&#34;&gt;|&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;Right&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;Board&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;move_right&lt;/span&gt;
  &lt;span class=&#34;k&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;Monad&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;lift&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;action&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;game&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;gt;&amp;gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;spawn&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;See how we combine &lt;em&gt;&amp;quot;making a move&amp;quot;&lt;/em&gt; (&lt;code&gt;Monad.lift action game&lt;/code&gt;) with
&lt;em&gt;&amp;quot;placing a new tile&amp;quot;&lt;/em&gt; (&lt;code&gt;spawn&lt;/code&gt;) then &lt;em&gt;&amp;quot;checking for game winning/losing
condition&amp;quot;&lt;/em&gt; (&lt;code&gt;check&lt;/code&gt;) automatically by &lt;em&gt;bind&lt;/em&gt; function, as follows:&lt;/p&gt;
&lt;pre class=&#34;code ocaml literal-block&#34;&gt;
&lt;span class=&#34;k&#34;&gt;let&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;bind&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;game&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;action&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;
  &lt;span class=&#34;k&#34;&gt;match&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;game&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;with&lt;/span&gt;
  &lt;span class=&#34;o&#34;&gt;|&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;Playing&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;board&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&amp;gt;&lt;/span&gt;
      &lt;span class=&#34;k&#34;&gt;begin&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;match&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;action&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;board&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;with&lt;/span&gt;
      &lt;span class=&#34;o&#34;&gt;|&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;Playing&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;board&#39;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;check&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;board&#39;&lt;/span&gt;
      &lt;span class=&#34;o&#34;&gt;|&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;game&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;game&lt;/span&gt;
      &lt;span class=&#34;k&#34;&gt;end&lt;/span&gt;
  &lt;span class=&#34;o&#34;&gt;|&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;game&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;game&lt;/span&gt;

&lt;span class=&#34;k&#34;&gt;let&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;gt;&amp;gt;=&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;Monad&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;bind&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;As you can see, the &lt;em&gt;bind&lt;/em&gt; function is smart enough to stop taking moves when
the game has finished.  That is, if we are trying to play an action on a
finished game, nothing will happen but passing the game object through the
chain as it is, without explicit testing in each action function.  Talk about
avoiding boilerplate code again.&lt;/p&gt;
&lt;div class=&#34;admonition hint&#34;&gt;
&lt;p class=&#34;first admonition-title&#34;&gt;Hint&lt;/p&gt;
&lt;p class=&#34;last&#34;&gt;More specifically, the &lt;em&gt;game-board&lt;/em&gt; object is modelled as a &lt;a class=&#34;reference external&#34; href=&#34;https://en.wikipedia.org/wiki/Writer_monad#Writer_monad&#34;&gt;Writer Monad&lt;/a&gt;,
tuple of (&lt;em&gt;grid&lt;/em&gt;, &lt;em&gt;step-count&lt;/em&gt;, &lt;em&gt;score&lt;/em&gt;), while the game object is modelled
as something similar to &lt;a class=&#34;reference external&#34; href=&#34;https://en.wikipedia.org/wiki/Writer_monad#The_Maybe_monad&#34;&gt;the Maybe Monad&lt;/a&gt;, tuple of (&lt;em&gt;game-state&lt;/em&gt;,
&lt;em&gt;game-board&lt;/em&gt;).  Each game action takes a &lt;em&gt;game-board&lt;/em&gt; and yields, as after
the action taken, the &lt;em&gt;game-board&lt;/em&gt; in which contains updated &lt;em&gt;step-count&lt;/em&gt; and
&lt;em&gt;score&lt;/em&gt;.  The &lt;em&gt;bind&lt;/em&gt; function takes responsibility for chaining game actions
in turn, accumulating &lt;em&gt;step-count&lt;/em&gt; and &lt;em&gt;score&lt;/em&gt;, and updating &lt;em&gt;game-state&lt;/em&gt;
afterward.  By freeing from these burden, we can have cleaner, less
repetitive code in &lt;em&gt;action&lt;/em&gt; functions.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Language support of &lt;em&gt;automatic currying&lt;/em&gt; and &lt;em&gt;infix operator defining&lt;/em&gt; make the
above pattern possible.  This is why I chose an &lt;a class=&#34;reference external&#34; href=&#34;https://en.wikipedia.org/wiki/ML_programming_language&#34;&gt;ML family&lt;/a&gt; language (&lt;em&gt;OCaml&lt;/em&gt;)
for this project.  Why not &lt;em&gt;haskell&lt;/em&gt; then, you asked?  As much as I &lt;em&gt;love&lt;/em&gt;
&lt;em&gt;haskell&lt;/em&gt;, I picked &lt;em&gt;OCaml&lt;/em&gt; because there are at least two implementations in
&lt;em&gt;haskell&lt;/em&gt; as of today already, besides, &lt;em&gt;OCaml&lt;/em&gt; comes with cross-platform
graphics library, so without external dependency, making a GUI is possible,
here is how it looks:&lt;/p&gt;
&lt;div class=&#34;figure&#34;&gt;
&lt;img alt=&#34;2048 screenshot&#34; src=&#34;../static/img/projects/2048-ml/2048.png&#34; /&gt;
&lt;p class=&#34;caption&#34;&gt;2048 screenshot&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Have time to spare? Get the source from &lt;a class=&#34;reference external&#34; href=&#34;https://bitbucket.org/pyx/2048-ml/&#34;&gt;Bitbucket&lt;/a&gt; or &lt;a class=&#34;reference external&#34; href=&#34;https://github.com/pyx/2048-ml/&#34;&gt;Github&lt;/a&gt;, and have
fun.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;

    </content>
  </entry>
  <entry>
    <title type="html">Linux Desktop Screenshots 2013</title>
    <id>https://xrefactor.com/blog/linux-desktop-screenshots-2013.html</id>
    <link href="https://xrefactor.com/blog/linux-desktop-screenshots-2013.html" />
    <published>2013-12-31T01:14:23Z</published>
    <updated>2013-12-31T01:14:23Z</updated>
    <content type="html">
      &lt;div class=&#34;section&#34; id=&#34;linux-desktop-screenshots-2013&#34;&gt;
&lt;h1&gt;Linux Desktop Screenshots 2013&lt;/h1&gt;
&lt;p&gt;What I used in 2013:&lt;/p&gt;
&lt;div class=&#34;figure&#34;&gt;
&lt;img alt=&#34;i3&#34; src=&#34;../static/img/blog/ss2013/i3.png&#34; /&gt;
&lt;p class=&#34;caption&#34;&gt;Same old thing, &lt;a class=&#34;reference external&#34; href=&#34;http://i3wm.org/&#34;&gt;i3&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;

    </content>
  </entry>
  <entry>
    <title type="html">Introducing Simple - an Ena Theme</title>
    <id>https://xrefactor.com/blog/introducing-simple-an-ena-theme.html</id>
    <link href="https://xrefactor.com/blog/introducing-simple-an-ena-theme.html" />
    <published>2013-07-07T13:30:19Z</published>
    <updated>2013-07-07T13:30:19Z</updated>
    <content type="html">
      &lt;div class=&#34;section&#34; id=&#34;introducing-simple-an-ena-theme&#34;&gt;
&lt;h1&gt;Introducing Simple - an Ena Theme&lt;/h1&gt;
&lt;p&gt;Simple is the default theme that comes with &lt;a class=&#34;reference external&#34; href=&#34;https://xrefactor.com/projects/ena&#34;&gt;Ena&lt;/a&gt;. The following shows how
different elements are styled by Simple.&lt;/p&gt;
&lt;div class=&#34;section&#34; id=&#34;markup&#34;&gt;
&lt;h2&gt;Markup&lt;/h2&gt;
&lt;div class=&#34;section&#34; id=&#34;emphasis&#34;&gt;
&lt;h3&gt;Emphasis&lt;/h3&gt;
&lt;pre class=&#34;code rst literal-block&#34;&gt;
This is &lt;span class=&#34;ge&#34;&gt;*emphasized text*&lt;/span&gt;.
&lt;/pre&gt;
&lt;p&gt;This is &lt;em&gt;emphasized text&lt;/em&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&#34;section&#34; id=&#34;strong-emphasis&#34;&gt;
&lt;h3&gt;Strong Emphasis&lt;/h3&gt;
&lt;pre class=&#34;code rst literal-block&#34;&gt;
This is &lt;span class=&#34;gs&#34;&gt;**strong text**&lt;/span&gt;.
&lt;/pre&gt;
&lt;p&gt;This is &lt;strong&gt;strong text&lt;/strong&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&#34;section&#34; id=&#34;inline-code&#34;&gt;
&lt;h3&gt;Inline Code&lt;/h3&gt;
&lt;pre class=&#34;code rst literal-block&#34;&gt;
This is &lt;span class=&#34;na&#34;&gt;:code:&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;`inline code`&lt;/span&gt;.
&lt;/pre&gt;
&lt;p&gt;This is &lt;code&gt;inline code&lt;/code&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&#34;section&#34; id=&#34;hyperlinks&#34;&gt;
&lt;h3&gt;Hyperlinks&lt;/h3&gt;
&lt;p&gt;Hyperlinks look like this: &lt;a class=&#34;reference external&#34; href=&#34;https://en.wikipedia.org/wiki/ReStructuredText&#34;&gt;https://en.wikipedia.org/wiki/ReStructuredText&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&#34;section&#34; id=&#34;special-admonitions&#34;&gt;
&lt;h2&gt;Special Admonitions&lt;/h2&gt;
&lt;p&gt;All special admonitions supported by reStructuredText are styled, the
following shows each of them, with corresponding reStructuredText code:&lt;/p&gt;
&lt;div class=&#34;section&#34; id=&#34;note&#34;&gt;
&lt;h3&gt;note&lt;/h3&gt;
&lt;div class=&#34;admonition note&#34;&gt;
&lt;p class=&#34;first admonition-title&#34;&gt;Note&lt;/p&gt;
&lt;p&gt;This is note&lt;/p&gt;
&lt;pre class=&#34;code rst last literal-block&#34;&gt;
&lt;span class=&#34;p&#34;&gt;..&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;note&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;::&lt;/span&gt;

  This is note
&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&#34;section&#34; id=&#34;warning&#34;&gt;
&lt;h3&gt;warning&lt;/h3&gt;
&lt;div class=&#34;admonition warning&#34;&gt;
&lt;p class=&#34;first admonition-title&#34;&gt;Warning&lt;/p&gt;
&lt;p&gt;This is warning&lt;/p&gt;
&lt;pre class=&#34;code rst last literal-block&#34;&gt;
&lt;span class=&#34;p&#34;&gt;..&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;warning&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;::&lt;/span&gt;

  This is warning
&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&#34;section&#34; id=&#34;caution&#34;&gt;
&lt;h3&gt;caution&lt;/h3&gt;
&lt;div class=&#34;admonition caution&#34;&gt;
&lt;p class=&#34;first admonition-title&#34;&gt;Caution!&lt;/p&gt;
&lt;p&gt;This is caution&lt;/p&gt;
&lt;pre class=&#34;code rst last literal-block&#34;&gt;
&lt;span class=&#34;p&#34;&gt;..&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;caution&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;::&lt;/span&gt;

  This is caution
&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&#34;section&#34; id=&#34;attention&#34;&gt;
&lt;h3&gt;attention&lt;/h3&gt;
&lt;div class=&#34;admonition attention&#34;&gt;
&lt;p class=&#34;first admonition-title&#34;&gt;Attention!&lt;/p&gt;
&lt;p&gt;This is attention&lt;/p&gt;
&lt;pre class=&#34;code rst last literal-block&#34;&gt;
&lt;span class=&#34;p&#34;&gt;..&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;attention&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;::&lt;/span&gt;

  This is attention
&lt;/pre&gt;
&lt;/div&gt;
&lt;div class=&#34;section&#34; id=&#34;danger&#34;&gt;
&lt;h4&gt;danger&lt;/h4&gt;
&lt;div class=&#34;admonition danger&#34;&gt;
&lt;p class=&#34;first admonition-title&#34;&gt;!DANGER!&lt;/p&gt;
&lt;p&gt;This is danger&lt;/p&gt;
&lt;pre class=&#34;code rst last literal-block&#34;&gt;
&lt;span class=&#34;p&#34;&gt;..&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;danger&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;::&lt;/span&gt;

  This is danger
&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&#34;section&#34; id=&#34;error&#34;&gt;
&lt;h3&gt;error&lt;/h3&gt;
&lt;div class=&#34;admonition error&#34;&gt;
&lt;p class=&#34;first admonition-title&#34;&gt;Error&lt;/p&gt;
&lt;p&gt;This is error&lt;/p&gt;
&lt;pre class=&#34;code rst last literal-block&#34;&gt;
&lt;span class=&#34;p&#34;&gt;..&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;error&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;::&lt;/span&gt;

  This is error
&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&#34;section&#34; id=&#34;hint&#34;&gt;
&lt;h3&gt;hint&lt;/h3&gt;
&lt;div class=&#34;admonition hint&#34;&gt;
&lt;p class=&#34;first admonition-title&#34;&gt;Hint&lt;/p&gt;
&lt;p&gt;This is hint&lt;/p&gt;
&lt;pre class=&#34;code rst last literal-block&#34;&gt;
&lt;span class=&#34;p&#34;&gt;..&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;hint&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;::&lt;/span&gt;

  This is hint
&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&#34;section&#34; id=&#34;important&#34;&gt;
&lt;h3&gt;important&lt;/h3&gt;
&lt;div class=&#34;admonition important&#34;&gt;
&lt;p class=&#34;first admonition-title&#34;&gt;Important&lt;/p&gt;
&lt;blockquote&gt;
This is important&lt;/blockquote&gt;
&lt;pre class=&#34;code rst last literal-block&#34;&gt;
&lt;span class=&#34;p&#34;&gt;..&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;important&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;::&lt;/span&gt;

  This is important
&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&#34;section&#34; id=&#34;tip&#34;&gt;
&lt;h3&gt;tip&lt;/h3&gt;
&lt;div class=&#34;admonition tip&#34;&gt;
&lt;p class=&#34;first admonition-title&#34;&gt;Tip&lt;/p&gt;
&lt;p&gt;This is tip&lt;/p&gt;
&lt;pre class=&#34;code rst last literal-block&#34;&gt;
&lt;span class=&#34;p&#34;&gt;..&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;tip&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;::&lt;/span&gt;

  This is tip
&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&#34;section&#34; id=&#34;admonition&#34;&gt;
&lt;h3&gt;admonition&lt;/h3&gt;
&lt;div class=&#34;admonition admonition-this-is-admonition&#34;&gt;
&lt;p class=&#34;first admonition-title&#34;&gt;This is admonition&lt;/p&gt;
&lt;p&gt;Content here.&lt;/p&gt;
&lt;pre class=&#34;code rst last literal-block&#34;&gt;
&lt;span class=&#34;p&#34;&gt;..&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;admonition&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;::&lt;/span&gt; This is admonition

  Content here.
&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&#34;section&#34; id=&#34;images&#34;&gt;
&lt;h2&gt;Images&lt;/h2&gt;
&lt;p&gt;Images come in two flavors, &lt;code&gt;image&lt;/code&gt; and &lt;code&gt;figure&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&#34;section&#34; id=&#34;image&#34;&gt;
&lt;h3&gt;image&lt;/h3&gt;
&lt;p&gt;In reStructuredText, an &lt;code&gt;image&lt;/code&gt; can be defined with &lt;code&gt;image&lt;/code&gt; directive:&lt;/p&gt;
&lt;pre class=&#34;code rst literal-block&#34;&gt;
&lt;span class=&#34;p&#34;&gt;..&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;image&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;::&lt;/span&gt; picture.png
&lt;/pre&gt;
&lt;p&gt;It looks like this:&lt;/p&gt;
&lt;img alt=&#34;../static/img/blog/simple/logo.png&#34; src=&#34;../static/img/blog/simple/logo.png&#34; /&gt;
&lt;p&gt;By default, images will be scaled to full width of the containing elements with
a border in red, if that is not what you want, add &lt;code&gt;:class: as-is&lt;/code&gt; to it:&lt;/p&gt;
&lt;pre class=&#34;code rst literal-block&#34;&gt;
&lt;span class=&#34;p&#34;&gt;..&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;image&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;::&lt;/span&gt; picture.png
  &lt;span class=&#34;nc&#34;&gt;:class:&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;as-is&lt;/span&gt;
&lt;/pre&gt;
&lt;img alt=&#34;../static/img/blog/simple/logo.png&#34; class=&#34;as-is&#34; src=&#34;../static/img/blog/simple/logo.png&#34; /&gt;
&lt;/div&gt;
&lt;div class=&#34;section&#34; id=&#34;figure&#34;&gt;
&lt;h3&gt;figure&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;figure&lt;/code&gt; is an image with an optional caption and an optional legend:&lt;/p&gt;
&lt;pre class=&#34;code rst literal-block&#34;&gt;
&lt;span class=&#34;p&#34;&gt;..&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;figure&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;::&lt;/span&gt; picture.png

  This is the caption

  This is the legend.
&lt;/pre&gt;
&lt;div class=&#34;figure&#34;&gt;
&lt;img alt=&#34;../static/img/blog/simple/logo.png&#34; src=&#34;../static/img/blog/simple/logo.png&#34; /&gt;
&lt;p class=&#34;caption&#34;&gt;The logo of xrefactor.com&lt;/p&gt;
&lt;div class=&#34;legend&#34;&gt;
I made it with &lt;a class=&#34;reference external&#34; href=&#34;http://www.gimp.org/&#34;&gt;GIMP&lt;/a&gt;.&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;code&gt;:class: as-is&lt;/code&gt; can be used here as well:&lt;/p&gt;
&lt;div class=&#34;figure&#34;&gt;
&lt;img alt=&#34;../static/img/blog/simple/logo.png&#34; class=&#34;as-is&#34; src=&#34;../static/img/blog/simple/logo.png&#34; /&gt;
&lt;p class=&#34;caption&#34;&gt;The logo of xrefactor.com&lt;/p&gt;
&lt;div class=&#34;legend&#34;&gt;
I made it with &lt;a class=&#34;reference external&#34; href=&#34;http://www.gimp.org/&#34;&gt;GIMP&lt;/a&gt;.&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&#34;section&#34; id=&#34;body-elements&#34;&gt;
&lt;h2&gt;Body Elements&lt;/h2&gt;
&lt;div class=&#34;section&#34; id=&#34;code&#34;&gt;
&lt;h3&gt;code&lt;/h3&gt;
&lt;p&gt;Source code blocks can be defined by:&lt;/p&gt;
&lt;pre class=&#34;code rst literal-block&#34;&gt;
&lt;span class=&#34;p&#34;&gt;..&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;code&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;::&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;c&lt;/span&gt;

&lt;span class=&#34;cp&#34;&gt;&lt;/span&gt;  &lt;span class=&#34;cp&#34;&gt;#include&lt;/span&gt; &lt;span class=&#34;cpf&#34;&gt;&amp;lt;stdio.h&amp;gt;&lt;/span&gt;&lt;span class=&#34;cp&#34;&gt;
&lt;/span&gt;
  &lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;main&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;argc&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;kt&#34;&gt;char&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;argv&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[])&lt;/span&gt;
  &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
      &lt;span class=&#34;n&#34;&gt;printf&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;%s&lt;/span&gt;&lt;span class=&#34;se&#34;&gt;\n&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;quot;Hello, world!&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
      &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;void&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;argc&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
      &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;void&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;argv&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
      &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
  &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;

    </content>
  </entry>
  <entry>
    <title type="html">Calculating the Maximum, Minimum and Average of Three Numbers</title>
    <id>https://xrefactor.com/blog/max-min-average-of-three-numbers.html</id>
    <link href="https://xrefactor.com/blog/max-min-average-of-three-numbers.html" />
    <published>2013-07-03T20:26:23Z</published>
    <updated>2013-07-03T20:26:23Z</updated>
    <content type="html">
      &lt;div class=&#34;section&#34; id=&#34;calculating-the-maximum-minimum-and-average-of-three-numbers&#34;&gt;
&lt;h1&gt;Calculating the Maximum, Minimum and Average of Three Numbers&lt;/h1&gt;
&lt;p&gt;The title says it all.  As always, I love to answer those &lt;a class=&#34;reference external&#34; href=&#34;http://tieba.baidu.com/p/2433021887&#34;&gt;homework questions&lt;/a&gt;
with obfuscated solutions, for that is unsuitable to hand in those solutions.&lt;/p&gt;
&lt;p&gt;A simple way to make a solution to entry-level question like this one harder to
understand, is leveraging the fact that functions are first-class in python, so
basically logic and I/O operations, almost everything we need here can be
stuffed inside a single expression, like this:&lt;/p&gt;
&lt;pre class=&#34;code python literal-block&#34;&gt;
&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;f&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;f&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;n&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;zip&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;((&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;max&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;min&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;lambda&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;s&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;float&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;sum&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;s&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;len&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;s&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)),&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;([&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;list&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;map&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;map&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;raw_input&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&#39;:::&#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)))]&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;3&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))]&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;This is the Python 2 version, for Python 3, substitute &lt;code&gt;raw_input&lt;/code&gt; with &lt;code&gt;input&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;It works like so:&lt;/p&gt;
&lt;pre class=&#34;code pycon literal-block&#34;&gt;
&lt;span class=&#34;p&#34;&gt;&lt;/span&gt;&lt;span class=&#34;gp&#34;&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;f&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;f&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;n&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;zip&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;((&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;max&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;min&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;lambda&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;s&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;float&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;sum&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;s&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;len&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;s&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)),&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;([&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;list&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;map&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;map&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;raw_input&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&#39;:::&#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)))]&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;3&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))]&lt;/span&gt;
&lt;span class=&#34;go&#34;&gt;:1
:2
:3
[3, 1, 2.0]&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;For extra fun, I use the number of &lt;code&gt;:&lt;/code&gt; (Colon) to control how many
numbers can be accepted, i.e, for six numbers instead of three, change
&lt;code&gt;&#39;:::&#39;&lt;/code&gt; to &lt;code&gt;&#39;::::::&#39;&lt;/code&gt;:&lt;/p&gt;
&lt;pre class=&#34;code pycon literal-block&#34;&gt;
&lt;span class=&#34;p&#34;&gt;&lt;/span&gt;&lt;span class=&#34;gp&#34;&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;f&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;f&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;n&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;zip&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;((&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;max&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;min&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;lambda&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;s&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;float&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;sum&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;s&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;len&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;s&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)),&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;([&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;list&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;map&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;map&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;raw_input&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&#39;::::::&#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)))]&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;3&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))]&lt;/span&gt;
&lt;span class=&#34;go&#34;&gt;:12
:34
:56
:78
:90
:42
[90, 12, 52.0]&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;Because of the incompatible differences between Python 2 and Python 3, it can
be a little bit shorter if I am only targeting specific branch of Python.&lt;/p&gt;
&lt;p&gt;In Python 2, &lt;code&gt;map&lt;/code&gt; returns a &lt;code&gt;list&lt;/code&gt;, so explicit &lt;code&gt;list&lt;/code&gt;
conversion is not needed:&lt;/p&gt;
&lt;pre class=&#34;code python literal-block&#34;&gt;
&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;f&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;f&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;n&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;zip&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;((&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;max&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;min&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;lambda&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;s&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;float&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;sum&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;s&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;len&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;s&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)),&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;([&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;map&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;map&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;raw_input&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&#39;:::&#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))]&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;3&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))]&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;On the other hand, division operator returns floating-point numbers by default
in Python 3, &lt;code&gt;float&lt;/code&gt; function call is no longer necessary:&lt;/p&gt;
&lt;pre class=&#34;code python literal-block&#34;&gt;
&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;f&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;f&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;n&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;zip&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;((&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;max&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;min&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;lambda&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;s&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;sum&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;s&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;len&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;s&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)),&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;([&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;list&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;map&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;map&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;input&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&#39;:::&#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)))]&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;3&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))]&lt;/span&gt;
&lt;/pre&gt;
&lt;/div&gt;

    </content>
  </entry>
</feed>