<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">

  <title>Esa-Matti Suuronen</title>
  
  <link href="http://esa-matti.suuronen.org/" />
  <updated>2011-11-28T22:36:35+02:00</updated>
  <id>http://esa-matti.suuronen.org/</id>
  <author>
    <name>Esa-Matti Suuronen</name>
    
  </author>

  
  <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/Esa-mattiSuuronen" /><feedburner:info uri="esa-mattisuuronen" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><feedburner:browserFriendly></feedburner:browserFriendly><entry>
    <title>How to Write CoffeeScript Efficiently</title>
    <link href="http://esa-matti.suuronen.org/blog/2011/11/28/how-to-write-coffeescript-efficiently/" />
    <updated>2011-11-28T20:07:00+02:00</updated>
    <id>http://esa-matti.suuronen.org/blog/2011/11/28/how-to-write-coffeescript-efficiently</id>
    <content type="html">&lt;p&gt;I have found few tricks that makes writing CoffeeScript more efficient and fun,
especially when learning it and I&amp;#8217;d like to share it with you.&lt;/p&gt;

&lt;p&gt;These tricks are for Vim, but the ideas can be carried out to other editors as
well. I know that at least the TextMate CoffeeScript Bundle can do some of
these.&lt;/p&gt;

&lt;h2&gt;Basics&lt;/h2&gt;

&lt;p&gt;Let&amp;#8217;s get the basics out of way. Get syntax hilighting from
&lt;a href="https://github.com/kchmck/vim-coffee-script"&gt;vim-coffee-script&lt;/a&gt; plugin
and automatic syntax checking from
&lt;a href="http://www.vim.org/scripts/script.php?script_id=2736"&gt;Syntastic&lt;/a&gt;. These will
take you a long way, but with CoffeeScript we can do more.&lt;/p&gt;

&lt;h2&gt;Reading compiled code&lt;/h2&gt;

&lt;p&gt;Especially when starting out with CoffeeScript you are not always sure what the
snippet you are reading or even the code you just wrote does.  Chances are that
you already know Javascript so we can use that to our advantage.
&lt;code&gt;vim-coffee-script&lt;/code&gt; makes that incredibly easy.&lt;/p&gt;

&lt;p&gt;Lets take following snippet that might be confusing to CoffeeScript newbies:&lt;/p&gt;

&lt;figure class=’code’&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class=’line-number’&gt;1&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class=’code’&gt;&lt;pre&gt;&lt;code class=’coffeescript’&gt;&lt;span class=’line’&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;@foo&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;bar&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;With &lt;code&gt;vim-coffee-script&lt;/code&gt; you can just select the snippet in Visual Mode and type
&lt;code&gt;:CoffeeCompile&lt;/code&gt; which will open up a new scratch buffer with a compiled
version of the snippet which will clearly tell what this syntax in CoffeeScript
means. You can use this to verify that you understood the CoffeeScript syntax
by using your Javascript knowledge!&lt;/p&gt;

&lt;p&gt;I recommend creating a shortcut for this. It&amp;#8217;s so useful. Put this to your
&lt;code&gt;.vimrc&lt;/code&gt;:&lt;/p&gt;

&lt;figure class=’code’&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class=’line-number’&gt;1&lt;/span&gt;
&lt;span class=’line-number’&gt;2&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class=’code’&gt;&lt;pre&gt;&lt;code class=’coffeescript’&gt;&lt;span class=’line’&gt;&lt;span class="nx"&gt;vmap&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;leader&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;c&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;esc&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;:&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&amp;lt;,&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;:&lt;/span&gt;&lt;span class="nx"&gt;CoffeeCompile&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;CR&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;&lt;span class="nx"&gt;map&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;leader&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;c&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="nx"&gt;CoffeeCompile&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;CR&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;This allows you to invoke the compiler with &lt;code&gt;Leader-key + c&lt;/code&gt;. The leader key is
backslash by default, but usually it is redefined to comma.&lt;/p&gt;

&lt;h2&gt;Stack Traces&lt;/h2&gt;

&lt;p&gt;I don&amp;#8217;t like manually compiling CoffeeScript files for my Node.js apps. Instead
I use the &lt;code&gt;coffee&lt;/code&gt; command directly or use plain js wrapper app that starts my
CoffeeScript apps. This is clean and simple, but can be painful when you get an
exception. There is a stack trace, but it refers to the compiled Javacript file
which does not exist!  You could look up the original CoffeeScript file and try
to guess what line the stack trace means by looking variable names or manually
compile the file when exception occurs. Not so fun.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;vim-coffee-script&lt;/code&gt; to the rescue!&lt;/p&gt;

&lt;p&gt;When you execute the &lt;code&gt;CoffeeCompile&lt;/code&gt; Vim command in Command Mode you will get
the whole file compiled into the scratch buffer. In that you can scroll the
line referred by the stack trace and see what code exactly rose it.  This is
bit clumsy since normally you can jump to a certain line by typing &lt;code&gt;:&amp;lt;number&amp;gt;&lt;/code&gt;.
We can do better! Put this to &lt;code&gt;.vimrc&lt;/code&gt;:&lt;/p&gt;

&lt;figure class=’code’&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class=’line-number’&gt;1&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class=’code’&gt;&lt;pre&gt;&lt;code class=’coffeescript’&gt;&lt;span class=’line’&gt;&lt;span class="nx"&gt;command&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;nargs&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="nx"&gt;C&lt;/span&gt; &lt;span class="nx"&gt;CoffeeCompile&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="o"&gt;:&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;args&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;And then try typing &lt;code&gt;:C&amp;lt;number&amp;gt;&lt;/code&gt;. Whoah! This takes you to the given line
number in the compiled Javascript of the CoffeeScript file you are editing.
Using it is just one character longer than normally jumping lines!&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>Python-like Decorators in CoffeeScript</title>
    <link href="http://esa-matti.suuronen.org/blog/2011/10/06/python-like-decorators-in-coffeescript/" />
    <updated>2011-10-06T21:10:00+03:00</updated>
    <id>http://esa-matti.suuronen.org/blog/2011/10/06/python-like-decorators-in-coffeescript</id>
    <content type="html">&lt;p&gt;If you are not familar what decorators are in Python you should skim through
&lt;a href="http://docs.python.org/glossary.html#term-decorator"&gt;this&lt;/a&gt; and
&lt;a href="http://www.ibm.com/developerworks/linux/library/l-cpdecor/index.html"&gt;this&lt;/a&gt;.
In short they are a nice syntax for wrapping functions/methods with other
functions in Python.&lt;/p&gt;

&lt;p&gt;I really like decorators in Python and I sometimes miss them when working in
other languages. Today at work it hit me when I was working on CoffeeScript
project. It is really easy to implement Python-like decorators cleanly in
CoffeeScript.&lt;/p&gt;

&lt;h2&gt;Decorators in Python&lt;/h2&gt;

&lt;p&gt;Here&amp;#8217;s an example usage of Python decorator. Let&amp;#8217;s pretend that this is a
class for reading values from some device. It will give us values between 0 and
100, but in this app we want put a roof for the values it gives. We can create
a decorator that limits the values given by the getter.&lt;/p&gt;

&lt;figure class=’code’&gt;&lt;figcaption&gt;&lt;span&gt;Decorator in Python  (decorator_example.py)&lt;/span&gt; &lt;a href=’http://esa-matti.suuronen.org/downloads/code/decorator_example.py’&gt;download&lt;/a&gt;&lt;/figcaption&gt;
 &lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class=’line-number’&gt;1&lt;/span&gt;
&lt;span class=’line-number’&gt;2&lt;/span&gt;
&lt;span class=’line-number’&gt;3&lt;/span&gt;
&lt;span class=’line-number’&gt;4&lt;/span&gt;
&lt;span class=’line-number’&gt;5&lt;/span&gt;
&lt;span class=’line-number’&gt;6&lt;/span&gt;
&lt;span class=’line-number’&gt;7&lt;/span&gt;
&lt;span class=’line-number’&gt;8&lt;/span&gt;
&lt;span class=’line-number’&gt;9&lt;/span&gt;
&lt;span class=’line-number’&gt;10&lt;/span&gt;
&lt;span class=’line-number’&gt;11&lt;/span&gt;
&lt;span class=’line-number’&gt;12&lt;/span&gt;
&lt;span class=’line-number’&gt;13&lt;/span&gt;
&lt;span class=’line-number’&gt;14&lt;/span&gt;
&lt;span class=’line-number’&gt;15&lt;/span&gt;
&lt;span class=’line-number’&gt;16&lt;/span&gt;
&lt;span class=’line-number’&gt;17&lt;/span&gt;
&lt;span class=’line-number’&gt;18&lt;/span&gt;
&lt;span class=’line-number’&gt;19&lt;/span&gt;
&lt;span class=’line-number’&gt;20&lt;/span&gt;
&lt;span class=’line-number’&gt;21&lt;/span&gt;
&lt;span class=’line-number’&gt;22&lt;/span&gt;
&lt;span class=’line-number’&gt;23&lt;/span&gt;
&lt;span class=’line-number’&gt;24&lt;/span&gt;
&lt;span class=’line-number’&gt;25&lt;/span&gt;
&lt;span class=’line-number’&gt;26&lt;/span&gt;
&lt;span class=’line-number’&gt;27&lt;/span&gt;
&lt;span class=’line-number’&gt;28&lt;/span&gt;
&lt;span class=’line-number’&gt;29&lt;/span&gt;
&lt;span class=’line-number’&gt;30&lt;/span&gt;
&lt;span class=’line-number’&gt;31&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class=’code’&gt;&lt;pre&gt;&lt;code class=’py’&gt;&lt;span class=’line’&gt;&lt;span class="c"&gt;#!/usr/bin/env python&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;
&lt;/span&gt;&lt;span class=’line’&gt;&lt;span class="c"&gt;# Our magic device&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;random&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;
&lt;/span&gt;&lt;span class=’line’&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;roof&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;amount&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;decorator&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;method&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;        &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;wrapper&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;
&lt;/span&gt;&lt;span class=’line’&gt;            &lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;method&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;amount&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;                &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;amount&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;            &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;                &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;
&lt;/span&gt;&lt;span class=’line’&gt;        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;wrapper&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;decorator&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;
&lt;/span&gt;&lt;span class=’line’&gt;
&lt;/span&gt;&lt;span class=’line’&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Device&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;object&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;
&lt;/span&gt;&lt;span class=’line’&gt;    &lt;span class="nd"&gt;@roof&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_value&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;        &lt;span class="c"&gt;# Read value from the device&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;random&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;randint&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;
&lt;/span&gt;&lt;span class=’line’&gt;
&lt;/span&gt;&lt;span class=’line’&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;__name__&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;__main__&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;    &lt;span class="n"&gt;reader&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Device&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;        &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="n"&gt;reader&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get_value&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;h2&gt;Decorators in CoffeeScript&lt;/h2&gt;

&lt;p&gt;So that was an advanced configurable decorator for Python. Lets see how
CoffeeScript handles the same situation.&lt;/p&gt;

&lt;figure class=’code’&gt;&lt;figcaption&gt;&lt;span&gt;Decorator in CoffeeScript [] (decorator_example.coffee)&lt;/span&gt; &lt;a href=’http://esa-matti.suuronen.org/downloads/code/decorator_example.coffee’&gt;download&lt;/a&gt;&lt;/figcaption&gt;
 &lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class=’line-number’&gt;1&lt;/span&gt;
&lt;span class=’line-number’&gt;2&lt;/span&gt;
&lt;span class=’line-number’&gt;3&lt;/span&gt;
&lt;span class=’line-number’&gt;4&lt;/span&gt;
&lt;span class=’line-number’&gt;5&lt;/span&gt;
&lt;span class=’line-number’&gt;6&lt;/span&gt;
&lt;span class=’line-number’&gt;7&lt;/span&gt;
&lt;span class=’line-number’&gt;8&lt;/span&gt;
&lt;span class=’line-number’&gt;9&lt;/span&gt;
&lt;span class=’line-number’&gt;10&lt;/span&gt;
&lt;span class=’line-number’&gt;11&lt;/span&gt;
&lt;span class=’line-number’&gt;12&lt;/span&gt;
&lt;span class=’line-number’&gt;13&lt;/span&gt;
&lt;span class=’line-number’&gt;14&lt;/span&gt;
&lt;span class=’line-number’&gt;15&lt;/span&gt;
&lt;span class=’line-number’&gt;16&lt;/span&gt;
&lt;span class=’line-number’&gt;17&lt;/span&gt;
&lt;span class=’line-number’&gt;18&lt;/span&gt;
&lt;span class=’line-number’&gt;19&lt;/span&gt;
&lt;span class=’line-number’&gt;20&lt;/span&gt;
&lt;span class=’line-number’&gt;21&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class=’code’&gt;&lt;pre&gt;&lt;code class=’coffeescript’&gt;&lt;span class=’line’&gt;&lt;span class="c1"&gt;#!/usr/bin/env coffee&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;
&lt;/span&gt;&lt;span class=’line’&gt;&lt;span class="nv"&gt;roof = &lt;/span&gt;&lt;span class="nf"&gt;(amount) -&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;(method) -&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;
&lt;/span&gt;&lt;span class=’line’&gt;  &lt;span class="nv"&gt;value = &lt;/span&gt;&lt;span class="nx"&gt;method&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;apply&lt;/span&gt; &lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;arguments&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;
&lt;/span&gt;&lt;span class=’line’&gt;  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;amount&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;    &lt;span class="nx"&gt;amount&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;  &lt;span class="k"&gt;else&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;    &lt;span class="nx"&gt;value&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;
&lt;/span&gt;&lt;span class=’line’&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nx"&gt;Device&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;
&lt;/span&gt;&lt;span class=’line’&gt;    &lt;span class="nv"&gt;getValue: &lt;/span&gt;&lt;span class="nx"&gt;roof&lt;/span&gt;&lt;span class="nf"&gt;(50) -&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;      &lt;span class="nb"&gt;parseInt&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;random&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;
&lt;/span&gt;&lt;span class=’line’&gt;
&lt;/span&gt;&lt;span class=’line’&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nx"&gt;require&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;main&lt;/span&gt; &lt;span class="o"&gt;is&lt;/span&gt; &lt;span class="nx"&gt;module&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;  &lt;span class="nv"&gt;device = &lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;Device&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;  &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;..&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt; &lt;span class="nx"&gt;device&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;getValue&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;Wow! That is a lot less syntax and no extra nesting!&lt;/p&gt;

&lt;p&gt;This really shows how powerful anonymous functions and implicit returns are in
CoffeeScript.  Also the usage syntax would not be so clean if CoffeeScript
didn&amp;#8217;t have ability to call functions without the parenthesis.&lt;/p&gt;

&lt;p&gt;The usage syntax is though better in Python, because you can stack decorators
cleanly with it.&lt;/p&gt;

&lt;figure class=’code’&gt;&lt;figcaption&gt;&lt;span&gt;Stacking decorators in Python&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class=’line-number’&gt;1&lt;/span&gt;
&lt;span class=’line-number’&gt;2&lt;/span&gt;
&lt;span class=’line-number’&gt;3&lt;/span&gt;
&lt;span class=’line-number’&gt;4&lt;/span&gt;
&lt;span class=’line-number’&gt;5&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class=’code’&gt;&lt;pre&gt;&lt;code class=’python’&gt;&lt;span class=’line’&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Device&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;object&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;    &lt;span class="nd"&gt;@roof&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;    &lt;span class="nd"&gt;@floor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c"&gt;# Checks the bottom of the value&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_value&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;random&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;randint&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;In CoffeeScript must put them after each others which can get nasty if you have
many decorators.&lt;/p&gt;

&lt;figure class=’code’&gt;&lt;figcaption&gt;&lt;span&gt;Piping decorators in CoffeeScript&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class=’line-number’&gt;1&lt;/span&gt;
&lt;span class=’line-number’&gt;2&lt;/span&gt;
&lt;span class=’line-number’&gt;3&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class=’code’&gt;&lt;pre&gt;&lt;code class=’coffeescript’&gt;&lt;span class=’line’&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nx"&gt;Device&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;    &lt;span class="nv"&gt;getValue: &lt;/span&gt;&lt;span class="nx"&gt;roof&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nx"&gt;floor&lt;/span&gt;&lt;span class="nf"&gt;(10) -&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;      &lt;span class="nb"&gt;parseInt&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;random&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;But wait! There were no specific decorator syntax in Python in the old days.
One could apply decorators just by calling it to the target and replacing the
original method.&lt;/p&gt;

&lt;figure class=’code’&gt;&lt;figcaption&gt;&lt;span&gt;Oldschool decorator usage&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class=’line-number’&gt;1&lt;/span&gt;
&lt;span class=’line-number’&gt;2&lt;/span&gt;
&lt;span class=’line-number’&gt;3&lt;/span&gt;
&lt;span class=’line-number’&gt;4&lt;/span&gt;
&lt;span class=’line-number’&gt;5&lt;/span&gt;
&lt;span class=’line-number’&gt;6&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class=’code’&gt;&lt;pre&gt;&lt;code class=’python’&gt;&lt;span class=’line’&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Device&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;object&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_value&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;random&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;randint&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;
&lt;/span&gt;&lt;span class=’line’&gt;    &lt;span class="n"&gt;get_value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;roof&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;)(&lt;/span&gt;&lt;span class="n"&gt;get_value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;    &lt;span class="n"&gt;get_value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;floor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;)(&lt;/span&gt;&lt;span class="n"&gt;get_value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;So you can do this in CoffeeScript&lt;/p&gt;

&lt;figure class=’code’&gt;&lt;figcaption&gt;&lt;span&gt;Piping decorators in CoffeeScript&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class=’line-number’&gt;1&lt;/span&gt;
&lt;span class=’line-number’&gt;2&lt;/span&gt;
&lt;span class=’line-number’&gt;3&lt;/span&gt;
&lt;span class=’line-number’&gt;4&lt;/span&gt;
&lt;span class=’line-number’&gt;5&lt;/span&gt;
&lt;span class=’line-number’&gt;6&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class=’code’&gt;&lt;pre&gt;&lt;code class=’coffeescript’&gt;&lt;span class=’line’&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nx"&gt;Device&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;  &lt;span class="nv"&gt;getValue: &lt;/span&gt;&lt;span class="nx"&gt;roof&lt;/span&gt;&lt;span class="nf"&gt;(50) -&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;    &lt;span class="nb"&gt;parseInt&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;random&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;
&lt;/span&gt;&lt;span class=’line’&gt;  &lt;span class="nv"&gt;getValue: &lt;/span&gt;&lt;span class="nx"&gt;roof&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nx"&gt;Device&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nx"&gt;getValue&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;  &lt;span class="nv"&gt;getValue: &lt;/span&gt;&lt;span class="nx"&gt;floor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nx"&gt;Device&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nx"&gt;getValue&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;Pretty ugly, yeah, but might be better if you have tons of decorators.&lt;/p&gt;
</content>
  </entry>
  
</feed>

