<?xml version="1.0" encoding="utf-8" standalone="yes"?><feed xmlns="http://www.w3.org/2005/Atom"><title>Pedro Matiello</title><link href="https://www.pmatiello.me/" rel="self"/><link href="https://www.pmatiello.me/"/><updated>2026-08-14T01:10:25+00:00</updated><id>https://www.pmatiello.me/</id><author><name>Pedro Matiello</name></author><generator>Hugo -- gohugo.io</generator><entry><title>Announcement: me.pmatiello/openai-api</title><link href="https://www.pmatiello.me/posts/2023-04-25-announcement-mepmatielloopenai-api/"/><id>https://www.pmatiello.me/posts/2023-04-25-announcement-mepmatielloopenai-api/</id><updated>2023-04-25T22:30:00+00:00</updated><published>2023-04-25T22:30:00+00:00</published><content type="html">&lt;p&gt;&lt;code&gt;me.pmatiello/openai-api&lt;/code&gt; is a pure-Clojure wrapper around
the &lt;a href="https://platform.openai.com/"&gt;OpenAI API&lt;/a&gt;, offering various functions for
interacting with the API&amp;rsquo;s capabilities. These include text generation, image
generation and editing, embeddings, audio transcription and translation, file
management, fine-tuning, and content moderation.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#272822;background-color:#fafafa;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-clj" data-lang="clj"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#111"&gt;(&lt;/span&gt;&lt;span style="color:#75af00"&gt;require&lt;/span&gt; &lt;span style="color:#f92672"&gt;&amp;#39;&lt;/span&gt;&lt;span style="color:#111"&gt;[&lt;/span&gt;&lt;span style="color:#111"&gt;me.pmatiello.openai-api.api&lt;/span&gt; &lt;span style="color:#d88200"&gt;:as&lt;/span&gt; &lt;span style="color:#111"&gt;openai&lt;/span&gt;&lt;span style="color:#111"&gt;])&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#111"&gt;(&lt;/span&gt;&lt;span style="color:#00a8c8"&gt;def &lt;/span&gt;&lt;span style="color:#111"&gt;credentials&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#111"&gt;(&lt;/span&gt;&lt;span style="color:#75af00"&gt;openai/credentials&lt;/span&gt; &lt;span style="color:#111"&gt;api-key&lt;/span&gt;&lt;span style="color:#111"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#111"&gt;(&lt;/span&gt;&lt;span style="color:#75af00"&gt;openai/chat&lt;/span&gt; &lt;span style="color:#111"&gt;{&lt;/span&gt;&lt;span style="color:#d88200"&gt;:model&lt;/span&gt; &lt;span style="color:#d88200"&gt;&amp;#34;gpt-3.5-turbo&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#d88200"&gt;:messages&lt;/span&gt; &lt;span style="color:#111"&gt;[{&lt;/span&gt;&lt;span style="color:#d88200"&gt;:role&lt;/span&gt; &lt;span style="color:#d88200"&gt;&amp;#34;user&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#d88200"&gt;:content&lt;/span&gt; &lt;span style="color:#d88200"&gt;&amp;#34;Fix: (println \&amp;#34;hello&amp;#34;&lt;/span&gt;&lt;span style="color:#111"&gt;}]}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#111"&gt;credentials&lt;/span&gt;&lt;span style="color:#111"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Notice:&lt;/strong&gt; This is not an official OpenAI project nor is it affiliated with
OpenAI in any way.&lt;/p&gt;
&lt;p&gt;Refer to the &lt;a href="https://github.com/pmatiello/openai-api"&gt;project page&lt;/a&gt;
and &lt;a href="https://cljdoc.org/d/me.pmatiello/openai-api/"&gt;documentation&lt;/a&gt; for more.&lt;/p&gt;</content></entry><entry><title>Announcing mockfn</title><link href="https://www.pmatiello.me/posts/2018-03-22-announcing-mockfn/"/><id>https://www.pmatiello.me/posts/2018-03-22-announcing-mockfn/</id><updated>2018-03-22T19:00:00+00:00</updated><published>2018-03-22T19:00:00+00:00</published><content type="html">&lt;p&gt;&lt;a href="https://github.com/pmatiello/mockfn"&gt;&lt;code&gt;me.pmatiello/mockfn&lt;/code&gt;&lt;/a&gt; is a library
supporting mockist test-driven-development in Clojure. It is meant to be used
alongside a regular testing framework such as &lt;code&gt;clojure.test&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;It provides two macros to be used in tests. The first, &lt;code&gt;providing&lt;/code&gt;, replaces a
function with a configured mock.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#272822;background-color:#fafafa;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-clj" data-lang="clj"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#111"&gt;(&lt;/span&gt;&lt;span style="color:#75af00"&gt;testing&lt;/span&gt; &lt;span style="color:#d88200"&gt;&amp;#34;providing&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#111"&gt;(&lt;/span&gt;&lt;span style="color:#75af00"&gt;providing&lt;/span&gt; &lt;span style="color:#111"&gt;[(&lt;/span&gt;&lt;span style="color:#75af00"&gt;one-fn&lt;/span&gt;&lt;span style="color:#111"&gt;)&lt;/span&gt; &lt;span style="color:#d88200"&gt;:result&lt;/span&gt;&lt;span style="color:#111"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#111"&gt;(&lt;/span&gt;&lt;span style="color:#75af00"&gt;is&lt;/span&gt; &lt;span style="color:#111"&gt;(&lt;/span&gt;&lt;span style="color:#111"&gt;= &lt;/span&gt;&lt;span style="color:#d88200"&gt;:result&lt;/span&gt; &lt;span style="color:#111"&gt;(&lt;/span&gt;&lt;span style="color:#75af00"&gt;one-fn&lt;/span&gt;&lt;span style="color:#111"&gt;)))))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The second macro, &lt;code&gt;verifying&lt;/code&gt;, works similarly, but also defines an expectation
for the number of times a call should be performed during the test.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#272822;background-color:#fafafa;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-clj" data-lang="clj"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#111"&gt;(&lt;/span&gt;&lt;span style="color:#75af00"&gt;testing&lt;/span&gt; &lt;span style="color:#d88200"&gt;&amp;#34;verifying&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#111"&gt;(&lt;/span&gt;&lt;span style="color:#75af00"&gt;verifying&lt;/span&gt; &lt;span style="color:#111"&gt;[(&lt;/span&gt;&lt;span style="color:#75af00"&gt;one-fn&lt;/span&gt; &lt;span style="color:#d88200"&gt;:argument&lt;/span&gt;&lt;span style="color:#111"&gt;)&lt;/span&gt; &lt;span style="color:#d88200"&gt;:result&lt;/span&gt; &lt;span style="color:#111"&gt;(&lt;/span&gt;&lt;span style="color:#75af00"&gt;exactly&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;&lt;span style="color:#111"&gt;)]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#111"&gt;(&lt;/span&gt;&lt;span style="color:#75af00"&gt;is&lt;/span&gt; &lt;span style="color:#111"&gt;(&lt;/span&gt;&lt;span style="color:#111"&gt;= &lt;/span&gt;&lt;span style="color:#d88200"&gt;:result&lt;/span&gt; &lt;span style="color:#111"&gt;(&lt;/span&gt;&lt;span style="color:#75af00"&gt;one-fn&lt;/span&gt; &lt;span style="color:#d88200"&gt;:argument&lt;/span&gt;&lt;span style="color:#111"&gt;)))))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Argument matchers are also supported:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#272822;background-color:#fafafa;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-clj" data-lang="clj"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#111"&gt;(&lt;/span&gt;&lt;span style="color:#75af00"&gt;testing&lt;/span&gt; &lt;span style="color:#d88200"&gt;&amp;#34;argument matchers&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#111"&gt;(&lt;/span&gt;&lt;span style="color:#75af00"&gt;providing&lt;/span&gt; &lt;span style="color:#111"&gt;[(&lt;/span&gt;&lt;span style="color:#75af00"&gt;one-fn&lt;/span&gt; &lt;span style="color:#111"&gt;(&lt;/span&gt;&lt;span style="color:#75af00"&gt;at-least&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;10&lt;/span&gt;&lt;span style="color:#111"&gt;)&lt;/span&gt; &lt;span style="color:#111"&gt;(&lt;/span&gt;&lt;span style="color:#75af00"&gt;at-most&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;20&lt;/span&gt;&lt;span style="color:#111"&gt;))&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;15&lt;/span&gt;&lt;span style="color:#111"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#111"&gt;(&lt;/span&gt;&lt;span style="color:#75af00"&gt;is&lt;/span&gt; &lt;span style="color:#111"&gt;(&lt;/span&gt;&lt;span style="color:#111"&gt;= &lt;/span&gt;&lt;span style="color:#ae81ff"&gt;15&lt;/span&gt; &lt;span style="color:#111"&gt;(&lt;/span&gt;&lt;span style="color:#75af00"&gt;one-fn&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;12&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;18&lt;/span&gt;&lt;span style="color:#111"&gt;))))))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;a href="https://github.com/pmatiello/mockfn"&gt;Project page&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://cljdoc.org/d/me.pmatiello/mockfn/"&gt;Documentation&lt;/a&gt;&lt;/p&gt;</content></entry><entry><title>Injecting Akka Routers as Dependencies in a Play Application</title><link href="https://www.pmatiello.me/posts/2015-07-19-injecting-akka-routers-as-dependencies-in-a-play-application/"/><id>https://www.pmatiello.me/posts/2015-07-19-injecting-akka-routers-as-dependencies-in-a-play-application/</id><updated>2015-07-19T18:30:00+00:00</updated><published>2015-07-19T18:30:00+00:00</published><content type="html">&lt;p&gt;Sometimes, an actor can&amp;rsquo;t keep up with the amount of messages it receives. When
work is produced at a faster rate than it can be consumed, the system is in
trouble. A bounded mailbox will drop messages that were intended to the actor
while an unbounded one will grow until it consumes all the available memory and
crashes the application.&lt;/p&gt;
&lt;p&gt;If the task being performed isn&amp;rsquo;t CPU-bound or if there are enough cores
available in the machine, a simple solution might be just have enough instances
of this stressed actor working in parallel. &lt;a href="http://akka.io"&gt;Akka&lt;/a&gt; helps us to
implement this by
providing &lt;a href="http://doc.akka.io/docs/akka/snapshot/scala/routing.html"&gt;routers&lt;/a&gt;:
actors that
proxy, &lt;a href="http://doc.akka.io/docs/akka/snapshot/scala/routing.html#Supervision"&gt;supervise&lt;/a&gt;
and delegate messages to the child actors it manages. That is, when a mensage is
sent the the router, it will be forwarded to one of the managed actors so that
it can be properly handled. For the producer originating the messages, nothing
changes: it just needs an &lt;code&gt;ActorRef&lt;/code&gt; to the router and it can be completely
ignorant about the size of the pool of consumers and whether it is pushing work
directly to the consumer or through an intermediate.&lt;/p&gt;
&lt;p&gt;The problem, then, becomes a matter of providing such a reference to the
producer. Since version 2.4, &lt;a href="https://www.playframework.com/"&gt;Play Framework&lt;/a&gt;
provides &lt;a href="https://www.playframework.com/documentation/2.4.x/ScalaDependencyInjection"&gt;out-of-the-box support for Dependency Injection&lt;/a&gt;,
which also can be used
to &lt;a href="https://www.playframework.com/documentation/2.4.x/ScalaAkka#Dependency-injecting-actors"&gt;build and inject actors&lt;/a&gt;
where they are needed. Here is a brief example:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#272822;background-color:#fafafa;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-scala" data-lang="scala"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#00a8c8"&gt;class&lt;/span&gt; &lt;span style="color:#75af00"&gt;StressedActor&lt;/span&gt; &lt;span style="color:#75af00"&gt;@Inject&lt;/span&gt;&lt;span style="color:#f92672"&gt;()&lt;/span&gt; &lt;span style="color:#f92672"&gt;(&lt;/span&gt;&lt;span style="color:#111"&gt;dependencies&lt;/span&gt;&lt;span style="color:#f92672"&gt;...)&lt;/span&gt; &lt;span style="color:#00a8c8"&gt;extends&lt;/span&gt; &lt;span style="color:#75af00"&gt;Actor&lt;/span&gt; &lt;span style="color:#f92672"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#00a8c8"&gt;override&lt;/span&gt; &lt;span style="color:#00a8c8"&gt;def&lt;/span&gt; &lt;span style="color:#111"&gt;receive&lt;/span&gt; &lt;span style="color:#00a8c8"&gt;=&lt;/span&gt; &lt;span style="color:#f92672"&gt;...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#00a8c8"&gt;class&lt;/span&gt; &lt;span style="color:#75af00"&gt;StressedActorModule&lt;/span&gt; &lt;span style="color:#00a8c8"&gt;extends&lt;/span&gt; &lt;span style="color:#75af00"&gt;AbstractModule&lt;/span&gt; &lt;span style="color:#00a8c8"&gt;with&lt;/span&gt; &lt;span style="color:#75af00"&gt;AkkaGuiceSupport&lt;/span&gt; &lt;span style="color:#f92672"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#00a8c8"&gt;def&lt;/span&gt; &lt;span style="color:#111"&gt;configure&lt;/span&gt;&lt;span style="color:#f92672"&gt;()&lt;/span&gt; &lt;span style="color:#00a8c8"&gt;=&lt;/span&gt; &lt;span style="color:#f92672"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#111"&gt;bindActor&lt;/span&gt;&lt;span style="color:#f92672"&gt;[&lt;/span&gt;&lt;span style="color:#00a8c8"&gt;StressedActor&lt;/span&gt;&lt;span style="color:#f92672"&gt;](&lt;/span&gt;&lt;span style="color:#d88200"&gt;&amp;#34;stressed-actor&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#00a8c8"&gt;class&lt;/span&gt; &lt;span style="color:#75af00"&gt;Producer&lt;/span&gt; &lt;span style="color:#75af00"&gt;@Inject&lt;/span&gt;&lt;span style="color:#f92672"&gt;()&lt;/span&gt; &lt;span style="color:#f92672"&gt;(&lt;/span&gt;&lt;span style="color:#75af00"&gt;@Named&lt;/span&gt;&lt;span style="color:#f92672"&gt;(&lt;/span&gt;&lt;span style="color:#d88200"&gt;&amp;#34;stressed-actor&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;)&lt;/span&gt; &lt;span style="color:#111"&gt;talkingActor&lt;/span&gt;&lt;span style="color:#00a8c8"&gt;:&lt;/span&gt; &lt;span style="color:#00a8c8"&gt;ActorRef&lt;/span&gt;&lt;span style="color:#f92672"&gt;)&lt;/span&gt; &lt;span style="color:#f92672"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Add the following line to application.conf:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#111"&gt;play&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;&lt;span style="color:#111"&gt;modules&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;&lt;span style="color:#111"&gt;enabled&lt;/span&gt;&lt;span style="color:#f92672"&gt;+=&lt;/span&gt;&lt;span style="color:#d88200"&gt;&amp;#34;path.to.StressedActorModule&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;With as little boilerplate as this, Play will be able to build &lt;code&gt;StressedActor&lt;/code&gt;
(along with all its dependencies) and have it injected in &lt;code&gt;Producer&lt;/code&gt;. At the
present situation, though, this isn&amp;rsquo;t sufficient as more than a single instance
of the actor is demanded. Fortunately, only a small tweak at the module is
needed to have a number of instances of &lt;code&gt;StressedActor&lt;/code&gt; built under a router and
to have this router injected into the producers:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#272822;background-color:#fafafa;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-scala" data-lang="scala"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#00a8c8"&gt;class&lt;/span&gt; &lt;span style="color:#75af00"&gt;StressedActorModule&lt;/span&gt; &lt;span style="color:#00a8c8"&gt;extends&lt;/span&gt; &lt;span style="color:#75af00"&gt;AbstractModule&lt;/span&gt; &lt;span style="color:#00a8c8"&gt;with&lt;/span&gt; &lt;span style="color:#75af00"&gt;AkkaGuiceSupport&lt;/span&gt; &lt;span style="color:#f92672"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#00a8c8"&gt;def&lt;/span&gt; &lt;span style="color:#111"&gt;configure&lt;/span&gt;&lt;span style="color:#f92672"&gt;()&lt;/span&gt; &lt;span style="color:#00a8c8"&gt;=&lt;/span&gt; &lt;span style="color:#f92672"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#111"&gt;bindActor&lt;/span&gt;&lt;span style="color:#f92672"&gt;[&lt;/span&gt;&lt;span style="color:#00a8c8"&gt;StressedActor&lt;/span&gt;&lt;span style="color:#f92672"&gt;](&lt;/span&gt;&lt;span style="color:#d88200"&gt;&amp;#34;stressed-actor&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;,&lt;/span&gt; &lt;span style="color:#75af00"&gt;RoundRobinPool&lt;/span&gt;&lt;span style="color:#f92672"&gt;(&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;5&lt;/span&gt;&lt;span style="color:#f92672"&gt;).&lt;/span&gt;&lt;span style="color:#111"&gt;props&lt;/span&gt;&lt;span style="color:#f92672"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Here, a pool five consumers will be instantiated and the messages sent to the
router will be conveniently delivered to these consumers in round-robin fashion
such that the load on them is kept balanced.&lt;/p&gt;</content></entry><entry><title>Request-Scoped Dependency-Injection in Play Framework with MacWire</title><link href="https://www.pmatiello.me/posts/2015-03-03-request-scoped-dependency-injection-in-play-framework-with-macwire/"/><id>https://www.pmatiello.me/posts/2015-03-03-request-scoped-dependency-injection-in-play-framework-with-macwire/</id><updated>2015-03-03T09:00:00+00:00</updated><published>2015-03-03T09:00:00+00:00</published><content type="html">&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Update (09 Jul 2015):&lt;/strong&gt; This post was written for Play 2.3.x.
Since &lt;a href="https://playframework.com/documentation/2.4.x/Highlights24"&gt;version 2.4.0&lt;/a&gt;, &lt;a href="https://playframework.com/documentation/2.4.x/ScalaDependencyInjection"&gt;dependency injection&lt;/a&gt;
is supported out of the box in Play
through &lt;a href="https://github.com/google/guice"&gt;Guice&lt;/a&gt;. Also, changes in routing at
this version of the framework break the approach described here.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Controllers in &lt;a href="https://www.playframework.com"&gt;Play Framework&lt;/a&gt; are usually
defined as singleton objects. In fact, Play&amp;rsquo;s documentation defines a controller
as &lt;a href="https://www.playframework.com/documentation/2.3.x/ScalaActions"&gt;a singleton object that generates Action values&lt;/a&gt;
and provides an example like the one below:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#272822;background-color:#fafafa;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-scala" data-lang="scala"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#00a8c8"&gt;object&lt;/span&gt; &lt;span style="color:#75af00"&gt;Application&lt;/span&gt; &lt;span style="color:#00a8c8"&gt;extends&lt;/span&gt; &lt;span style="color:#75af00"&gt;Controller&lt;/span&gt; &lt;span style="color:#f92672"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#00a8c8"&gt;def&lt;/span&gt; &lt;span style="color:#111"&gt;index&lt;/span&gt; &lt;span style="color:#00a8c8"&gt;=&lt;/span&gt; &lt;span style="color:#75af00"&gt;Action&lt;/span&gt; &lt;span style="color:#f92672"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75af00"&gt;Ok&lt;/span&gt;&lt;span style="color:#f92672"&gt;(&lt;/span&gt;&lt;span style="color:#d88200"&gt;&amp;#34;It works!&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This kind of design is not without problems. Any dependencies of these
controllers must be constructed inside the controller, tightening the coupling
between them as the controller must now concern itself with one more aspect of
its dependencies, namely, their construction.&lt;/p&gt;
&lt;p&gt;This increased coupling also make the reuse of these controllers harder as it&amp;rsquo;s
not trivial to tweak them by substituting their dependencies with different
implementations. This is particularly relevant when writing unit tests as it&amp;rsquo;s
often very interesting to substitute dependencies for mock objects.&lt;/p&gt;
&lt;p&gt;The lifecyle of the dependencies may also become a more present concern: if a
dependency is kept as an instance attribute, any mutable state in it will be
shared by other requests to this controller, which may be particularly
unpleasant in a concurrent environment. Avoiding this requires building the
dependency independently at every action where it&amp;rsquo;s necessary.&lt;/p&gt;
&lt;h2 id="a-better-design"&gt;A better design&lt;/h2&gt;
&lt;p&gt;This said, all these problems can be solved by adopting a different design.
Instead of using the same singleton object for handling every request, we can
have an exclusive controller instance for each request. Instead of having all
dependencies statically bound to the controller, we can have them injected in
runtime into the controller through its constructor.&lt;/p&gt;
&lt;p&gt;Even though Play provides no native support
for &lt;a href="http://en.wikipedia.org/wiki/Dependency_injection"&gt;Dependency Injection&lt;/a&gt;,
it allows us to take over the job of instantiating and providing the controller
objects that will be used to handle the incoming requests. And since we can
initialize these objects ourselves, we can also provide them their dependencies
while we&amp;rsquo;re at it. The approach we&amp;rsquo;ll be using here is outlined in
the &lt;a href="https://www.playframework.com/documentation/2.3.x/ScalaDependencyInjection"&gt;framework documentation&lt;/a&gt;,
even though no specifics are given on how to perform the actual initializations
and injections.&lt;/p&gt;
&lt;h2 id="instantiating-controllers-manually"&gt;Instantiating controllers manually&lt;/h2&gt;
&lt;p&gt;Consider a Play &lt;code&gt;routes&lt;/code&gt; file with the following entry:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;GET /action controllers.Application.action
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Any request to &lt;code&gt;/action&lt;/code&gt; will be automatically dispatched by Play to the
&lt;code&gt;action&lt;/code&gt; method in the &lt;code&gt;Application&lt;/code&gt; singleton object. However, if we prefix the
route target with an &lt;code&gt;@&lt;/code&gt; character, the method &lt;code&gt;getControllerInstance&lt;/code&gt; in the
&lt;code&gt;Global&lt;/code&gt; object
(&lt;a href="https://www.playframework.com/documentation/2.3.x/ScalaGlobal"&gt;documentation&lt;/a&gt;)
will be called to produce an instance of the &lt;code&gt;Application&lt;/code&gt; class.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;GET /action @controllers.Application.action
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;The following snippet contains a trivial implementation for the
&lt;code&gt;Global#getControllerInstance&lt;/code&gt; method. It just produces a new instance of the
given class. In fact, you don&amp;rsquo;t actually need to implement it as &lt;code&gt;Global&lt;/code&gt; will
inherit the exact same implementation from the &lt;code&gt;GlobalSettings&lt;/code&gt; superclass.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#272822;background-color:#fafafa;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-scala" data-lang="scala"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#00a8c8"&gt;object&lt;/span&gt; &lt;span style="color:#75af00"&gt;Global&lt;/span&gt; &lt;span style="color:#00a8c8"&gt;extends&lt;/span&gt; &lt;span style="color:#75af00"&gt;GlobalSettings&lt;/span&gt; &lt;span style="color:#f92672"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#00a8c8"&gt;override&lt;/span&gt; &lt;span style="color:#00a8c8"&gt;def&lt;/span&gt; &lt;span style="color:#111"&gt;getControllerInstance&lt;/span&gt;&lt;span style="color:#f92672"&gt;[&lt;/span&gt;&lt;span style="color:#00a8c8"&gt;A&lt;/span&gt;&lt;span style="color:#f92672"&gt;](&lt;/span&gt;&lt;span style="color:#111"&gt;controllerClass&lt;/span&gt;&lt;span style="color:#00a8c8"&gt;:&lt;/span&gt; &lt;span style="color:#00a8c8"&gt;Class&lt;/span&gt;&lt;span style="color:#f92672"&gt;[&lt;/span&gt;&lt;span style="color:#00a8c8"&gt;A&lt;/span&gt;&lt;span style="color:#f92672"&gt;])&lt;/span&gt;&lt;span style="color:#00a8c8"&gt;:&lt;/span&gt; &lt;span style="color:#00a8c8"&gt;A&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#f92672"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#111"&gt;controllerClass&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;&lt;span style="color:#111"&gt;newInstance&lt;/span&gt;&lt;span style="color:#f92672"&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Notice that it takes a class as argument, not a singleton object. And the return
of this method will be an instance of the given class. Therefore, our controller
cannot be a singleton object as it must be a class instead.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#272822;background-color:#fafafa;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-scala" data-lang="scala"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#00a8c8"&gt;class&lt;/span&gt; &lt;span style="color:#75af00"&gt;Application&lt;/span&gt; &lt;span style="color:#00a8c8"&gt;extends&lt;/span&gt; &lt;span style="color:#75af00"&gt;Controller&lt;/span&gt; &lt;span style="color:#f92672"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#00a8c8"&gt;def&lt;/span&gt; &lt;span style="color:#111"&gt;action&lt;/span&gt; &lt;span style="color:#00a8c8"&gt;=&lt;/span&gt; &lt;span style="color:#75af00"&gt;Action&lt;/span&gt; &lt;span style="color:#f92672"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75af00"&gt;Ok&lt;/span&gt;&lt;span style="color:#f92672"&gt;(&lt;/span&gt;&lt;span style="color:#d88200"&gt;&amp;#34;It works!&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="introducing-macwire"&gt;Introducing MacWire&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://github.com/adamw/macwire"&gt;MacWire&lt;/a&gt; is an interesting library for
performing Dependency Injection in Scala applications. Like an usual DI
container, it frees the developer from the tedious wiring of instances and
dependencies. Unlike such containers, though, it generates all this wiring code
in compile-time, backed by Scala macros. This way, if some class cannot be
initialized because, say, some dependency isn&amp;rsquo;t registered, a compilation error
will be raised instead of a runtime error.&lt;/p&gt;
&lt;p&gt;The library expects the managed classes to be registered as attributes in a
&lt;code&gt;class&lt;/code&gt;, &lt;code&gt;trait&lt;/code&gt; or &lt;code&gt;object&lt;/code&gt;.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#272822;background-color:#fafafa;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-scala" data-lang="scala"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#00a8c8"&gt;class&lt;/span&gt; &lt;span style="color:#75af00"&gt;AuthenticationService&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#00a8c8"&gt;class&lt;/span&gt; &lt;span style="color:#75af00"&gt;Application&lt;/span&gt;&lt;span style="color:#f92672"&gt;(&lt;/span&gt;&lt;span style="color:#111"&gt;authenticationService&lt;/span&gt;&lt;span style="color:#00a8c8"&gt;:&lt;/span&gt; &lt;span style="color:#00a8c8"&gt;AuthenticationService&lt;/span&gt;&lt;span style="color:#f92672"&gt;)&lt;/span&gt; &lt;span style="color:#00a8c8"&gt;extends&lt;/span&gt; &lt;span style="color:#75af00"&gt;Controller&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#00a8c8"&gt;class&lt;/span&gt; &lt;span style="color:#75af00"&gt;Wiring&lt;/span&gt; &lt;span style="color:#f92672"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#00a8c8"&gt;lazy&lt;/span&gt; &lt;span style="color:#00a8c8"&gt;val&lt;/span&gt; &lt;span style="color:#111"&gt;authenticationService&lt;/span&gt; &lt;span style="color:#00a8c8"&gt;=&lt;/span&gt; &lt;span style="color:#111"&gt;wire&lt;/span&gt;&lt;span style="color:#f92672"&gt;[&lt;/span&gt;&lt;span style="color:#00a8c8"&gt;AuthenticationService&lt;/span&gt;&lt;span style="color:#f92672"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#00a8c8"&gt;lazy&lt;/span&gt; &lt;span style="color:#00a8c8"&gt;val&lt;/span&gt; &lt;span style="color:#111"&gt;application&lt;/span&gt; &lt;span style="color:#00a8c8"&gt;=&lt;/span&gt; &lt;span style="color:#111"&gt;wire&lt;/span&gt;&lt;span style="color:#f92672"&gt;[&lt;/span&gt;&lt;span style="color:#00a8c8"&gt;Application&lt;/span&gt;&lt;span style="color:#f92672"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Fetching a perfectly wired instance with a static lookup is trivial:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#272822;background-color:#fafafa;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-scala" data-lang="scala"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#00a8c8"&gt;val&lt;/span&gt; &lt;span style="color:#111"&gt;wiring&lt;/span&gt; &lt;span style="color:#00a8c8"&gt;=&lt;/span&gt; &lt;span style="color:#00a8c8"&gt;new&lt;/span&gt; &lt;span style="color:#75af00"&gt;Wiring&lt;/span&gt;&lt;span style="color:#f92672"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#111"&gt;wiring&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;&lt;span style="color:#111"&gt;application&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;In our case, however, a dynamic lookup will be necessary. MacWire makes this
easy too:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#272822;background-color:#fafafa;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-scala" data-lang="scala"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#00a8c8"&gt;val&lt;/span&gt; &lt;span style="color:#111"&gt;wiring&lt;/span&gt; &lt;span style="color:#00a8c8"&gt;=&lt;/span&gt; &lt;span style="color:#00a8c8"&gt;new&lt;/span&gt; &lt;span style="color:#75af00"&gt;Wiring&lt;/span&gt;&lt;span style="color:#f92672"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#00a8c8"&gt;val&lt;/span&gt; &lt;span style="color:#111"&gt;appClass&lt;/span&gt; &lt;span style="color:#00a8c8"&gt;=&lt;/span&gt; &lt;span style="color:#111"&gt;classOf&lt;/span&gt;&lt;span style="color:#f92672"&gt;[&lt;/span&gt;&lt;span style="color:#00a8c8"&gt;Application&lt;/span&gt;&lt;span style="color:#f92672"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#111"&gt;wiredInModule&lt;/span&gt;&lt;span style="color:#f92672"&gt;(&lt;/span&gt;&lt;span style="color:#111"&gt;wiring&lt;/span&gt;&lt;span style="color:#f92672"&gt;).&lt;/span&gt;&lt;span style="color:#111"&gt;lookupSingleOrThrow&lt;/span&gt;&lt;span style="color:#f92672"&gt;(&lt;/span&gt;&lt;span style="color:#111"&gt;appClass&lt;/span&gt;&lt;span style="color:#f92672"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="putting-it-all-together"&gt;Putting it all together&lt;/h2&gt;
&lt;p&gt;Finally, if we have a &lt;code&gt;Wiring&lt;/code&gt; class such as the one described above, we simply
have modify our &lt;code&gt;Global#getControllerInstance&lt;/code&gt; method to use it when building
our controller instances:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#272822;background-color:#fafafa;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-scala" data-lang="scala"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#00a8c8"&gt;object&lt;/span&gt; &lt;span style="color:#75af00"&gt;Global&lt;/span&gt; &lt;span style="color:#00a8c8"&gt;extends&lt;/span&gt; &lt;span style="color:#75af00"&gt;GlobalSettings&lt;/span&gt; &lt;span style="color:#f92672"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#00a8c8"&gt;override&lt;/span&gt; &lt;span style="color:#00a8c8"&gt;def&lt;/span&gt; &lt;span style="color:#111"&gt;getControllerInstance&lt;/span&gt;&lt;span style="color:#f92672"&gt;[&lt;/span&gt;&lt;span style="color:#00a8c8"&gt;A&lt;/span&gt;&lt;span style="color:#f92672"&gt;](&lt;/span&gt;&lt;span style="color:#111"&gt;controllerClass&lt;/span&gt;&lt;span style="color:#00a8c8"&gt;:&lt;/span&gt; &lt;span style="color:#00a8c8"&gt;Class&lt;/span&gt;&lt;span style="color:#f92672"&gt;[&lt;/span&gt;&lt;span style="color:#00a8c8"&gt;A&lt;/span&gt;&lt;span style="color:#f92672"&gt;])&lt;/span&gt;&lt;span style="color:#00a8c8"&gt;:&lt;/span&gt; &lt;span style="color:#00a8c8"&gt;A&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#f92672"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#111"&gt;wiredInModule&lt;/span&gt;&lt;span style="color:#f92672"&gt;(&lt;/span&gt;&lt;span style="color:#00a8c8"&gt;new&lt;/span&gt; &lt;span style="color:#75af00"&gt;Wiring&lt;/span&gt;&lt;span style="color:#f92672"&gt;).&lt;/span&gt;&lt;span style="color:#111"&gt;lookupSingleOrThrow&lt;/span&gt;&lt;span style="color:#f92672"&gt;(&lt;/span&gt;&lt;span style="color:#111"&gt;controllerClass&lt;/span&gt;&lt;span style="color:#f92672"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Notice that we&amp;rsquo;re building a new instance of &lt;code&gt;Wiring&lt;/code&gt; at every request. This
will ensure that the returned controller and its dependencies will all be scoped
to a single request. Unnecessary components won&amp;rsquo;t be constructed as long as they
are registered in &lt;code&gt;lazy val&lt;/code&gt; attributes.&lt;/p&gt;</content></entry><entry><title>Database Isolation for Tests in Play Framework</title><link href="https://www.pmatiello.me/posts/2015-01-03-database-isolation-for-tests-in-play-framework/"/><id>https://www.pmatiello.me/posts/2015-01-03-database-isolation-for-tests-in-play-framework/</id><updated>2015-01-03T19:00:00+00:00</updated><published>2015-01-03T19:00:00+00:00</published><content type="html">&lt;p&gt;&lt;a href="https://www.playframework.com"&gt;Play Framework&lt;/a&gt; provides decent support for unit
and functional tests. Tests using the &lt;code&gt;WithApplication&lt;/code&gt;, &lt;code&gt;WithServer&lt;/code&gt; or the
&lt;code&gt;WithBrowser&lt;/code&gt; abstract classes will bootstrap your application so that
configurations are loaded and databases connections are available. Yet, nothing
is provided out of the box to ensure that database changes made during the
execution of a test will not leak into other tests or into the development
environment.&lt;/p&gt;
&lt;h2 id="about-play-slick-and-specs2"&gt;About Play, Slick and specs2&lt;/h2&gt;
&lt;p&gt;Here, we&amp;rsquo;ll be using &lt;a href="http://slick.typesafe.com"&gt;Slick&lt;/a&gt; for persistence
and &lt;a href="http://etorreborre.github.io/specs2/"&gt;specs2&lt;/a&gt; as testing framework, but the
general idea should apply to different libraries without any major changes. The
use of these libraries with Play is outside the scope of this post, but these
links should do a good job at introducing the subject:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.playframework.com/documentation/2.3.x/ScalaTestingWithSpecs2"&gt;Testing your application with specs2&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.playframework.com/documentation/2.3.x/ScalaFunctionalTestingWithSpecs2"&gt;Writing functional tests with specs2&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/playframework/play-slick"&gt;playframework/play-slick&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="isolating-the-test-database-from-the-development-database"&gt;Isolating the test database from the development database&lt;/h2&gt;
&lt;p&gt;The first thing to do is to make our tests run in a different database than the
one we use for developing the application. This will ensure that changes to the
data in the database performed during the execution of the tests do not disturb
the data necessary for developing the application.&lt;/p&gt;
&lt;p&gt;In
a &lt;a href="/2014/12/using-a-different-configuration-file-when-running-tests-in-a-play-project.html"&gt;previous post&lt;/a&gt;,
I&amp;rsquo;ve described one possible approach for that. It envolves using a surrogate
configuration file, with a different database configuration, and
configuring &lt;a href="https://typesafe.com/community/core-tools/activator-and-sbt"&gt;SBT&lt;/a&gt;
to instruct Play to load this file instead of the regular &lt;code&gt;application.conf&lt;/code&gt;
when executing tests.&lt;/p&gt;
&lt;h2 id="isolating-tests-from-each-other"&gt;Isolating tests from each other&lt;/h2&gt;
&lt;p&gt;Once that we have distinct databases for testing and development, it&amp;rsquo;s time to
isolate the tests from each other so that the success or failure of them do not
depend on which tests were run and in which order.&lt;/p&gt;
&lt;p&gt;The idea here is to have a &lt;code&gt;DatabaseIsolation&lt;/code&gt; trait that can be composed with
the &lt;code&gt;WithApplication&lt;/code&gt;, &lt;code&gt;WithServer&lt;/code&gt; and &lt;code&gt;WithBrowser&lt;/code&gt; abstract classes. It
should empty every table in the database before each test is run. Here&amp;rsquo;s what a
test should look like when this trait is used:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#272822;background-color:#fafafa;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-scala" data-lang="scala"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#d88200"&gt;&amp;#34;do stuff using the database&amp;#34;&lt;/span&gt; &lt;span style="color:#111"&gt;in&lt;/span&gt; &lt;span style="color:#00a8c8"&gt;new&lt;/span&gt; &lt;span style="color:#75af00"&gt;WithApplication&lt;/span&gt; &lt;span style="color:#00a8c8"&gt;with&lt;/span&gt; &lt;span style="color:#75af00"&gt;DatabaseIsolation&lt;/span&gt; &lt;span style="color:#f92672"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75af00"&gt;DB&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;&lt;span style="color:#111"&gt;withTransaction&lt;/span&gt; &lt;span style="color:#f92672"&gt;{&lt;/span&gt; &lt;span style="color:#00a8c8"&gt;implicit&lt;/span&gt; &lt;span style="color:#111"&gt;session&lt;/span&gt; &lt;span style="color:#00a8c8"&gt;=&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This trait can be implemented as an &lt;em&gt;around&lt;/em&gt; scope. Notice the &lt;code&gt;prepareDatabase&lt;/code&gt;
method which is responsible for clearing the database. Its implementation will,
of course, vary depending of the project and persistence solution in use.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#272822;background-color:#fafafa;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-scala" data-lang="scala"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#00a8c8"&gt;trait&lt;/span&gt; &lt;span style="color:#75af00"&gt;DatabaseIsolation&lt;/span&gt; &lt;span style="color:#00a8c8"&gt;extends&lt;/span&gt; &lt;span style="color:#75af00"&gt;Around&lt;/span&gt; &lt;span style="color:#00a8c8"&gt;with&lt;/span&gt; &lt;span style="color:#75af00"&gt;Scope&lt;/span&gt; &lt;span style="color:#f92672"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#00a8c8"&gt;abstract&lt;/span&gt; &lt;span style="color:#00a8c8"&gt;override&lt;/span&gt; &lt;span style="color:#00a8c8"&gt;def&lt;/span&gt; &lt;span style="color:#111"&gt;around&lt;/span&gt;&lt;span style="color:#f92672"&gt;[&lt;/span&gt;&lt;span style="color:#00a8c8"&gt;T:&lt;/span&gt; &lt;span style="color:#00a8c8"&gt;AsResult&lt;/span&gt;&lt;span style="color:#f92672"&gt;](&lt;/span&gt;&lt;span style="color:#111"&gt;t&lt;/span&gt;&lt;span style="color:#00a8c8"&gt;:&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&amp;gt;&lt;/span&gt; &lt;span style="color:#111"&gt;T&lt;/span&gt;&lt;span style="color:#f92672"&gt;)&lt;/span&gt;&lt;span style="color:#00a8c8"&gt;:&lt;/span&gt; &lt;span style="color:#00a8c8"&gt;Result&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#f92672"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#00a8c8"&gt;super&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;&lt;span style="color:#111"&gt;around&lt;/span&gt; &lt;span style="color:#f92672"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#00a8c8"&gt;import&lt;/span&gt; &lt;span style="color:#111"&gt;play.api.Play.current&lt;/span&gt; &lt;span style="color:#75715e"&gt;// Put implicit Play application in scope
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75af00"&gt;DB&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;&lt;span style="color:#111"&gt;withTransaction&lt;/span&gt; &lt;span style="color:#f92672"&gt;{&lt;/span&gt; &lt;span style="color:#00a8c8"&gt;implicit&lt;/span&gt; &lt;span style="color:#111"&gt;session&lt;/span&gt; &lt;span style="color:#00a8c8"&gt;=&amp;gt;&lt;/span&gt; &lt;span style="color:#111"&gt;prepareDatabase&lt;/span&gt; &lt;span style="color:#f92672"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#111"&gt;t&lt;/span&gt; &lt;span style="color:#75715e"&gt;// Execute test
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#00a8c8"&gt;protected&lt;/span&gt; &lt;span style="color:#00a8c8"&gt;def&lt;/span&gt; &lt;span style="color:#111"&gt;prepareDatabase&lt;/span&gt;&lt;span style="color:#f92672"&gt;(&lt;/span&gt;&lt;span style="color:#00a8c8"&gt;implicit&lt;/span&gt; &lt;span style="color:#111"&gt;session&lt;/span&gt;&lt;span style="color:#00a8c8"&gt;:&lt;/span&gt; &lt;span style="color:#00a8c8"&gt;Session&lt;/span&gt;&lt;span style="color:#f92672"&gt;)&lt;/span&gt;&lt;span style="color:#00a8c8"&gt;:&lt;/span&gt; &lt;span style="color:#00a8c8"&gt;Unit&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#f92672"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;(&lt;/span&gt;&lt;span style="color:#75af00"&gt;Schema&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;&lt;span style="color:#111"&gt;someTable&lt;/span&gt; &lt;span style="color:#00a8c8"&gt;:&lt;/span&gt;&lt;span style="color:#00a8c8"&gt;:&lt;/span&gt; &lt;span style="color:#00a8c8"&gt;Schema.otherTable&lt;/span&gt; &lt;span style="color:#00a8c8"&gt;::&lt;/span&gt; &lt;span style="color:#00a8c8"&gt;Nil&lt;/span&gt;&lt;span style="color:#f92672"&gt;).&lt;/span&gt;&lt;span style="color:#111"&gt;foreach&lt;/span&gt;&lt;span style="color:#f92672"&gt;(&lt;/span&gt;&lt;span style="color:#00a8c8"&gt;_&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;&lt;span style="color:#111"&gt;delete&lt;/span&gt;&lt;span style="color:#f92672"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;In tests, Play&amp;rsquo;s default behaviour is to apply
the &lt;a href="https://www.playframework.com/documentation/2.3.x/Evolutions"&gt;database evolutions&lt;/a&gt;
automatically when necessary, so we don&amp;rsquo;t have to worry about that here.&lt;/p&gt;
&lt;h2 id="seeding-the-database-with-test-data"&gt;Seeding the database with test data&lt;/h2&gt;
&lt;p&gt;At some tests, we may want to have a minimal database with some predefined data
instead of an empty one. Given a &lt;code&gt;Seed&lt;/code&gt; object capable of filling the database
with such data, we can define a &lt;code&gt;SeededDatabase&lt;/code&gt; trait as a child trait of
&lt;code&gt;DatabaseIsolation&lt;/code&gt;, described above. It should be able to, before each test,
empty the database just like before but also add some data to it leaving the
tables in a predictable state.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#272822;background-color:#fafafa;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-scala" data-lang="scala"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#00a8c8"&gt;trait&lt;/span&gt; &lt;span style="color:#75af00"&gt;SeededDatabase&lt;/span&gt; &lt;span style="color:#00a8c8"&gt;extends&lt;/span&gt; &lt;span style="color:#75af00"&gt;DatabaseIsolation&lt;/span&gt; &lt;span style="color:#f92672"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#00a8c8"&gt;abstract&lt;/span&gt; &lt;span style="color:#00a8c8"&gt;override&lt;/span&gt; &lt;span style="color:#00a8c8"&gt;protected&lt;/span&gt; &lt;span style="color:#00a8c8"&gt;def&lt;/span&gt; &lt;span style="color:#111"&gt;prepareDatabase&lt;/span&gt;&lt;span style="color:#f92672"&gt;(&lt;/span&gt;&lt;span style="color:#00a8c8"&gt;implicit&lt;/span&gt; &lt;span style="color:#111"&gt;session&lt;/span&gt;&lt;span style="color:#00a8c8"&gt;:&lt;/span&gt; &lt;span style="color:#00a8c8"&gt;Session&lt;/span&gt;&lt;span style="color:#f92672"&gt;)&lt;/span&gt;&lt;span style="color:#00a8c8"&gt;:&lt;/span&gt; &lt;span style="color:#00a8c8"&gt;Unit&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#f92672"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#00a8c8"&gt;super&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;&lt;span style="color:#111"&gt;prepareDatabase&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75af00"&gt;Seed&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;&lt;span style="color:#111"&gt;seed&lt;/span&gt; &lt;span style="color:#75715e"&gt;// Fill the database with some test data
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This trait can be used like the other:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#272822;background-color:#fafafa;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-scala" data-lang="scala"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#d88200"&gt;&amp;#34;do stuff using the database&amp;#34;&lt;/span&gt; &lt;span style="color:#111"&gt;in&lt;/span&gt; &lt;span style="color:#00a8c8"&gt;new&lt;/span&gt; &lt;span style="color:#75af00"&gt;WithApplication&lt;/span&gt; &lt;span style="color:#00a8c8"&gt;with&lt;/span&gt; &lt;span style="color:#75af00"&gt;SeededDatabase&lt;/span&gt; &lt;span style="color:#f92672"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75af00"&gt;DB&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;&lt;span style="color:#111"&gt;withTransaction&lt;/span&gt; &lt;span style="color:#f92672"&gt;{&lt;/span&gt; &lt;span style="color:#00a8c8"&gt;implicit&lt;/span&gt; &lt;span style="color:#111"&gt;session&lt;/span&gt; &lt;span style="color:#00a8c8"&gt;=&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="conclusion"&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;Proper database isolation for tests is important to avoid spurious successes
(which hide problems in the tested code) or failures (which reduce our trust in
the tests). It also helps us to avoid seemingly non-deterministic behaviour in
our tests and provides us with a predictable, clean state for our tests to
execute upon, making them simpler to reason about.&lt;/p&gt;
&lt;p&gt;Play provides only basic database support (configuration, connection pools,
evolutions) and it doesn&amp;rsquo;t prescribe any specific persistence library. Although
this provides a lot of flexibility, it also means that the framework can&amp;rsquo;t do
much to isolate the database during the tests. Yet, as we can see, it&amp;rsquo;s possible
to implement such isolation very easily, cleanly and without any changes to the
production code.&lt;/p&gt;</content></entry><entry><title>Using a different configuration file when running tests in a Play project</title><link href="https://www.pmatiello.me/posts/2014-12-26-using-a-different-configuration-file-when-running-tests-in-a-play-project/"/><id>https://www.pmatiello.me/posts/2014-12-26-using-a-different-configuration-file-when-running-tests-in-a-play-project/</id><updated>2014-12-26T11:00:00+00:00</updated><published>2014-12-26T11:00:00+00:00</published><content type="html">&lt;p&gt;&lt;a href="https://www.playframework.com"&gt;Play Framework&lt;/a&gt;, as of version 2.3.x, typically
loads the configuration for your application from &lt;code&gt;conf/application.conf&lt;/code&gt;.
Although it works as expected, it doesn&amp;rsquo;t allow for different configurations to
be used in different environments unless the file is replaced. This is specially
inconvenient when running tests directly
from &lt;a href="https://typesafe.com/community/core-tools/activator-and-sbt"&gt;Activator&lt;/a&gt;
since these tests will be executed against the same database used for running
the application in development mode.&lt;/p&gt;
&lt;p&gt;Luckily, &lt;a href="https://github.com/typesafehub/config"&gt;Typesafe Config&lt;/a&gt;
and &lt;a href="https://typesafe.com/community/core-tools/activator-and-sbt"&gt;SBT&lt;/a&gt; provide
all that is necessary to work around this issue cleanly.&lt;/p&gt;
&lt;p&gt;First create a configuration file, say &lt;code&gt;conf/application.test.conf&lt;/code&gt;, for the
Test mode. This file will inherit all settings defined in the main configuration
file through the &lt;code&gt;include&lt;/code&gt; statement, but will also override the values that
should be different when running tests.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;include &amp;#34;application.conf&amp;#34;
db.default.driver=&amp;#34;org.postgresql.Driver&amp;#34;
db.default.url=&amp;#34;jdbc:postgresql://localhost/project_name_test&amp;#34;
db.default.user=&amp;#34;username&amp;#34;
db.default.password=&amp;#34;password&amp;#34;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Then, configure SBT to instruct Play to load this file when running in Test mode
by adding the line below to your &lt;code&gt;build.sbt&lt;/code&gt;.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#272822;background-color:#fafafa;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-scala" data-lang="scala"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#111"&gt;javaOptions&lt;/span&gt; &lt;span style="color:#111"&gt;in&lt;/span&gt; &lt;span style="color:#75af00"&gt;Test&lt;/span&gt; &lt;span style="color:#f92672"&gt;+=&lt;/span&gt; &lt;span style="color:#d88200"&gt;&amp;#34;-Dconfig.file=conf/application.test.conf&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This should be enough.&lt;/p&gt;</content></entry><entry><title>Futures in Scala</title><link href="https://www.pmatiello.me/posts/2013-10-28-futures-in-scala/"/><id>https://www.pmatiello.me/posts/2013-10-28-futures-in-scala/</id><updated>2013-10-28T21:00:00+00:00</updated><published>2013-10-28T21:00:00+00:00</published><content type="html">&lt;p&gt;Scala 2.10
introduced &lt;a href="http://docs.scala-lang.org/overviews/core/futures.html"&gt;futures&lt;/a&gt; as
a convenient abstraction for concurrent programming. Using futures, one can
perform a number of computations in parallel for which the result is expected to
be available, at some point, in these &lt;code&gt;Future&lt;/code&gt; objects.&lt;/p&gt;
&lt;p&gt;A result in a &lt;code&gt;Future&lt;/code&gt; can be easily retrieved without blocking the execution
flow by setting a callback to be invoked once it&amp;rsquo;s ready:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#272822;background-color:#fafafa;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-scala" data-lang="scala"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#00a8c8"&gt;val&lt;/span&gt; &lt;span style="color:#111"&gt;fut&lt;/span&gt; &lt;span style="color:#00a8c8"&gt;=&lt;/span&gt; &lt;span style="color:#111"&gt;future&lt;/span&gt; &lt;span style="color:#f92672"&gt;{&lt;/span&gt; &lt;span style="color:#111"&gt;slowComputation&lt;/span&gt; &lt;span style="color:#f92672"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#111"&gt;fut&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;&lt;span style="color:#111"&gt;onSuccess&lt;/span&gt; &lt;span style="color:#f92672"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#00a8c8"&gt;case&lt;/span&gt; &lt;span style="color:#111"&gt;result&lt;/span&gt; &lt;span style="color:#00a8c8"&gt;=&amp;gt;&lt;/span&gt; &lt;span style="color:#111"&gt;useSuccess&lt;/span&gt;&lt;span style="color:#f92672"&gt;(&lt;/span&gt;&lt;span style="color:#111"&gt;result&lt;/span&gt;&lt;span style="color:#f92672"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This callback is guaranteed to be executed after the future completes
successfully. It&amp;rsquo;s also possible request a callback to be executed if the future
fails with an exception:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#272822;background-color:#fafafa;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-scala" data-lang="scala"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#111"&gt;fut&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;&lt;span style="color:#111"&gt;onFailure&lt;/span&gt; &lt;span style="color:#f92672"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#00a8c8"&gt;case&lt;/span&gt; &lt;span style="color:#111"&gt;exception&lt;/span&gt; &lt;span style="color:#00a8c8"&gt;=&amp;gt;&lt;/span&gt; &lt;span style="color:#111"&gt;useError&lt;/span&gt;&lt;span style="color:#f92672"&gt;(&lt;/span&gt;&lt;span style="color:#111"&gt;exception&lt;/span&gt;&lt;span style="color:#f92672"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Alternativelly, a single callback can be defined for handling both success and
failure cases:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#272822;background-color:#fafafa;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-scala" data-lang="scala"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#111"&gt;fut&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;&lt;span style="color:#111"&gt;onComplete&lt;/span&gt; &lt;span style="color:#f92672"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#00a8c8"&gt;case&lt;/span&gt; &lt;span style="color:#75af00"&gt;Success&lt;/span&gt;&lt;span style="color:#f92672"&gt;(&lt;/span&gt;&lt;span style="color:#111"&gt;result&lt;/span&gt;&lt;span style="color:#f92672"&gt;)&lt;/span&gt; &lt;span style="color:#00a8c8"&gt;=&amp;gt;&lt;/span&gt; &lt;span style="color:#111"&gt;useSuccess&lt;/span&gt;&lt;span style="color:#f92672"&gt;(&lt;/span&gt;&lt;span style="color:#111"&gt;result&lt;/span&gt;&lt;span style="color:#f92672"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#00a8c8"&gt;case&lt;/span&gt; &lt;span style="color:#75af00"&gt;Failure&lt;/span&gt;&lt;span style="color:#f92672"&gt;(&lt;/span&gt;&lt;span style="color:#111"&gt;exception&lt;/span&gt;&lt;span style="color:#f92672"&gt;)&lt;/span&gt; &lt;span style="color:#00a8c8"&gt;=&amp;gt;&lt;/span&gt; &lt;span style="color:#111"&gt;useError&lt;/span&gt;&lt;span style="color:#f92672"&gt;(&lt;/span&gt;&lt;span style="color:#111"&gt;exception&lt;/span&gt;&lt;span style="color:#f92672"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Finally, if blocking is acceptable, one can simply wait until the value is
available:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#272822;background-color:#fafafa;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-scala" data-lang="scala"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75af00"&gt;Await&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;&lt;span style="color:#111"&gt;result&lt;/span&gt;&lt;span style="color:#f92672"&gt;(&lt;/span&gt;&lt;span style="color:#111"&gt;fut&lt;/span&gt;&lt;span style="color:#f92672"&gt;,&lt;/span&gt; &lt;span style="color:#75af00"&gt;Duration&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;&lt;span style="color:#75af00"&gt;Inf&lt;/span&gt;&lt;span style="color:#f92672"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This isn&amp;rsquo;t what you probably want, though.&lt;/p&gt;
&lt;h2 id="some-convenient-operations"&gt;Some convenient operations&lt;/h2&gt;
&lt;p&gt;Even though futures are easier to handle than most other approaches to
concurrency, they are not really a transparent solution. In fact, sometimes they
can be a little tricky to use while still retaining its advantages. For
instance, how does one, holding a future for some value, obtains a modified
version of this value without waiting for its evaluation?&lt;/p&gt;
&lt;p&gt;Fortunatelly, the API for futures in Scala is quite helpful in cases like this.&lt;/p&gt;
&lt;h3 id="from-future-of-value-to-future-of-modified-value"&gt;From future of value to future of modified value&lt;/h3&gt;
&lt;p&gt;Given a future &lt;code&gt;fut&lt;/code&gt; for a value &lt;code&gt;v&lt;/code&gt; and a function &lt;code&gt;f&lt;/code&gt;, it&amp;rsquo;s quite
straightforward to obtain a new future for a value &lt;code&gt;f(v)&lt;/code&gt; without waiting for
&lt;code&gt;v&lt;/code&gt; to be evaluated:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#272822;background-color:#fafafa;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-scala" data-lang="scala"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#111"&gt;fut&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;&lt;span style="color:#111"&gt;map&lt;/span&gt;&lt;span style="color:#f92672"&gt;(&lt;/span&gt;&lt;span style="color:#111"&gt;f&lt;/span&gt;&lt;span style="color:#f92672"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="from-list-of-futures-to-future-of-list"&gt;From list of futures to future of list&lt;/h3&gt;
&lt;p&gt;It&amp;rsquo;s possible turn a list of futures into a future of a list for the same
values. That is, given a &lt;code&gt;List&lt;/code&gt; of &lt;code&gt;Future&lt;/code&gt; objects
&lt;code&gt;List(Future(v1), Future(v2), ...)&lt;/code&gt;, it is possible to produce a &lt;code&gt;Future&lt;/code&gt; object
such as &lt;code&gt;Future(List(v1, v2, ...))&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#272822;background-color:#fafafa;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-scala" data-lang="scala"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75af00"&gt;Future&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;&lt;span style="color:#111"&gt;sequence&lt;/span&gt;&lt;span style="color:#f92672"&gt;(&lt;/span&gt;&lt;span style="color:#111"&gt;list&lt;/span&gt;&lt;span style="color:#f92672"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="reduce-list-of-futures-to-future-value"&gt;Reduce list of futures to future value&lt;/h3&gt;
&lt;p&gt;It&amp;rsquo;s also possible to take a list of futures &lt;code&gt;List(Future(v1), Future(v2), ...)&lt;/code&gt;
and a reduction function &lt;code&gt;f&lt;/code&gt; to produce a new future containing
&lt;code&gt;List(v1, v2, ...).reduce(f)&lt;/code&gt; as value:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#272822;background-color:#fafafa;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-scala" data-lang="scala"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75af00"&gt;Future&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;&lt;span style="color:#111"&gt;reduce&lt;/span&gt;&lt;span style="color:#f92672"&gt;(&lt;/span&gt;&lt;span style="color:#111"&gt;list&lt;/span&gt;&lt;span style="color:#f92672"&gt;)(&lt;/span&gt;&lt;span style="color:#111"&gt;f&lt;/span&gt;&lt;span style="color:#f92672"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="reduce-future-of-list-to-future-value"&gt;Reduce future of list to future value&lt;/h3&gt;
&lt;p&gt;Finally, given the future of a list &lt;code&gt;Future(List(v1, v2, ...))&lt;/code&gt; and a reduction
function &lt;code&gt;f&lt;/code&gt;, a new future containing &lt;code&gt;List(v1, v2, ...).reduce(f)&lt;/code&gt; as value can
be produced:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#272822;background-color:#fafafa;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-scala" data-lang="scala"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#111"&gt;fut&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;&lt;span style="color:#111"&gt;map&lt;/span&gt; &lt;span style="color:#f92672"&gt;{&lt;/span&gt; &lt;span style="color:#111"&gt;list&lt;/span&gt; &lt;span style="color:#00a8c8"&gt;=&amp;gt;&lt;/span&gt; &lt;span style="color:#111"&gt;list&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;&lt;span style="color:#111"&gt;reduce&lt;/span&gt;&lt;span style="color:#f92672"&gt;(&lt;/span&gt;&lt;span style="color:#111"&gt;f&lt;/span&gt;&lt;span style="color:#f92672"&gt;)&lt;/span&gt; &lt;span style="color:#f92672"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</content></entry><entry><title>A few tricks for writing faster Ruby code</title><link href="https://www.pmatiello.me/posts/2013-07-09-a-few-tricks-for-writing-faster-ruby-code/"/><id>https://www.pmatiello.me/posts/2013-07-09-a-few-tricks-for-writing-faster-ruby-code/</id><updated>2013-07-09T12:00:00+00:00</updated><published>2013-07-09T12:00:00+00:00</published><content type="html">&lt;p&gt;Recently, I was busy at &lt;a href="http://www.baby.com.br"&gt;work&lt;/a&gt; trying to make some Ruby
code we&amp;rsquo;ve had written run faster. This is somewhat outside my zone of confort:
I&amp;rsquo;m mostly concerned about design, correctness, testability, etc, and most of
the time, my concerns about performance are restricted to proper choice of
algorithms, data structures and caching strategies. Although I&amp;rsquo;ve done my share
of profiling and performance improvements on Java applications, this was my
first time doing something like that in Ruby. And as I haven&amp;rsquo;t found much on
this subject on Google, I decided to share here some of the stuff that proved
themselves helpful to my problem.&lt;/p&gt;
&lt;h2 id="the-benchmark-module"&gt;The benchmark module&lt;/h2&gt;
&lt;p&gt;The &lt;code&gt;benchmark&lt;/code&gt; module, bundled with Ruby standard library, is an useful tool
for deciding among candidate implementations based on performance. Basically,
the module &amp;ldquo;provides methods to measure and report the time used to execute Ruby
code&amp;rdquo;
(&lt;a href="http://www.ruby-doc.org/stdlib-1.9.3/libdoc/benchmark/rdoc/Benchmark.html"&gt;source&lt;/a&gt;),
which is what you&amp;rsquo;d want in this situation.&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;Benchmark::bm&lt;/code&gt; method, particularly, is quite convenient. You can setup a
few different implementations, have them run, and then have their execution
times reported. An example follows:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#272822;background-color:#fafafa;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-ruby" data-lang="ruby"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#00a8c8"&gt;Benchmark&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;&lt;span style="color:#111"&gt;bm&lt;/span&gt; &lt;span style="color:#00a8c8"&gt;do&lt;/span&gt; &lt;span style="color:#f92672"&gt;|&lt;/span&gt;&lt;span style="color:#111"&gt;x&lt;/span&gt;&lt;span style="color:#f92672"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#111"&gt;x&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;&lt;span style="color:#111"&gt;report&lt;/span&gt; &lt;span style="color:#d88200"&gt;&amp;#34;Candidate #1&amp;#34;&lt;/span&gt; &lt;span style="color:#00a8c8"&gt;do&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#111"&gt;candiate_one&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#00a8c8"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#111"&gt;x&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;&lt;span style="color:#111"&gt;report&lt;/span&gt; &lt;span style="color:#d88200"&gt;&amp;#34;Candidate #2&amp;#34;&lt;/span&gt; &lt;span style="color:#00a8c8"&gt;do&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#111"&gt;candidate_two&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#00a8c8"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#00a8c8"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The produced output is something along the following format:&lt;/p&gt;
&lt;!-- raw HTML omitted --&gt;
&lt;!-- raw HTML omitted --&gt;
&lt;p&gt;This kind of measuring is unavoidable. First, attempts to improve the
performance of a code may have the opposite effect, making it perform worse.
Second, even tricks known to work well under a specific version of Ruby won&amp;rsquo;t
necessarily have the same effect on a different one.&lt;/p&gt;
&lt;p&gt;Caveat emptor: All benchmarks here were executed under Ruby 1.9.3p385 on a Early
2011 MacBook Pro running OS X Mountain Lion. You may have different results when
running these examples on a different environment.&lt;/p&gt;
&lt;h2 id="embracing-mutability"&gt;Embracing mutability&lt;/h2&gt;
&lt;p&gt;Immutability is, for many good reasons, considered a good practice. It usually
results in cleaner, safer, more elegant code. It avoids a number of problems on
concurrent programs. Yet, unfortunatelly, there may be a performance cost in
avoiding mutable state. We can observe this by comparing the performance of &lt;a href="http://www.ruby-doc.org/core-1.9.3/String.html#method-i-downcase"&gt;
&lt;code&gt;String#downcase&lt;/code&gt;&lt;/a&gt;
and &lt;a href="http://www.ruby-doc.org/core-1.9.3/String.html#method-i-downcase-21"&gt;
&lt;code&gt;String#downcase!&lt;/code&gt;&lt;/a&gt;
against a list of 10 millions different strings. Both methods turn all letters
of the original string into lowercase letters. The former, though, produces a
new string and leaves the original one unchaged. The later performs the
operation in place, modifying the original string.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#272822;background-color:#fafafa;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-ruby" data-lang="ruby"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#111"&gt;list&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#111"&gt;(&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;&lt;span style="color:#f92672"&gt;..&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;10000000&lt;/span&gt;&lt;span style="color:#111"&gt;)&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;&lt;span style="color:#111"&gt;map&lt;/span&gt; &lt;span style="color:#111"&gt;{&lt;/span&gt; &lt;span style="color:#f92672"&gt;|&lt;/span&gt;&lt;span style="color:#111"&gt;i&lt;/span&gt;&lt;span style="color:#f92672"&gt;|&lt;/span&gt; &lt;span style="color:#d88200"&gt;&amp;#34;Lorem ipsum dolor sit amet. &lt;/span&gt;&lt;span style="color:#d88200"&gt;#{&lt;/span&gt;&lt;span style="color:#111"&gt;i&lt;/span&gt;&lt;span style="color:#d88200"&gt;}&lt;/span&gt;&lt;span style="color:#d88200"&gt;&amp;#34;&lt;/span&gt; &lt;span style="color:#111"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#00a8c8"&gt;Benchmark&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;&lt;span style="color:#111"&gt;bm&lt;/span&gt; &lt;span style="color:#00a8c8"&gt;do&lt;/span&gt; &lt;span style="color:#f92672"&gt;|&lt;/span&gt;&lt;span style="color:#111"&gt;x&lt;/span&gt;&lt;span style="color:#f92672"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#111"&gt;x&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;&lt;span style="color:#111"&gt;report&lt;/span&gt; &lt;span style="color:#d88200"&gt;&amp;#34;String#downcase&amp;#34;&lt;/span&gt; &lt;span style="color:#00a8c8"&gt;do&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#111"&gt;list&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;&lt;span style="color:#111"&gt;each&lt;/span&gt; &lt;span style="color:#111"&gt;{&lt;/span&gt; &lt;span style="color:#f92672"&gt;|&lt;/span&gt;&lt;span style="color:#111"&gt;str&lt;/span&gt;&lt;span style="color:#f92672"&gt;|&lt;/span&gt; &lt;span style="color:#111"&gt;str&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;&lt;span style="color:#111"&gt;downcase&lt;/span&gt; &lt;span style="color:#111"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#00a8c8"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#111"&gt;x&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;&lt;span style="color:#111"&gt;report&lt;/span&gt; &lt;span style="color:#d88200"&gt;&amp;#34;String#downcase!&amp;#34;&lt;/span&gt; &lt;span style="color:#00a8c8"&gt;do&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#111"&gt;list&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;&lt;span style="color:#111"&gt;each&lt;/span&gt; &lt;span style="color:#111"&gt;{&lt;/span&gt; &lt;span style="color:#f92672"&gt;|&lt;/span&gt;&lt;span style="color:#111"&gt;str&lt;/span&gt;&lt;span style="color:#f92672"&gt;|&lt;/span&gt; &lt;span style="color:#111"&gt;str&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;&lt;span style="color:#111"&gt;downcase!&lt;/span&gt; &lt;span style="color:#111"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#00a8c8"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#00a8c8"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;!-- raw HTML omitted --&gt;
&lt;!-- raw HTML omitted --&gt;
&lt;p&gt;Clearly, the mutable version is significantly faster — probably because it lacks
the overhead of object construction and memory allocation.&lt;/p&gt;
&lt;h2 id="accepting-different-semantics"&gt;Accepting different semantics&lt;/h2&gt;
&lt;p&gt;Sometimes, some extra performance can be achieved by using solutions that offer
a different, yet still similar, semantics. We can take, for instance, the &lt;a href="http://www.ruby-doc.org/core-1.9.3/Hash.html#method-i-fetch"&gt;
&lt;code&gt;Hash#fetch&lt;/code&gt;&lt;/a&gt;
method. This method kindly retrieves from a hash the value assigned to the given
key. If no value is assigned, the method returns a specified fallback value.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#272822;background-color:#fafafa;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-ruby" data-lang="ruby"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#111"&gt;{&lt;/span&gt;&lt;span style="color:#d88200"&gt;:a&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&amp;gt;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;&lt;span style="color:#111"&gt;,&lt;/span&gt; &lt;span style="color:#d88200"&gt;:b&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&amp;gt;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;&lt;span style="color:#111"&gt;}&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;&lt;span style="color:#111"&gt;fetch&lt;/span&gt;&lt;span style="color:#111"&gt;(&lt;/span&gt;&lt;span style="color:#d88200"&gt;:a&lt;/span&gt;&lt;span style="color:#111"&gt;,&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;&lt;span style="color:#111"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;=&amp;gt;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#111"&gt;{&lt;/span&gt;&lt;span style="color:#d88200"&gt;:a&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&amp;gt;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;&lt;span style="color:#111"&gt;,&lt;/span&gt; &lt;span style="color:#d88200"&gt;:b&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&amp;gt;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;&lt;span style="color:#111"&gt;}&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;&lt;span style="color:#111"&gt;fetch&lt;/span&gt;&lt;span style="color:#111"&gt;(&lt;/span&gt;&lt;span style="color:#d88200"&gt;:c&lt;/span&gt;&lt;span style="color:#111"&gt;,&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;&lt;span style="color:#111"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;=&amp;gt;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;There is a simple alternative solution, using &lt;a href="http://www.ruby-doc.org/core-1.9.3/Hash.html#method-i-5B-5D"&gt;
&lt;code&gt;Hash#[]&lt;/code&gt;&lt;/a&gt;, with
similar semantics, though:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#272822;background-color:#fafafa;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-ruby" data-lang="ruby"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#111"&gt;{&lt;/span&gt;&lt;span style="color:#d88200"&gt;:a&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&amp;gt;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;&lt;span style="color:#111"&gt;,&lt;/span&gt; &lt;span style="color:#d88200"&gt;:b&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&amp;gt;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;&lt;span style="color:#111"&gt;}&lt;/span&gt;&lt;span style="color:#f92672"&gt;[&lt;/span&gt;&lt;span style="color:#d88200"&gt;:a&lt;/span&gt;&lt;span style="color:#f92672"&gt;]&lt;/span&gt; &lt;span style="color:#f92672"&gt;||&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;=&amp;gt;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#111"&gt;{&lt;/span&gt;&lt;span style="color:#d88200"&gt;:a&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&amp;gt;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;&lt;span style="color:#111"&gt;,&lt;/span&gt; &lt;span style="color:#d88200"&gt;:b&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&amp;gt;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;&lt;span style="color:#111"&gt;}&lt;/span&gt;&lt;span style="color:#f92672"&gt;[&lt;/span&gt;&lt;span style="color:#d88200"&gt;:c&lt;/span&gt;&lt;span style="color:#f92672"&gt;]&lt;/span&gt; &lt;span style="color:#f92672"&gt;||&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;=&amp;gt;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;In fact, the &lt;code&gt;hash[key] || fallback&lt;/code&gt; trick is indeed somewhat faster, as this
benchmark shows:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#272822;background-color:#fafafa;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-ruby" data-lang="ruby"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#111"&gt;hash&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#111"&gt;{&lt;/span&gt;&lt;span style="color:#d88200"&gt;:a&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&amp;gt;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;&lt;span style="color:#111"&gt;,&lt;/span&gt; &lt;span style="color:#d88200"&gt;:b&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&amp;gt;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;&lt;span style="color:#111"&gt;,&lt;/span&gt; &lt;span style="color:#d88200"&gt;:c&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&amp;gt;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;3&lt;/span&gt;&lt;span style="color:#111"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#00a8c8"&gt;Benchmark&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;&lt;span style="color:#111"&gt;bm&lt;/span&gt; &lt;span style="color:#00a8c8"&gt;do&lt;/span&gt; &lt;span style="color:#f92672"&gt;|&lt;/span&gt;&lt;span style="color:#111"&gt;x&lt;/span&gt;&lt;span style="color:#f92672"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#111"&gt;x&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;&lt;span style="color:#111"&gt;report&lt;/span&gt; &lt;span style="color:#d88200"&gt;&amp;#34;fetch&amp;#34;&lt;/span&gt; &lt;span style="color:#00a8c8"&gt;do&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ae81ff"&gt;50000000&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;&lt;span style="color:#111"&gt;times&lt;/span&gt; &lt;span style="color:#111"&gt;{&lt;/span&gt; &lt;span style="color:#111"&gt;hash&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;&lt;span style="color:#111"&gt;fetch&lt;/span&gt;&lt;span style="color:#111"&gt;(&lt;/span&gt;&lt;span style="color:#d88200"&gt;:a&lt;/span&gt;&lt;span style="color:#111"&gt;,&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;&lt;span style="color:#111"&gt;)&lt;/span&gt; &lt;span style="color:#111"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#00a8c8"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#111"&gt;x&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;&lt;span style="color:#111"&gt;report&lt;/span&gt; &lt;span style="color:#d88200"&gt;&amp;#34;[] ||&amp;#34;&lt;/span&gt; &lt;span style="color:#00a8c8"&gt;do&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ae81ff"&gt;50000000&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;&lt;span style="color:#111"&gt;times&lt;/span&gt; &lt;span style="color:#111"&gt;{&lt;/span&gt; &lt;span style="color:#111"&gt;hash&lt;/span&gt;&lt;span style="color:#f92672"&gt;[&lt;/span&gt;&lt;span style="color:#d88200"&gt;:a&lt;/span&gt;&lt;span style="color:#f92672"&gt;]&lt;/span&gt; &lt;span style="color:#f92672"&gt;||&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt; &lt;span style="color:#111"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#00a8c8"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#00a8c8"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;!-- raw HTML omitted --&gt;
&lt;!-- raw HTML omitted --&gt;
&lt;p&gt;It&amp;rsquo;s worth remembering, though, that even though the semantics of these two
solutions are similar, in some cases they produce different results:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#272822;background-color:#fafafa;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-ruby" data-lang="ruby"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#111"&gt;{&lt;/span&gt;&lt;span style="color:#d88200"&gt;:key&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&amp;gt;&lt;/span&gt; &lt;span style="color:#00a8c8"&gt;false&lt;/span&gt;&lt;span style="color:#111"&gt;}&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;&lt;span style="color:#111"&gt;fetch&lt;/span&gt;&lt;span style="color:#111"&gt;(&lt;/span&gt;&lt;span style="color:#d88200"&gt;:key&lt;/span&gt;&lt;span style="color:#111"&gt;,&lt;/span&gt; &lt;span style="color:#00a8c8"&gt;true&lt;/span&gt;&lt;span style="color:#111"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;=&amp;gt;&lt;/span&gt; &lt;span style="color:#00a8c8"&gt;false&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#111"&gt;{&lt;/span&gt;&lt;span style="color:#d88200"&gt;:key&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&amp;gt;&lt;/span&gt; &lt;span style="color:#00a8c8"&gt;false&lt;/span&gt;&lt;span style="color:#111"&gt;}&lt;/span&gt;&lt;span style="color:#f92672"&gt;[&lt;/span&gt;&lt;span style="color:#d88200"&gt;:key&lt;/span&gt;&lt;span style="color:#f92672"&gt;]&lt;/span&gt; &lt;span style="color:#f92672"&gt;||&lt;/span&gt; &lt;span style="color:#00a8c8"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;=&amp;gt;&lt;/span&gt; &lt;span style="color:#00a8c8"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;I suppose that a decision regarding the use this optimization requires both
careful measuring and reflection on whether the performance improvement is worth
the risks involved.&lt;/p&gt;
&lt;h2 id="memoization"&gt;Memoization&lt;/h2&gt;
&lt;p&gt;&lt;a href="http://en.wikipedia.org/wiki/Memoization"&gt;Memoization&lt;/a&gt; is an old and well-know
technique to improve the performance of a program by storing the result of
function calls so that repeated calls to the same function with previously
processed parameters can just be fetched from memory instead of being
recalculated.&lt;/p&gt;
&lt;p&gt;A classical example is the algorithm for producing
the &lt;a href="http://en.wikipedia.org/wiki/Fibonacci_number"&gt;Fibonacci sequence&lt;/a&gt;:&lt;/p&gt;
&lt;p&gt;The mathematical definition for the &lt;em&gt;Fn&lt;/em&gt; sequence of Fibonacci numbers is:&lt;/p&gt;
&lt;!-- raw HTML omitted --&gt;
&lt;!-- raw HTML omitted --&gt;
&lt;p&gt;This definition has a very straightforward translation to Ruby:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#272822;background-color:#fafafa;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-ruby" data-lang="ruby"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#00a8c8"&gt;def&lt;/span&gt; &lt;span style="color:#75af00"&gt;fibonacci&lt;/span&gt;&lt;span style="color:#111"&gt;(&lt;/span&gt;&lt;span style="color:#111"&gt;n&lt;/span&gt;&lt;span style="color:#111"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#111"&gt;n&lt;/span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt; &lt;span style="color:#f92672"&gt;?&lt;/span&gt; &lt;span style="color:#111"&gt;n&lt;/span&gt; &lt;span style="color:#111"&gt;:&lt;/span&gt; &lt;span style="color:#111"&gt;fibonacci&lt;/span&gt;&lt;span style="color:#111"&gt;(&lt;/span&gt;&lt;span style="color:#111"&gt;n&lt;/span&gt;&lt;span style="color:#f92672"&gt;-&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;&lt;span style="color:#111"&gt;)&lt;/span&gt; &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#111"&gt;fibonacci&lt;/span&gt;&lt;span style="color:#111"&gt;(&lt;/span&gt;&lt;span style="color:#111"&gt;n&lt;/span&gt;&lt;span style="color:#f92672"&gt;-&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;&lt;span style="color:#111"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#00a8c8"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This is cute, but really slow. A calculation of &lt;code&gt;fibonacci(5)&lt;/code&gt;, for instance,
would involve the following calls:&lt;/p&gt;
&lt;!-- raw HTML omitted --&gt;
&lt;!-- raw HTML omitted --&gt;
&lt;p&gt;Here, we have a number of repeated calls. This isn&amp;rsquo;t so bad for &lt;code&gt;n&lt;/code&gt; = 5, but
this effect is much, much worse for higher values of &lt;code&gt;n&lt;/code&gt;. We can avoid all this
repetition with a memoized version of the same algorithm:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#272822;background-color:#fafafa;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-ruby" data-lang="ruby"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#00a8c8"&gt;FIBONACCI_CACHE&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#111"&gt;{}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#00a8c8"&gt;def&lt;/span&gt; &lt;span style="color:#75af00"&gt;memoized_fibonacci&lt;/span&gt;&lt;span style="color:#111"&gt;(&lt;/span&gt;&lt;span style="color:#111"&gt;n&lt;/span&gt;&lt;span style="color:#111"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#00a8c8"&gt;FIBONACCI_CACHE&lt;/span&gt;&lt;span style="color:#f92672"&gt;[&lt;/span&gt;&lt;span style="color:#111"&gt;n&lt;/span&gt;&lt;span style="color:#f92672"&gt;]&lt;/span&gt; &lt;span style="color:#f92672"&gt;||=&lt;/span&gt; &lt;span style="color:#111"&gt;(&lt;/span&gt;&lt;span style="color:#111"&gt;n&lt;/span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt; &lt;span style="color:#f92672"&gt;?&lt;/span&gt; &lt;span style="color:#111"&gt;n&lt;/span&gt; &lt;span style="color:#111"&gt;:&lt;/span&gt; &lt;span style="color:#111"&gt;memoized_fibonacci&lt;/span&gt;&lt;span style="color:#111"&gt;(&lt;/span&gt;&lt;span style="color:#111"&gt;n&lt;/span&gt;&lt;span style="color:#f92672"&gt;-&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;&lt;span style="color:#111"&gt;)&lt;/span&gt; &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#111"&gt;memoized_fibonacci&lt;/span&gt;&lt;span style="color:#111"&gt;(&lt;/span&gt;&lt;span style="color:#111"&gt;n&lt;/span&gt;&lt;span style="color:#f92672"&gt;-&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;&lt;span style="color:#111"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#00a8c8"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Here are the running times for the original and memoized versions for &lt;code&gt;n&lt;/code&gt; = 40:&lt;/p&gt;
&lt;!-- raw HTML omitted --&gt;
&lt;!-- raw HTML omitted --&gt;
&lt;p&gt;Things were a bit more complicated in the problem I was working on, though. The
method I had to memoize returned &lt;code&gt;Hash&lt;/code&gt; instances that were modified by the
caller method. This is obviously problematic as a second call would receive a
dirty, already modified, object instead of a good one. This was easily solved by
returning a defensive copy of the memoized hash. Although &lt;code&gt;Object#clone&lt;/code&gt; added
some overhead, it was still much faster than recalculating the whole thing once
again.&lt;/p&gt;
&lt;h2 id="symbolto_proc"&gt;Symbol#to_proc&lt;/h2&gt;
&lt;p&gt;Most of the time, in order to make some code run faster, we also make it uglier.
This is kind of expected: if the beautiful solution is also fast, you&amp;rsquo;re very
likely already using it. This isn&amp;rsquo;t, of course, true all the time. For some
reason, I was expecting the cute &lt;a href="http://www.ruby-doc.org/core-2.0/Symbol.html#method-i-to_proc"&gt;
&lt;code&gt;Symbol#to_proc&lt;/code&gt;&lt;/a&gt;
trick to perform poorly, so I&amp;rsquo;ve tried changing it to explicit blocks. This
proved to be a bad idea:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#272822;background-color:#fafafa;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-ruby" data-lang="ruby"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#00a8c8"&gt;Benchmark&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;&lt;span style="color:#111"&gt;bm&lt;/span&gt; &lt;span style="color:#00a8c8"&gt;do&lt;/span&gt; &lt;span style="color:#f92672"&gt;|&lt;/span&gt;&lt;span style="color:#111"&gt;x&lt;/span&gt;&lt;span style="color:#f92672"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#111"&gt;x&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;&lt;span style="color:#111"&gt;report&lt;/span&gt; &lt;span style="color:#d88200"&gt;&amp;#34;to_proc&amp;#34;&lt;/span&gt; &lt;span style="color:#00a8c8"&gt;do&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#111"&gt;(&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;&lt;span style="color:#f92672"&gt;..&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;100000000&lt;/span&gt;&lt;span style="color:#111"&gt;)&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;&lt;span style="color:#111"&gt;each&lt;/span&gt; &lt;span style="color:#f92672"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color:#d88200"&gt;:to_s&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#00a8c8"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#111"&gt;x&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;&lt;span style="color:#111"&gt;report&lt;/span&gt; &lt;span style="color:#d88200"&gt;&amp;#34;block&amp;#34;&lt;/span&gt; &lt;span style="color:#00a8c8"&gt;do&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#111"&gt;(&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;&lt;span style="color:#f92672"&gt;..&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;100000000&lt;/span&gt;&lt;span style="color:#111"&gt;)&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;&lt;span style="color:#111"&gt;each&lt;/span&gt; &lt;span style="color:#111"&gt;{&lt;/span&gt; &lt;span style="color:#f92672"&gt;|&lt;/span&gt;&lt;span style="color:#111"&gt;n&lt;/span&gt;&lt;span style="color:#f92672"&gt;|&lt;/span&gt; &lt;span style="color:#111"&gt;n&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;&lt;span style="color:#111"&gt;to_s&lt;/span&gt; &lt;span style="color:#111"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#00a8c8"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#00a8c8"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;!-- raw HTML omitted --&gt;
&lt;!-- raw HTML omitted --&gt;</content></entry><entry><title>A Kind of Informal Introduction to π-Calculus</title><link href="https://www.pmatiello.me/posts/2013-01-06-a-kind-of-informal-introduction-to-pi-calculus/"/><id>https://www.pmatiello.me/posts/2013-01-06-a-kind-of-informal-introduction-to-pi-calculus/</id><updated>2013-01-06T12:00:00+00:00</updated><published>2013-01-06T12:00:00+00:00</published><content type="html">&lt;p&gt;The &lt;a href="http://en.wikipedia.org/wiki/%CE%A0-calculus"&gt;π-Calculus&lt;/a&gt; is one of many
approaches to concurrent computation by the means of formal modeling. Its
purpose is to enable us to reason about concurrent processes in a disciplined
fashion by manipulating expressions through formally defined algebraic rules.&lt;/p&gt;
&lt;p&gt;Any exposition of the calculus will eventually introduce you to the primitive
notions:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Agents&lt;/strong&gt;, which can be understood and even referred as processes.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Actions&lt;/strong&gt;, which are anything that can be done by an agent.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Channels&lt;/strong&gt;, which are links connecting agents, alowing them to communicate.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Names&lt;/strong&gt;, which are exchanged through channels.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The general idea is that we have a set of agents connected to each other through
channels in some sort of network. These agents then use these channels
communicate to each other by exchanging names.&lt;/p&gt;
&lt;p&gt;The role of communication is central to the π-Calculus. In fact, there are only
three possible actions for an agent to perform, and two of them regard
communication:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The &lt;strong&gt;Output&lt;/strong&gt; action &lt;em&gt;x̅a&lt;/em&gt;: The name &lt;em&gt;a&lt;/em&gt; is sent through the channel &lt;em&gt;x&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;Input&lt;/strong&gt; action &lt;em&gt;x (a)&lt;/em&gt;: The name &lt;em&gt;a&lt;/em&gt; is bound to whatever is received
through channel &lt;em&gt;x&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;Silent&lt;/strong&gt; action τ: Any action internal to the agent (i.e. involving no
communication).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Now that we have actions, we can already build some agents:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The &lt;strong&gt;Nil&lt;/strong&gt;, empty agent &lt;em&gt;0&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;Prefix&lt;/strong&gt; &lt;em&gt;α.P&lt;/em&gt; that executes the action &lt;em&gt;α&lt;/em&gt; and then continues as the
agent &lt;em&gt;P&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;Restriction&lt;/strong&gt; &lt;em&gt;(νx)P&lt;/em&gt; that behaves as &lt;em&gt;P&lt;/em&gt; having the name &lt;em&gt;x&lt;/em&gt; in its
local scope.&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;Parallel Composition&lt;/strong&gt; &lt;em&gt;P|Q&lt;/em&gt; that behaves as agents &lt;em&gt;P&lt;/em&gt; and &lt;em&gt;Q&lt;/em&gt;
executing in parallel.&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;Sum&lt;/strong&gt; &lt;em&gt;P+Q&lt;/em&gt; that can behave either as &lt;em&gt;P&lt;/em&gt; or &lt;em&gt;Q&lt;/em&gt; (but not both).&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;Match&lt;/strong&gt; &lt;em&gt;[x=y].P&lt;/em&gt; that behaves as &lt;em&gt;P&lt;/em&gt; if &lt;em&gt;x&lt;/em&gt; and &lt;em&gt;y&lt;/em&gt; are the same name.&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;Mismatch&lt;/strong&gt; &lt;em&gt;[x≠y].P&lt;/em&gt; that behaves as &lt;em&gt;P&lt;/em&gt; if &lt;em&gt;x&lt;/em&gt; and &lt;em&gt;y&lt;/em&gt; are not the same
name.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This may be a bit too abstract, but a small example will hopefully help: suppose
we have a printer &lt;em&gt;P&lt;/em&gt;, a server &lt;em&gt;S&lt;/em&gt; and a client &lt;em&gt;C&lt;/em&gt;. We would like to have a
name sent by the client printed by the printer. We also define that the server
is connected to the client by a channel &lt;em&gt;y&lt;/em&gt; and to the printer by a channel &lt;em&gt;x&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src="/img/example-client-server-printer.png" alt=""&gt;&lt;/p&gt;
&lt;p&gt;To achieve our goal, &lt;em&gt;C&lt;/em&gt; should send a name to &lt;em&gt;S&lt;/em&gt; which, in turn, should
forward it to &lt;em&gt;P&lt;/em&gt;. We can write:&lt;/p&gt;
&lt;p&gt;&lt;em&gt;C|S|P&lt;/em&gt;, where&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;C= (νa)y̅a&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;S=y (b).x̅b.S&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;P=x (c).τ.P&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Notice two things:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;First, although the client agent terminates after sending its message, the
server and printer agents return to their initial state.&lt;/li&gt;
&lt;li&gt;Second, all communication in the π-Calculus is synchronous, so an agent
sending a message will remain blocked until some other agent receives the
message. Also, an agent listening on a channel for a name will remain blocked
until a message is actually sent through this channel.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;At this point, we&amp;rsquo;re ready to talk about what makes the calculus really
powerful: in π-Calculus, all channels are names, which means that they can be
sent through other channels just like any ordinary name. That&amp;rsquo;s really
important: an agent receiving a name that is also a channel may now use this
received channel to communicate with other agents. Essentially, such
interactions modify the network between the agents in the computation. This is
called &lt;em&gt;dynamic reconfiguration&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;We can illustrate this phenomenon by modifying our previous example. Previously,
we had the client sending the message to the printer through the server. Now,
we&amp;rsquo;ll have the client to send the message directly to the printer through a
channel provided by the server. We&amp;rsquo;ll write:&lt;/p&gt;
&lt;p&gt;&lt;em&gt;C|S|P&lt;/em&gt;, where&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;C= (νa)y (z).z̅a&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;S=y̅ (x).S&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;P=x (c).τ.P&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;And that&amp;rsquo;s enough for now. A lot more can be found in
the &lt;a href="http://books.google.com.br/books?id=ex6Xkj50ULkC"&gt;book written by Robin Milner&lt;/a&gt;,
the main author of π-Calculus. I also
find &lt;a href="http://www.cs.rpi.edu/courses/fall01/ic2001/picalculus.ps"&gt;Parrow&amp;rsquo;s paper&lt;/a&gt;
very readable.&lt;/p&gt;</content></entry><entry><title>Implementing interface contracts in Python with class decorators</title><link href="https://www.pmatiello.me/posts/2012-03-23-implementing-interface-contracts-in-python-with-class-decorators/"/><id>https://www.pmatiello.me/posts/2012-03-23-implementing-interface-contracts-in-python-with-class-decorators/</id><updated>2012-03-23T12:00:00+00:00</updated><published>2012-03-23T12:00:00+00:00</published><content type="html">&lt;p&gt;Python decorators are quite useful and interesting. I&amp;rsquo;ve already written
about &lt;!-- raw HTML omitted --&gt;
function decorators&lt;!-- raw HTML omitted --&gt; in
a &lt;!-- raw HTML omitted --&gt;
previous post&lt;!-- raw HTML omitted --&gt; and &lt;!-- raw HTML omitted --&gt;class
decorators&lt;!-- raw HTML omitted --&gt; are a worthy followup.&lt;/p&gt;
&lt;p&gt;I order to illustrate this feature, we&amp;rsquo;ll implement support for interface
contracts for Python classes. In a language like Java, for instance, a contract
can be declared this way:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#272822;background-color:#fafafa;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#00a8c8"&gt;public&lt;/span&gt; &lt;span style="color:#00a8c8"&gt;interface&lt;/span&gt; &lt;span style="color:#75af00"&gt;Comparable&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#111"&gt;T&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#111"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#00a8c8"&gt;public&lt;/span&gt; &lt;span style="color:#00a8c8"&gt;int&lt;/span&gt; &lt;span style="color:#75af00"&gt;compareTo&lt;/span&gt;&lt;span style="color:#111"&gt;(&lt;/span&gt;&lt;span style="color:#111"&gt;T&lt;/span&gt; &lt;span style="color:#111"&gt;o&lt;/span&gt;&lt;span style="color:#111"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#111"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;And a class declared as an implementation of this interface must provide the
relevant methods (with the correct signature). Otherwise, a compilation error
arises. For instance:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#272822;background-color:#fafafa;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#00a8c8"&gt;public&lt;/span&gt; &lt;span style="color:#00a8c8"&gt;final&lt;/span&gt; &lt;span style="color:#00a8c8"&gt;class&lt;/span&gt; &lt;span style="color:#75af00"&gt;Integer&lt;/span&gt; &lt;span style="color:#00a8c8"&gt;extends&lt;/span&gt; &lt;span style="color:#111"&gt;Number&lt;/span&gt; &lt;span style="color:#00a8c8"&gt;implements&lt;/span&gt; &lt;span style="color:#111"&gt;Comparable&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#111"&gt;Integer&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#111"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#111"&gt;...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#00a8c8"&gt;public&lt;/span&gt; &lt;span style="color:#00a8c8"&gt;int&lt;/span&gt; &lt;span style="color:#75af00"&gt;compareTo&lt;/span&gt;&lt;span style="color:#111"&gt;(&lt;/span&gt;&lt;span style="color:#111"&gt;Integer&lt;/span&gt; &lt;span style="color:#111"&gt;anotherInteger&lt;/span&gt;&lt;span style="color:#111"&gt;)&lt;/span&gt; &lt;span style="color:#111"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#00a8c8"&gt;int&lt;/span&gt; &lt;span style="color:#111"&gt;thisVal&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#00a8c8"&gt;this&lt;/span&gt;&lt;span style="color:#111"&gt;.&lt;/span&gt;&lt;span style="color:#75af00"&gt;value&lt;/span&gt;&lt;span style="color:#111"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#00a8c8"&gt;int&lt;/span&gt; &lt;span style="color:#111"&gt;anotherVal&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#111"&gt;anotherInteger&lt;/span&gt;&lt;span style="color:#111"&gt;.&lt;/span&gt;&lt;span style="color:#75af00"&gt;value&lt;/span&gt;&lt;span style="color:#111"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#00a8c8"&gt;return&lt;/span&gt; &lt;span style="color:#111"&gt;(&lt;/span&gt;&lt;span style="color:#111"&gt;thisVal&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color:#111"&gt;lt&lt;/span&gt;&lt;span style="color:#111"&gt;;&lt;/span&gt;&lt;span style="color:#111"&gt;anotherVal&lt;/span&gt; &lt;span style="color:#f92672"&gt;?&lt;/span&gt; &lt;span style="color:#f92672"&gt;-&lt;/span&gt;&lt;span style="color:#111"&gt;1&lt;/span&gt; &lt;span style="color:#111"&gt;:&lt;/span&gt; &lt;span style="color:#111"&gt;(&lt;/span&gt;&lt;span style="color:#111"&gt;thisVal&lt;/span&gt;&lt;span style="color:#f92672"&gt;==&lt;/span&gt;&lt;span style="color:#111"&gt;anotherVal&lt;/span&gt; &lt;span style="color:#f92672"&gt;?&lt;/span&gt; &lt;span style="color:#111"&gt;0&lt;/span&gt; &lt;span style="color:#111"&gt;:&lt;/span&gt; &lt;span style="color:#111"&gt;1&lt;/span&gt;&lt;span style="color:#111"&gt;));&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#111"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#111"&gt;...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#111"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;We&amp;rsquo;ll try to achieve a similar feature in Python, albeit with some limitations.
First, as Python does not have an explicit compilation step, our errors will
only arise in runtime. Second, in Python, the types of the arguments and return
values aren&amp;rsquo;t present in the signature of methods, so we&amp;rsquo;ll leave it out too.
This is a notable absence, but we can still verify the presence of desired
methods in the implementer type and the following elements in the method&amp;rsquo;s
signature:&lt;/p&gt;
&lt;!-- raw HTML omitted --&gt;
&lt;p&gt;This said, we now have to declare our interfaces. I picked the following
(somewhat cumbersome) syntax:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#272822;background-color:#fafafa;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-py" data-lang="py"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#00a8c8"&gt;class&lt;/span&gt; &lt;span style="color:#75af00"&gt;some_interface&lt;/span&gt;&lt;span style="color:#111"&gt;(&lt;/span&gt;&lt;span style="color:#111"&gt;interface&lt;/span&gt;&lt;span style="color:#111"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#111"&gt;simple_method&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#111"&gt;method&lt;/span&gt;&lt;span style="color:#111"&gt;([&lt;/span&gt;&lt;span style="color:#d88200"&gt;&amp;#39;self&amp;#39;&lt;/span&gt;&lt;span style="color:#111"&gt;])&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#111"&gt;method_with_args&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#111"&gt;method&lt;/span&gt;&lt;span style="color:#111"&gt;([&lt;/span&gt;&lt;span style="color:#d88200"&gt;&amp;#39;self&amp;#39;&lt;/span&gt;&lt;span style="color:#111"&gt;,&lt;/span&gt; &lt;span style="color:#d88200"&gt;&amp;#39;arg1&amp;#39;&lt;/span&gt;&lt;span style="color:#111"&gt;,&lt;/span&gt; &lt;span style="color:#d88200"&gt;&amp;#39;arg2&amp;#39;&lt;/span&gt;&lt;span style="color:#111"&gt;])&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#111"&gt;method_with_varargs&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#111"&gt;method&lt;/span&gt;&lt;span style="color:#111"&gt;([&lt;/span&gt;&lt;span style="color:#d88200"&gt;&amp;#39;self&amp;#39;&lt;/span&gt;&lt;span style="color:#111"&gt;],&lt;/span&gt; &lt;span style="color:#111"&gt;varargs&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#d88200"&gt;&amp;#39;varargs&amp;#39;&lt;/span&gt;&lt;span style="color:#111"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#111"&gt;method_with_kwargs&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#111"&gt;method&lt;/span&gt;&lt;span style="color:#111"&gt;([&lt;/span&gt;&lt;span style="color:#d88200"&gt;&amp;#39;self&amp;#39;&lt;/span&gt;&lt;span style="color:#111"&gt;],&lt;/span&gt; &lt;span style="color:#111"&gt;keywords&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#d88200"&gt;&amp;#39;kwargs&amp;#39;&lt;/span&gt;&lt;span style="color:#111"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#111"&gt;method_with_default_argument&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#111"&gt;method&lt;/span&gt;&lt;span style="color:#111"&gt;([&lt;/span&gt;&lt;span style="color:#d88200"&gt;&amp;#39;self&amp;#39;&lt;/span&gt;&lt;span style="color:#111"&gt;,&lt;/span&gt; &lt;span style="color:#d88200"&gt;&amp;#39;default_arg&amp;#39;&lt;/span&gt;&lt;span style="color:#111"&gt;],&lt;/span&gt; &lt;span style="color:#111"&gt;defaults&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;&lt;span style="color:#111"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Here we have an ordinary class subtyping an &lt;code&gt;interface&lt;/code&gt; class. The methods are
defined as attributes of the &lt;code&gt;some_interface&lt;/code&gt; class, holding instances of the
&lt;code&gt;method&lt;/code&gt; class.&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;interface&lt;/code&gt; class isn&amp;rsquo;t really exciting or even necessary. Actually, it
exists for the sole purpose of tagging an interface contract as such:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#272822;background-color:#fafafa;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-py" data-lang="py"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#00a8c8"&gt;class&lt;/span&gt; &lt;span style="color:#75af00"&gt;interface&lt;/span&gt;&lt;span style="color:#111"&gt;(&lt;/span&gt;&lt;span style="color:#111"&gt;object&lt;/span&gt;&lt;span style="color:#111"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#00a8c8"&gt;pass&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The &lt;code&gt;method&lt;/code&gt; class holds the method signature.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#272822;background-color:#fafafa;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-py" data-lang="py"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#00a8c8"&gt;class&lt;/span&gt; &lt;span style="color:#75af00"&gt;method&lt;/span&gt;&lt;span style="color:#111"&gt;(&lt;/span&gt;&lt;span style="color:#111"&gt;object&lt;/span&gt;&lt;span style="color:#111"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#00a8c8"&gt;def&lt;/span&gt; &lt;span style="color:#75af00"&gt;__init__&lt;/span&gt;&lt;span style="color:#111"&gt;(&lt;/span&gt;&lt;span style="color:#111"&gt;self&lt;/span&gt;&lt;span style="color:#111"&gt;,&lt;/span&gt; &lt;span style="color:#111"&gt;args&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#00a8c8"&gt;None&lt;/span&gt;&lt;span style="color:#111"&gt;,&lt;/span&gt; &lt;span style="color:#111"&gt;varargs&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#00a8c8"&gt;None&lt;/span&gt;&lt;span style="color:#111"&gt;,&lt;/span&gt; &lt;span style="color:#111"&gt;keywords&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#00a8c8"&gt;None&lt;/span&gt;&lt;span style="color:#111"&gt;,&lt;/span&gt; &lt;span style="color:#111"&gt;defaults&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;&lt;span style="color:#111"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#111"&gt;self&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;&lt;span style="color:#111"&gt;args&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#111"&gt;args&lt;/span&gt; &lt;span style="color:#f92672"&gt;or&lt;/span&gt; &lt;span style="color:#111"&gt;[]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#111"&gt;self&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;&lt;span style="color:#111"&gt;varargs&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#111"&gt;varargs&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#111"&gt;self&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;&lt;span style="color:#111"&gt;keywords&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#111"&gt;keywords&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#111"&gt;self&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;&lt;span style="color:#111"&gt;defaults&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#111"&gt;defaults&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Notice that the constructor takes a few arguments:&lt;/p&gt;
&lt;!-- raw HTML omitted --&gt;
&lt;p&gt;Now we can create a new type implementing &lt;code&gt;some_interface&lt;/code&gt;. And it follows:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#272822;background-color:#fafafa;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-py" data-lang="py"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75af00"&gt;@implements&lt;/span&gt;&lt;span style="color:#111"&gt;(&lt;/span&gt;&lt;span style="color:#111"&gt;some_interface&lt;/span&gt;&lt;span style="color:#111"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#00a8c8"&gt;class&lt;/span&gt; &lt;span style="color:#75af00"&gt;some_class&lt;/span&gt;&lt;span style="color:#111"&gt;(&lt;/span&gt;&lt;span style="color:#111"&gt;object&lt;/span&gt;&lt;span style="color:#111"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#00a8c8"&gt;def&lt;/span&gt; &lt;span style="color:#75af00"&gt;simple_method&lt;/span&gt;&lt;span style="color:#111"&gt;(&lt;/span&gt;&lt;span style="color:#111"&gt;self&lt;/span&gt;&lt;span style="color:#111"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#00a8c8"&gt;pass&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#00a8c8"&gt;def&lt;/span&gt; &lt;span style="color:#75af00"&gt;method_with_args&lt;/span&gt;&lt;span style="color:#111"&gt;(&lt;/span&gt;&lt;span style="color:#111"&gt;self&lt;/span&gt;&lt;span style="color:#111"&gt;,&lt;/span&gt; &lt;span style="color:#111"&gt;arg&lt;/span&gt;&lt;span style="color:#111"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#00a8c8"&gt;pass&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#00a8c8"&gt;def&lt;/span&gt; &lt;span style="color:#75af00"&gt;method_with_varargs&lt;/span&gt;&lt;span style="color:#111"&gt;(&lt;/span&gt;&lt;span style="color:#111"&gt;self&lt;/span&gt;&lt;span style="color:#111"&gt;,&lt;/span&gt; &lt;span style="color:#f92672"&gt;*&lt;/span&gt;&lt;span style="color:#111"&gt;varargs&lt;/span&gt;&lt;span style="color:#111"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#00a8c8"&gt;pass&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#00a8c8"&gt;def&lt;/span&gt; &lt;span style="color:#75af00"&gt;method_with_kwargs&lt;/span&gt;&lt;span style="color:#111"&gt;(&lt;/span&gt;&lt;span style="color:#111"&gt;self&lt;/span&gt;&lt;span style="color:#111"&gt;,&lt;/span&gt; &lt;span style="color:#f92672"&gt;**&lt;/span&gt;&lt;span style="color:#111"&gt;kwargs&lt;/span&gt;&lt;span style="color:#111"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#00a8c8"&gt;pass&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#00a8c8"&gt;def&lt;/span&gt; &lt;span style="color:#75af00"&gt;method_with_default_argument&lt;/span&gt;&lt;span style="color:#111"&gt;(&lt;/span&gt;&lt;span style="color:#111"&gt;self&lt;/span&gt;&lt;span style="color:#111"&gt;,&lt;/span&gt; &lt;span style="color:#111"&gt;default_arg&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;100&lt;/span&gt;&lt;span style="color:#111"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#00a8c8"&gt;pass&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Notice that we declare the class as implementing the contract through the
&lt;code&gt;implements&lt;/code&gt; class decorator.&lt;/p&gt;
&lt;p&gt;First thing we have to observe is the initialization of the &lt;code&gt;implements&lt;/code&gt;
decorator. Once the decorated class is loaded by the interpreter, an instance of
the decorator is produced. The argument &lt;code&gt;some_interface&lt;/code&gt; is passed to the
constructor during the initialization (and it&amp;rsquo;s stored as an attribute for
future reference).&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#272822;background-color:#fafafa;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-py" data-lang="py"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#00a8c8"&gt;class&lt;/span&gt; &lt;span style="color:#75af00"&gt;implements&lt;/span&gt;&lt;span style="color:#111"&gt;(&lt;/span&gt;&lt;span style="color:#111"&gt;object&lt;/span&gt;&lt;span style="color:#111"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#00a8c8"&gt;def&lt;/span&gt; &lt;span style="color:#75af00"&gt;__init__&lt;/span&gt;&lt;span style="color:#111"&gt;(&lt;/span&gt;&lt;span style="color:#111"&gt;self&lt;/span&gt;&lt;span style="color:#111"&gt;,&lt;/span&gt; &lt;span style="color:#111"&gt;interface&lt;/span&gt;&lt;span style="color:#111"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#111"&gt;self&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;&lt;span style="color:#111"&gt;interface&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#111"&gt;interface&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Then, the &lt;code&gt;__call__&lt;/code&gt; method of the decorator is invoked. The decorated class
(&lt;code&gt;some_class&lt;/code&gt; in this example) is passed as argument. In this method, it is
verified whether the given class satisfies all of its contractual obligations.
If no problem arises, the class is returned at the end of the call.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#272822;background-color:#fafafa;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-py" data-lang="py"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#00a8c8"&gt;class&lt;/span&gt; &lt;span style="color:#75af00"&gt;implements&lt;/span&gt;&lt;span style="color:#111"&gt;(&lt;/span&gt;&lt;span style="color:#111"&gt;object&lt;/span&gt;&lt;span style="color:#111"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#00a8c8"&gt;def&lt;/span&gt; &lt;span style="color:#75af00"&gt;__call__&lt;/span&gt;&lt;span style="color:#111"&gt;(&lt;/span&gt;&lt;span style="color:#111"&gt;self&lt;/span&gt;&lt;span style="color:#111"&gt;,&lt;/span&gt; &lt;span style="color:#111"&gt;clazz&lt;/span&gt;&lt;span style="color:#111"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#111"&gt;methods&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#111"&gt;[&lt;/span&gt;&lt;span style="color:#111"&gt;each&lt;/span&gt; &lt;span style="color:#00a8c8"&gt;for&lt;/span&gt; &lt;span style="color:#111"&gt;each&lt;/span&gt; &lt;span style="color:#f92672"&gt;in&lt;/span&gt; &lt;span style="color:#111"&gt;dir&lt;/span&gt;&lt;span style="color:#111"&gt;(&lt;/span&gt;&lt;span style="color:#111"&gt;self&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;&lt;span style="color:#111"&gt;interface&lt;/span&gt;&lt;span style="color:#111"&gt;)&lt;/span&gt; &lt;span style="color:#00a8c8"&gt;if&lt;/span&gt; &lt;span style="color:#111"&gt;self&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;&lt;span style="color:#111"&gt;_is_method&lt;/span&gt;&lt;span style="color:#111"&gt;(&lt;/span&gt;&lt;span style="color:#111"&gt;each&lt;/span&gt;&lt;span style="color:#111"&gt;)]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#00a8c8"&gt;for&lt;/span&gt; &lt;span style="color:#111"&gt;each&lt;/span&gt; &lt;span style="color:#f92672"&gt;in&lt;/span&gt; &lt;span style="color:#111"&gt;methods&lt;/span&gt;&lt;span style="color:#111"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#111"&gt;self&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;&lt;span style="color:#111"&gt;_assert_implements&lt;/span&gt;&lt;span style="color:#111"&gt;(&lt;/span&gt;&lt;span style="color:#111"&gt;clazz&lt;/span&gt;&lt;span style="color:#111"&gt;,&lt;/span&gt; &lt;span style="color:#111"&gt;each&lt;/span&gt;&lt;span style="color:#111"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#00a8c8"&gt;return&lt;/span&gt; &lt;span style="color:#111"&gt;clazz&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Notice that the &lt;code&gt;_assert_implements&lt;/code&gt; method is called against each method
declared in the interface. This method, listed ahead, verifies whether the given
method, as implemented by the class, has the desired signature, as specified in
the interface. In case it doesn&amp;rsquo;t, an exception is raised (effectively
interrupting the program).&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#272822;background-color:#fafafa;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-py" data-lang="py"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#00a8c8"&gt;class&lt;/span&gt; &lt;span style="color:#75af00"&gt;implements&lt;/span&gt;&lt;span style="color:#111"&gt;(&lt;/span&gt;&lt;span style="color:#111"&gt;object&lt;/span&gt;&lt;span style="color:#111"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#00a8c8"&gt;def&lt;/span&gt; &lt;span style="color:#75af00"&gt;_assert_implements&lt;/span&gt;&lt;span style="color:#111"&gt;(&lt;/span&gt;&lt;span style="color:#111"&gt;self&lt;/span&gt;&lt;span style="color:#111"&gt;,&lt;/span&gt; &lt;span style="color:#111"&gt;clazz&lt;/span&gt;&lt;span style="color:#111"&gt;,&lt;/span&gt; &lt;span style="color:#111"&gt;method_name&lt;/span&gt;&lt;span style="color:#111"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#111"&gt;method_contract&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#111"&gt;object&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;&lt;span style="color:#75af00"&gt;__getattribute__&lt;/span&gt;&lt;span style="color:#111"&gt;(&lt;/span&gt;&lt;span style="color:#111"&gt;self&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;&lt;span style="color:#111"&gt;interface&lt;/span&gt;&lt;span style="color:#111"&gt;,&lt;/span&gt; &lt;span style="color:#111"&gt;method_name&lt;/span&gt;&lt;span style="color:#111"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#111"&gt;method_impl&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#111"&gt;getargspec&lt;/span&gt;&lt;span style="color:#111"&gt;(&lt;/span&gt;&lt;span style="color:#111"&gt;object&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;&lt;span style="color:#75af00"&gt;__getattribute__&lt;/span&gt;&lt;span style="color:#111"&gt;(&lt;/span&gt;&lt;span style="color:#111"&gt;clazz&lt;/span&gt;&lt;span style="color:#111"&gt;,&lt;/span&gt; &lt;span style="color:#111"&gt;method_name&lt;/span&gt;&lt;span style="color:#111"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#00a8c8"&gt;assert&lt;/span&gt; &lt;span style="color:#111"&gt;method_name&lt;/span&gt; &lt;span style="color:#f92672"&gt;in&lt;/span&gt; &lt;span style="color:#111"&gt;dir&lt;/span&gt;&lt;span style="color:#111"&gt;(&lt;/span&gt;&lt;span style="color:#111"&gt;clazz&lt;/span&gt;&lt;span style="color:#111"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#00a8c8"&gt;assert&lt;/span&gt; &lt;span style="color:#111"&gt;method_contract&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;&lt;span style="color:#111"&gt;args&lt;/span&gt; &lt;span style="color:#f92672"&gt;==&lt;/span&gt; &lt;span style="color:#111"&gt;method_impl&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;&lt;span style="color:#111"&gt;args&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#00a8c8"&gt;assert&lt;/span&gt; &lt;span style="color:#111"&gt;method_contract&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;&lt;span style="color:#111"&gt;varargs&lt;/span&gt; &lt;span style="color:#f92672"&gt;==&lt;/span&gt; &lt;span style="color:#111"&gt;method_impl&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;&lt;span style="color:#111"&gt;varargs&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#00a8c8"&gt;assert&lt;/span&gt; &lt;span style="color:#111"&gt;method_contract&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;&lt;span style="color:#111"&gt;keywords&lt;/span&gt; &lt;span style="color:#f92672"&gt;==&lt;/span&gt; &lt;span style="color:#111"&gt;method_impl&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;&lt;span style="color:#111"&gt;keywords&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#00a8c8"&gt;if&lt;/span&gt; &lt;span style="color:#111"&gt;(&lt;/span&gt;&lt;span style="color:#111"&gt;method_impl&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;&lt;span style="color:#111"&gt;defaults&lt;/span&gt; &lt;span style="color:#f92672"&gt;is&lt;/span&gt; &lt;span style="color:#f92672"&gt;not&lt;/span&gt; &lt;span style="color:#00a8c8"&gt;None&lt;/span&gt;&lt;span style="color:#111"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#00a8c8"&gt;assert&lt;/span&gt; &lt;span style="color:#111"&gt;method_contract&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;&lt;span style="color:#111"&gt;defaults&lt;/span&gt; &lt;span style="color:#f92672"&gt;==&lt;/span&gt; &lt;span style="color:#111"&gt;len&lt;/span&gt;&lt;span style="color:#111"&gt;(&lt;/span&gt;&lt;span style="color:#111"&gt;method_impl&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;&lt;span style="color:#111"&gt;defaults&lt;/span&gt;&lt;span style="color:#111"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#00a8c8"&gt;else&lt;/span&gt;&lt;span style="color:#111"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#00a8c8"&gt;assert&lt;/span&gt; &lt;span style="color:#111"&gt;method_contract&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;&lt;span style="color:#111"&gt;defaults&lt;/span&gt; &lt;span style="color:#f92672"&gt;==&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The &lt;code&gt;object.__getattribute__()&lt;/code&gt;
(&lt;!-- raw HTML omitted --&gt;
documentation&lt;!-- raw HTML omitted --&gt;) call is one thing worth of note as it is part of Python&amp;rsquo;s
introspection features and targeted at retrieving attributes from classes and
objects. Here, it&amp;rsquo;s used both to retrieve &lt;code&gt;method&lt;/code&gt; objects from the interface
and and to obtain references to the actual methods in the concrete class (the
&lt;code&gt;clazz&lt;/code&gt; argument).&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;getargspec&lt;/code&gt; function
(&lt;!-- raw HTML omitted --&gt;
documentation&lt;!-- raw HTML omitted --&gt;) is also an interesting introspection feature. Given a
function, it will return an object with information about the given function&amp;rsquo;s
signature.&lt;/p&gt;
&lt;p&gt;So, having both the expected signature from the &lt;code&gt;method&lt;/code&gt; object hosted in the
interface and the signature of the method implemented in the concrete class, we
can simply compare them both and hope for a match.&lt;/p&gt;
&lt;p&gt;(&lt;!-- raw HTML omitted --&gt;Postscript:&lt;!-- raw HTML omitted --&gt; although the source code presented above works
fine, it&amp;rsquo;s actually a shorter version of the code originally developed for the
purpose and available &lt;!-- raw HTML omitted --&gt;
here&lt;!-- raw HTML omitted --&gt;.)&lt;/p&gt;</content></entry><entry><title>Dependency Injection in Ruby as inspired by Scala</title><link href="https://www.pmatiello.me/posts/2011-03-15-dependency-injection-in-ruby-as-inspired-by-scala/"/><id>https://www.pmatiello.me/posts/2011-03-15-dependency-injection-in-ruby-as-inspired-by-scala/</id><updated>2011-03-15T12:00:00+00:00</updated><published>2011-03-15T12:00:00+00:00</published><content type="html">&lt;p&gt;A
recent &lt;!-- raw HTML omitted --&gt;
discussion&lt;!-- raw HTML omitted --&gt; in
the &lt;!-- raw HTML omitted --&gt;GOOS&lt;!-- raw HTML omitted --&gt;&amp;rsquo; group
has lead me to consider different ways to compose objects in Ruby. Specifically,
as module inclusion seems to be the favored approach for adding stuff to classes
in Ruby, I&amp;rsquo;ve became interested in finding a more flexible idiom for this.&lt;/p&gt;
&lt;p&gt;The objective, therefore, is to define an instance variable in a module and be
able to have it injected in instances of some class. Since I&amp;rsquo;m not that familiar
with Ruby yet, I&amp;rsquo;m forced to turn to other languages for inspiration. A possible
solution in Scala, presented below, is kind of intuitive.&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s start defining a simple trait &lt;code&gt;Lightsource&lt;/code&gt;.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#272822;background-color:#fafafa;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-scala" data-lang="scala"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#00a8c8"&gt;trait&lt;/span&gt; &lt;span style="color:#75af00"&gt;Lightsource&lt;/span&gt; &lt;span style="color:#f92672"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#00a8c8"&gt;def&lt;/span&gt; &lt;span style="color:#111"&gt;on&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#00a8c8"&gt;def&lt;/span&gt; &lt;span style="color:#111"&gt;off&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The goal is to have a instance of a class implementing this trait injected in
every instance of the class &lt;code&gt;Room&lt;/code&gt; below.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#272822;background-color:#fafafa;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-scala" data-lang="scala"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#00a8c8"&gt;abstract&lt;/span&gt; &lt;span style="color:#00a8c8"&gt;class&lt;/span&gt; &lt;span style="color:#75af00"&gt;Room&lt;/span&gt; &lt;span style="color:#f92672"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#00a8c8"&gt;val&lt;/span&gt; &lt;span style="color:#111"&gt;lightsource&lt;/span&gt;&lt;span style="color:#00a8c8"&gt;:&lt;/span&gt;&lt;span style="color:#00a8c8"&gt;Lightsource&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#00a8c8"&gt;def&lt;/span&gt; &lt;span style="color:#111"&gt;enter&lt;/span&gt; &lt;span style="color:#00a8c8"&gt;=&lt;/span&gt; &lt;span style="color:#111"&gt;lightsource&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;&lt;span style="color:#111"&gt;on&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#00a8c8"&gt;def&lt;/span&gt; &lt;span style="color:#111"&gt;leave&lt;/span&gt; &lt;span style="color:#00a8c8"&gt;=&lt;/span&gt; &lt;span style="color:#111"&gt;lightsource&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;&lt;span style="color:#111"&gt;off&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The injection can be performed by mixing-in the &lt;code&gt;Room&lt;/code&gt; class with traits
designed to provide a &lt;code&gt;Lightsource&lt;/code&gt;. For example:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#272822;background-color:#fafafa;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-scala" data-lang="scala"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#00a8c8"&gt;trait&lt;/span&gt; &lt;span style="color:#75af00"&gt;FluorescentLamp&lt;/span&gt; &lt;span style="color:#f92672"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#00a8c8"&gt;val&lt;/span&gt; &lt;span style="color:#111"&gt;lightsource&lt;/span&gt; &lt;span style="color:#00a8c8"&gt;=&lt;/span&gt; &lt;span style="color:#00a8c8"&gt;new&lt;/span&gt; &lt;span style="color:#75af00"&gt;Lightsource&lt;/span&gt; &lt;span style="color:#f92672"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#00a8c8"&gt;def&lt;/span&gt; &lt;span style="color:#111"&gt;on&lt;/span&gt; &lt;span style="color:#00a8c8"&gt;=&lt;/span&gt; &lt;span style="color:#111"&gt;println&lt;/span&gt;&lt;span style="color:#f92672"&gt;(&lt;/span&gt;&lt;span style="color:#d88200"&gt;&amp;#34;Sad light on&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#00a8c8"&gt;def&lt;/span&gt; &lt;span style="color:#111"&gt;off&lt;/span&gt; &lt;span style="color:#00a8c8"&gt;=&lt;/span&gt; &lt;span style="color:#111"&gt;println&lt;/span&gt;&lt;span style="color:#f92672"&gt;(&lt;/span&gt;&lt;span style="color:#d88200"&gt;&amp;#34;Sad light off&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The actual composition reads nicely:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#272822;background-color:#fafafa;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-scala" data-lang="scala"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#00a8c8"&gt;val&lt;/span&gt; &lt;span style="color:#111"&gt;sadRoom&lt;/span&gt; &lt;span style="color:#00a8c8"&gt;=&lt;/span&gt; &lt;span style="color:#00a8c8"&gt;new&lt;/span&gt; &lt;span style="color:#75af00"&gt;Room&lt;/span&gt; &lt;span style="color:#00a8c8"&gt;with&lt;/span&gt; &lt;span style="color:#75af00"&gt;FluorescentLamp&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;If the fluorescent lamp is unsatisfactory, an alternative implementation can be
provided:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#272822;background-color:#fafafa;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-scala" data-lang="scala"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#00a8c8"&gt;trait&lt;/span&gt; &lt;span style="color:#75af00"&gt;IncandescentLamp&lt;/span&gt; &lt;span style="color:#f92672"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#00a8c8"&gt;val&lt;/span&gt; &lt;span style="color:#111"&gt;lightsource&lt;/span&gt; &lt;span style="color:#00a8c8"&gt;=&lt;/span&gt; &lt;span style="color:#00a8c8"&gt;new&lt;/span&gt; &lt;span style="color:#75af00"&gt;Lightsource&lt;/span&gt; &lt;span style="color:#f92672"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#00a8c8"&gt;def&lt;/span&gt; &lt;span style="color:#111"&gt;on&lt;/span&gt; &lt;span style="color:#00a8c8"&gt;=&lt;/span&gt; &lt;span style="color:#111"&gt;println&lt;/span&gt;&lt;span style="color:#f92672"&gt;(&lt;/span&gt;&lt;span style="color:#d88200"&gt;&amp;#34;Warm light on&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#00a8c8"&gt;def&lt;/span&gt; &lt;span style="color:#111"&gt;off&lt;/span&gt; &lt;span style="color:#00a8c8"&gt;=&lt;/span&gt; &lt;span style="color:#111"&gt;println&lt;/span&gt;&lt;span style="color:#f92672"&gt;(&lt;/span&gt;&lt;span style="color:#d88200"&gt;&amp;#34;Warm light off&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#272822;background-color:#fafafa;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-scala" data-lang="scala"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#00a8c8"&gt;val&lt;/span&gt; &lt;span style="color:#111"&gt;warmRoom&lt;/span&gt; &lt;span style="color:#00a8c8"&gt;=&lt;/span&gt; &lt;span style="color:#00a8c8"&gt;new&lt;/span&gt; &lt;span style="color:#75af00"&gt;Room&lt;/span&gt; &lt;span style="color:#00a8c8"&gt;with&lt;/span&gt; &lt;span style="color:#75af00"&gt;IncandescentLamp&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;And I will stop at this point. Although there is opportunity for improvement,
the implementation is satisfactory enough for me.&lt;/p&gt;
&lt;p&gt;Having succeeded at the Scala front, we can tackle the same issue using Ruby.
Here, we find ourselves both unable and not required to declare interfaces, so
we move directly to the definition of our &lt;code&gt;Room&lt;/code&gt; class.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#272822;background-color:#fafafa;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-ruby" data-lang="ruby"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#00a8c8"&gt;class&lt;/span&gt; &lt;span style="color:#75af00"&gt;Room&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#00a8c8"&gt;def&lt;/span&gt; &lt;span style="color:#75af00"&gt;enter&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#111"&gt;@lightsource&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;&lt;span style="color:#111"&gt;on&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#00a8c8"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#00a8c8"&gt;def&lt;/span&gt; &lt;span style="color:#75af00"&gt;leave&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#111"&gt;@lightsource&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;&lt;span style="color:#111"&gt;off&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#00a8c8"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#00a8c8"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The next step is to define a module responsible for providing an &lt;code&gt;@lightsource&lt;/code&gt;
object to instances of the Room` class. For instance:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#272822;background-color:#fafafa;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-ruby" data-lang="ruby"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#00a8c8"&gt;module&lt;/span&gt; &lt;span style="color:#111"&gt;FluorescentLamp&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#00a8c8"&gt;class&lt;/span&gt; &lt;span style="color:#75af00"&gt;FluorescentLampImpl&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#00a8c8"&gt;def&lt;/span&gt; &lt;span style="color:#75af00"&gt;on&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#111"&gt;puts&lt;/span&gt; &lt;span style="color:#d88200"&gt;&amp;#34;Sad light on&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#00a8c8"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#00a8c8"&gt;def&lt;/span&gt; &lt;span style="color:#75af00"&gt;off&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#111"&gt;puts&lt;/span&gt; &lt;span style="color:#d88200"&gt;&amp;#34;Sad light off&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#00a8c8"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#00a8c8"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#00a8c8"&gt;def&lt;/span&gt; &lt;span style="color:#75af00"&gt;initialize&lt;/span&gt;&lt;span style="color:#111"&gt;(&lt;/span&gt;&lt;span style="color:#f92672"&gt;*&lt;/span&gt;&lt;span style="color:#111"&gt;args&lt;/span&gt;&lt;span style="color:#111"&gt;,&lt;/span&gt; &lt;span style="color:#f92672"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color:#111"&gt;b&lt;/span&gt;&lt;span style="color:#111"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#00a8c8"&gt;super&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#111"&gt;@lightsource&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#00a8c8"&gt;FluorescentLampImpl&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;&lt;span style="color:#111"&gt;new&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#00a8c8"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#00a8c8"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Alternatively:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#272822;background-color:#fafafa;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-ruby" data-lang="ruby"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#00a8c8"&gt;module&lt;/span&gt; &lt;span style="color:#111"&gt;IncandescentLamp&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#00a8c8"&gt;class&lt;/span&gt; &lt;span style="color:#75af00"&gt;IncandescentLampImpl&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#00a8c8"&gt;def&lt;/span&gt; &lt;span style="color:#75af00"&gt;on&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#111"&gt;puts&lt;/span&gt; &lt;span style="color:#d88200"&gt;&amp;#34;Warm light on&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#00a8c8"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#00a8c8"&gt;def&lt;/span&gt; &lt;span style="color:#75af00"&gt;off&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#111"&gt;puts&lt;/span&gt; &lt;span style="color:#d88200"&gt;&amp;#34;Warm light off&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#00a8c8"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#00a8c8"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#00a8c8"&gt;def&lt;/span&gt; &lt;span style="color:#75af00"&gt;initialize&lt;/span&gt;&lt;span style="color:#111"&gt;(&lt;/span&gt;&lt;span style="color:#f92672"&gt;*&lt;/span&gt;&lt;span style="color:#111"&gt;args&lt;/span&gt;&lt;span style="color:#111"&gt;,&lt;/span&gt; &lt;span style="color:#f92672"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color:#111"&gt;b&lt;/span&gt;&lt;span style="color:#111"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#00a8c8"&gt;super&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#111"&gt;@lightsource&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#00a8c8"&gt;IncandescentLampImpl&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;&lt;span style="color:#111"&gt;new&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#00a8c8"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#00a8c8"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The actual composition does not read so nicely, but surely it can be improved by
some sort of DSL. Being lazy, I&amp;rsquo;ll skip that, though:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#272822;background-color:#fafafa;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-ruby" data-lang="ruby"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#111"&gt;sadRoom&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#00a8c8"&gt;Class&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;&lt;span style="color:#111"&gt;new&lt;/span&gt;&lt;span style="color:#111"&gt;(&lt;/span&gt;&lt;span style="color:#00a8c8"&gt;Room&lt;/span&gt;&lt;span style="color:#111"&gt;)&lt;/span&gt; &lt;span style="color:#00a8c8"&gt;do&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#00a8c8"&gt;include&lt;/span&gt; &lt;span style="color:#00a8c8"&gt;FluorescentLamp&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#00a8c8"&gt;end&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;&lt;span style="color:#111"&gt;new&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#111"&gt;warmRoom&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#00a8c8"&gt;Class&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;&lt;span style="color:#111"&gt;new&lt;/span&gt;&lt;span style="color:#111"&gt;(&lt;/span&gt;&lt;span style="color:#00a8c8"&gt;Room&lt;/span&gt;&lt;span style="color:#111"&gt;)&lt;/span&gt; &lt;span style="color:#00a8c8"&gt;do&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#00a8c8"&gt;include&lt;/span&gt; &lt;span style="color:#00a8c8"&gt;IncandescentLamp&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#00a8c8"&gt;end&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;&lt;span style="color:#111"&gt;new&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Now, I&amp;rsquo;m suppose that this approach is not really within Ruby&amp;rsquo;s orthodoxy, but I
found it interesting nevertheless. Also, it surprised me that the Scala version
is both cleaner and smaller than the Ruby version, while still providing the
safety advantages of the static typing.&lt;/p&gt;</content></entry><entry><title>In which I give my own half-baked workaround to the lack of tail call optimization in Python</title><link href="https://www.pmatiello.me/posts/2010-09-22-in-which-i-give-my-own-half-baked-workaround-to-the-lack-of-tail-call-optimization-in-python/"/><id>https://www.pmatiello.me/posts/2010-09-22-in-which-i-give-my-own-half-baked-workaround-to-the-lack-of-tail-call-optimization-in-python/</id><updated>2010-09-22T12:00:00+00:00</updated><published>2010-09-22T12:00:00+00:00</published><content type="html">&lt;p&gt;A &lt;!-- raw HTML omitted --&gt;tail call&lt;!-- raw HTML omitted --&gt; is a function call such that
it is the last action performed by a procedure. Therefore, the value returned by
the caller procedure is the value returned by the called procedure. Many
compilers and interpreters take advantage of this situation by using the
caller&amp;rsquo;s stack space to execute the called procedure, instead of allocating more
space for it. Because no extra space is consumed by these calls, recursive tail
calls can be nested at will without risk of overflowing the stack.&lt;/p&gt;
&lt;p&gt;Unfortunately, Python&amp;rsquo;s interpreter does not perform this optimization trick.
This can be easily learned from the example bellow:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#272822;background-color:#fafafa;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-py" data-lang="py"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#00a8c8"&gt;def&lt;/span&gt; &lt;span style="color:#75af00"&gt;f&lt;/span&gt;&lt;span style="color:#111"&gt;(&lt;/span&gt;&lt;span style="color:#111"&gt;x&lt;/span&gt;&lt;span style="color:#111"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;...&lt;/span&gt; &lt;span style="color:#00a8c8"&gt;if&lt;/span&gt; &lt;span style="color:#111"&gt;(&lt;/span&gt;&lt;span style="color:#111"&gt;x&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;&lt;span style="color:#111"&gt;):&lt;/span&gt; &lt;span style="color:#00a8c8"&gt;return&lt;/span&gt; &lt;span style="color:#111"&gt;f&lt;/span&gt;&lt;span style="color:#111"&gt;(&lt;/span&gt;&lt;span style="color:#111"&gt;x&lt;/span&gt;&lt;span style="color:#f92672"&gt;-&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;&lt;span style="color:#111"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;...&lt;/span&gt; &lt;span style="color:#00a8c8"&gt;else&lt;/span&gt;&lt;span style="color:#111"&gt;:&lt;/span&gt; &lt;span style="color:#00a8c8"&gt;return&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#111"&gt;f&lt;/span&gt;&lt;span style="color:#111"&gt;(&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;10&lt;/span&gt;&lt;span style="color:#111"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#111"&gt;f&lt;/span&gt;&lt;span style="color:#111"&gt;(&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1000&lt;/span&gt;&lt;span style="color:#111"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#111"&gt;Traceback&lt;/span&gt; &lt;span style="color:#111"&gt;(&lt;/span&gt;&lt;span style="color:#111"&gt;most&lt;/span&gt; &lt;span style="color:#111"&gt;recent&lt;/span&gt; &lt;span style="color:#111"&gt;call&lt;/span&gt; &lt;span style="color:#111"&gt;last&lt;/span&gt;&lt;span style="color:#111"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#111"&gt;File&lt;/span&gt; &lt;span style="color:#d88200"&gt;&amp;#34;&amp;lt;stdin&amp;gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#111"&gt;,&lt;/span&gt; &lt;span style="color:#111"&gt;line&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;&lt;span style="color:#111"&gt;,&lt;/span&gt; &lt;span style="color:#f92672"&gt;in&lt;/span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#111"&gt;module&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#111"&gt;File&lt;/span&gt; &lt;span style="color:#d88200"&gt;&amp;#34;&amp;lt;stdin&amp;gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#111"&gt;,&lt;/span&gt; &lt;span style="color:#111"&gt;line&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;&lt;span style="color:#111"&gt;,&lt;/span&gt; &lt;span style="color:#f92672"&gt;in&lt;/span&gt; &lt;span style="color:#111"&gt;f&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#111"&gt;File&lt;/span&gt; &lt;span style="color:#d88200"&gt;&amp;#34;&amp;lt;stdin&amp;gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#111"&gt;,&lt;/span&gt; &lt;span style="color:#111"&gt;line&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;&lt;span style="color:#111"&gt;,&lt;/span&gt; &lt;span style="color:#f92672"&gt;in&lt;/span&gt; &lt;span style="color:#111"&gt;f&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75af00"&gt;RuntimeError&lt;/span&gt;&lt;span style="color:#111"&gt;:&lt;/span&gt; &lt;span style="color:#111"&gt;maximum&lt;/span&gt; &lt;span style="color:#111"&gt;recursion&lt;/span&gt; &lt;span style="color:#111"&gt;depth&lt;/span&gt; &lt;span style="color:#111"&gt;exceeded&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This limitation in the interpreter is unlikely to disappear anytime
soon, &lt;!-- raw HTML omitted --&gt;
if at all&lt;!-- raw HTML omitted --&gt;. But, as tail call optimization is often very convenient,
many &lt;!-- raw HTML omitted --&gt;
workarounds&lt;!-- raw HTML omitted --&gt; &lt;!-- raw HTML omitted --&gt;
were&lt;!-- raw HTML omitted --&gt; &lt;!-- raw HTML omitted --&gt;
written&lt;!-- raw HTML omitted --&gt;. These workarounds, with different levels of success, make use
of &lt;!-- raw HTML omitted --&gt;
decorators&lt;!-- raw HTML omitted --&gt; (which are functions that are executed before the decorated
function) to control the execution of function calls.&lt;/p&gt;
&lt;p&gt;This post presents yet another solution, also based on decorators. The objective
here is to avoid any limit on the number of recursive tail calls performed by a
function by decorating it like bellow.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#272822;background-color:#fafafa;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-py" data-lang="py"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75af00"&gt;@tail_recursive&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#00a8c8"&gt;def&lt;/span&gt; &lt;span style="color:#75af00"&gt;f&lt;/span&gt;&lt;span style="color:#111"&gt;(&lt;/span&gt;&lt;span style="color:#111"&gt;x&lt;/span&gt;&lt;span style="color:#111"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#00a8c8"&gt;if&lt;/span&gt; &lt;span style="color:#111"&gt;(&lt;/span&gt;&lt;span style="color:#111"&gt;x&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;&lt;span style="color:#111"&gt;):&lt;/span&gt; &lt;span style="color:#00a8c8"&gt;return&lt;/span&gt; &lt;span style="color:#111"&gt;f&lt;/span&gt;&lt;span style="color:#111"&gt;(&lt;/span&gt;&lt;span style="color:#111"&gt;x&lt;/span&gt;&lt;span style="color:#f92672"&gt;-&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;&lt;span style="color:#111"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#00a8c8"&gt;else&lt;/span&gt;&lt;span style="color:#111"&gt;:&lt;/span&gt; &lt;span style="color:#00a8c8"&gt;return&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Every call to &lt;code&gt;f&lt;/code&gt;, then, will be intercepted by the decorator. Depending on the
situation, it may continue and execute the function as usual, or return an
object that may be used to perform the issued call later. The next listing
presents the class for these objects (note that they store both a reference to a
function and the arguments for a specific call).&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#272822;background-color:#fafafa;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-py" data-lang="py"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#00a8c8"&gt;class&lt;/span&gt; &lt;span style="color:#75af00"&gt;_continue&lt;/span&gt;&lt;span style="color:#111"&gt;(&lt;/span&gt;&lt;span style="color:#111"&gt;object&lt;/span&gt;&lt;span style="color:#111"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#00a8c8"&gt;def&lt;/span&gt; &lt;span style="color:#75af00"&gt;__init__&lt;/span&gt;&lt;span style="color:#111"&gt;(&lt;/span&gt;&lt;span style="color:#111"&gt;self&lt;/span&gt;&lt;span style="color:#111"&gt;,&lt;/span&gt; &lt;span style="color:#111"&gt;func&lt;/span&gt;&lt;span style="color:#111"&gt;,&lt;/span&gt; &lt;span style="color:#f92672"&gt;*&lt;/span&gt;&lt;span style="color:#111"&gt;args&lt;/span&gt;&lt;span style="color:#111"&gt;,&lt;/span&gt; &lt;span style="color:#f92672"&gt;**&lt;/span&gt;&lt;span style="color:#111"&gt;kwargs&lt;/span&gt;&lt;span style="color:#111"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#111"&gt;self&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;&lt;span style="color:#111"&gt;func&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#111"&gt;func&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#111"&gt;self&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;&lt;span style="color:#111"&gt;args&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#111"&gt;args&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#111"&gt;self&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;&lt;span style="color:#111"&gt;kwargs&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#111"&gt;kwargs&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Each call to a decorated function &lt;code&gt;f&lt;/code&gt; implies on a independent run of the
decorator code. On the first call, the decorator will allow &lt;code&gt;f&lt;/code&gt; to be executed,
but instead of returning immediately, it will await for &lt;code&gt;_continue&lt;/code&gt; objects to
execute them. Subsequent tail-recursive calls to &lt;code&gt;f&lt;/code&gt;, on the other hand, will
just return an instance of &lt;code&gt;_continue&lt;/code&gt; filled with the call arguments without
executing &lt;code&gt;f&lt;/code&gt;. Non tail-recursive are allowed to proceed unmolested.&lt;/p&gt;
&lt;p&gt;This approach keeps the stack from growing by avoiding nested calls whenever
possible. Still, detecting recursion and tail recursion are tricky jobs. The
former is performed by checking if penultimate frame in the stack refers to our
decorator. The later is performed
by &lt;!-- raw HTML omitted --&gt;checking&lt;!-- raw HTML omitted --&gt;
whether
the &lt;!-- raw HTML omitted --&gt;
bytecode&lt;!-- raw HTML omitted --&gt; associated with the previous stack frame will return immediately
after the completion of the call.&lt;/p&gt;
&lt;p&gt;The source code for the decorator follows. An instance of it is produced for
each decorated function, and the method &lt;code&gt;__call__&lt;/code&gt; is executed on every
invocation of them.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#272822;background-color:#fafafa;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-py" data-lang="py"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#111"&gt;OPCODES&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#111"&gt;[&lt;/span&gt;&lt;span style="color:#111"&gt;chr&lt;/span&gt;&lt;span style="color:#111"&gt;(&lt;/span&gt;&lt;span style="color:#111"&gt;opmap&lt;/span&gt;&lt;span style="color:#111"&gt;[&lt;/span&gt;&lt;span style="color:#d88200"&gt;&amp;#39;RETURN_VALUE&amp;#39;&lt;/span&gt;&lt;span style="color:#111"&gt;]),&lt;/span&gt; &lt;span style="color:#111"&gt;chr&lt;/span&gt;&lt;span style="color:#111"&gt;(&lt;/span&gt;&lt;span style="color:#111"&gt;opmap&lt;/span&gt;&lt;span style="color:#111"&gt;[&lt;/span&gt;&lt;span style="color:#d88200"&gt;&amp;#39;POP_TOP&amp;#39;&lt;/span&gt;&lt;span style="color:#111"&gt;])]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#00a8c8"&gt;class&lt;/span&gt; &lt;span style="color:#75af00"&gt;tail_recursive&lt;/span&gt;&lt;span style="color:#111"&gt;(&lt;/span&gt;&lt;span style="color:#111"&gt;object&lt;/span&gt;&lt;span style="color:#111"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#00a8c8"&gt;def&lt;/span&gt; &lt;span style="color:#75af00"&gt;__init__&lt;/span&gt;&lt;span style="color:#111"&gt;(&lt;/span&gt;&lt;span style="color:#111"&gt;self&lt;/span&gt;&lt;span style="color:#111"&gt;,&lt;/span&gt; &lt;span style="color:#111"&gt;function&lt;/span&gt;&lt;span style="color:#111"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#111"&gt;self&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;&lt;span style="color:#111"&gt;function&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#111"&gt;function&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#00a8c8"&gt;def&lt;/span&gt; &lt;span style="color:#75af00"&gt;_is_tailcall&lt;/span&gt;&lt;span style="color:#111"&gt;(&lt;/span&gt;&lt;span style="color:#111"&gt;self&lt;/span&gt;&lt;span style="color:#111"&gt;,&lt;/span&gt; &lt;span style="color:#111"&gt;frame&lt;/span&gt;&lt;span style="color:#111"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#111"&gt;caller_frame&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#111"&gt;frame&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;&lt;span style="color:#111"&gt;f_back&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#111"&gt;code&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#111"&gt;caller_frame&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;&lt;span style="color:#111"&gt;f_code&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;&lt;span style="color:#111"&gt;co_code&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#111"&gt;ip&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#111"&gt;caller_frame&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;&lt;span style="color:#111"&gt;f_lasti&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#00a8c8"&gt;return&lt;/span&gt; &lt;span style="color:#111"&gt;code&lt;/span&gt;&lt;span style="color:#111"&gt;[&lt;/span&gt;&lt;span style="color:#111"&gt;ip&lt;/span&gt; &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;3&lt;/span&gt;&lt;span style="color:#111"&gt;]&lt;/span&gt; &lt;span style="color:#f92672"&gt;in&lt;/span&gt; &lt;span style="color:#111"&gt;OPCODES&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#00a8c8"&gt;def&lt;/span&gt; &lt;span style="color:#75af00"&gt;__call__&lt;/span&gt;&lt;span style="color:#111"&gt;(&lt;/span&gt;&lt;span style="color:#111"&gt;self&lt;/span&gt;&lt;span style="color:#111"&gt;,&lt;/span&gt; &lt;span style="color:#f92672"&gt;*&lt;/span&gt;&lt;span style="color:#111"&gt;args&lt;/span&gt;&lt;span style="color:#111"&gt;,&lt;/span&gt; &lt;span style="color:#f92672"&gt;**&lt;/span&gt;&lt;span style="color:#111"&gt;kwargs&lt;/span&gt;&lt;span style="color:#111"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#111"&gt;frame&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#111"&gt;getframe&lt;/span&gt;&lt;span style="color:#111"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#00a8c8"&gt;if&lt;/span&gt; &lt;span style="color:#111"&gt;frame&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;&lt;span style="color:#111"&gt;f_back&lt;/span&gt; &lt;span style="color:#f92672"&gt;and&lt;/span&gt; \
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#111"&gt;frame&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;&lt;span style="color:#111"&gt;f_back&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;&lt;span style="color:#111"&gt;f_back&lt;/span&gt; &lt;span style="color:#f92672"&gt;and&lt;/span&gt; \
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#111"&gt;frame&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;&lt;span style="color:#111"&gt;f_back&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;&lt;span style="color:#111"&gt;f_back&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;&lt;span style="color:#111"&gt;f_code&lt;/span&gt; &lt;span style="color:#f92672"&gt;==&lt;/span&gt; &lt;span style="color:#111"&gt;frame&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;&lt;span style="color:#111"&gt;f_code&lt;/span&gt; &lt;span style="color:#f92672"&gt;and&lt;/span&gt; \
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#111"&gt;self&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;&lt;span style="color:#111"&gt;_is_tailcall&lt;/span&gt;&lt;span style="color:#111"&gt;(&lt;/span&gt;&lt;span style="color:#111"&gt;frame&lt;/span&gt;&lt;span style="color:#111"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#00a8c8"&gt;return&lt;/span&gt; &lt;span style="color:#111"&gt;_continue&lt;/span&gt;&lt;span style="color:#111"&gt;(&lt;/span&gt;&lt;span style="color:#111"&gt;self&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;&lt;span style="color:#111"&gt;function&lt;/span&gt;&lt;span style="color:#111"&gt;,&lt;/span&gt; &lt;span style="color:#f92672"&gt;*&lt;/span&gt;&lt;span style="color:#111"&gt;args&lt;/span&gt;&lt;span style="color:#111"&gt;,&lt;/span&gt; &lt;span style="color:#f92672"&gt;**&lt;/span&gt;&lt;span style="color:#111"&gt;kwargs&lt;/span&gt;&lt;span style="color:#111"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#111"&gt;retval&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#111"&gt;self&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;&lt;span style="color:#111"&gt;function&lt;/span&gt;&lt;span style="color:#111"&gt;(&lt;/span&gt;&lt;span style="color:#f92672"&gt;*&lt;/span&gt;&lt;span style="color:#111"&gt;args&lt;/span&gt;&lt;span style="color:#111"&gt;,&lt;/span&gt; &lt;span style="color:#f92672"&gt;**&lt;/span&gt;&lt;span style="color:#111"&gt;kwargs&lt;/span&gt;&lt;span style="color:#111"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#00a8c8"&gt;while&lt;/span&gt; &lt;span style="color:#111"&gt;(&lt;/span&gt;&lt;span style="color:#00a8c8"&gt;True&lt;/span&gt;&lt;span style="color:#111"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#00a8c8"&gt;if&lt;/span&gt; &lt;span style="color:#111"&gt;(&lt;/span&gt;&lt;span style="color:#111"&gt;type&lt;/span&gt;&lt;span style="color:#111"&gt;(&lt;/span&gt;&lt;span style="color:#111"&gt;retval&lt;/span&gt;&lt;span style="color:#111"&gt;)&lt;/span&gt; &lt;span style="color:#f92672"&gt;==&lt;/span&gt; &lt;span style="color:#111"&gt;_continue&lt;/span&gt;&lt;span style="color:#111"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#111"&gt;retval&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#111"&gt;retval&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;&lt;span style="color:#111"&gt;func&lt;/span&gt;&lt;span style="color:#111"&gt;(&lt;/span&gt;&lt;span style="color:#f92672"&gt;*&lt;/span&gt;&lt;span style="color:#111"&gt;retval&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;&lt;span style="color:#111"&gt;args&lt;/span&gt;&lt;span style="color:#111"&gt;,&lt;/span&gt; &lt;span style="color:#f92672"&gt;**&lt;/span&gt;&lt;span style="color:#111"&gt;retval&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;&lt;span style="color:#111"&gt;kwargs&lt;/span&gt;&lt;span style="color:#111"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#00a8c8"&gt;else&lt;/span&gt;&lt;span style="color:#111"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#00a8c8"&gt;return&lt;/span&gt; &lt;span style="color:#111"&gt;retval&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;(The entire code, with tests, is
available &lt;!-- raw HTML omitted --&gt;here&lt;!-- raw HTML omitted --&gt;.)&lt;/p&gt;
&lt;p&gt;Of course, this isn&amp;rsquo;t true tail call optimization, but only a trick to achieve
unlimited tail recursion. Properly implemented, the optimization should also
provide increased performance by reducing the work needed to perform a function
call; here, performance is actually harmed.&lt;/p&gt;</content></entry></feed>