<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/css" href="/stylesheets/rss.css"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/">
  <channel>
    <title>Xblog: Ruby On Nails Scratching a Chalkboard</title>
    <link>http://xblog.xman.org/articles/2006/09/12/ruby-on-nails-scratching-a-chalkboard</link>
    <language>en-us</language>
    <ttl>40</ttl>
    <description>hey, if it has a capital X in it, it has to be great!</description>
    <item>
      <title>Ruby On Nails Scratching a Chalkboard</title>
      <description>&lt;p&gt;So, as I explore how Ruby works, I&amp;#8217;m discovering some bits of ugliness.
It&amp;#8217;s syntax is increasingly reminding me more of Perl than Smalltalk. A
case in point: blocks.&lt;/p&gt;

&lt;p&gt;I&amp;#8217;d heard so much about Ruby&amp;#8217;s Smalltalkishness that I was a bit taken
aback when I saw control statements in the language grammar. In
Smalltalk, control flow is managed using methods and blocks, and I knew
Ruby had blocks (this is one of the things that you hear so much about
in &lt;a title="Beyond Java, by Bruce Tate" href="http://www.oreilly.com/catalog/beyondjava/"&gt;Beyond Java&lt;/a&gt;), so why did they need these control statements?
In Smalltalk, control flow looks like this:&lt;/p&gt;

&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_default "&gt;1 + 1 = 2
  ifTrue: ['it is true']
  ifFalse: ['it is false']&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Now, I can&amp;#8217;t claim that this provides any real productivity boost over Ruby&amp;#8217;s approach:&lt;/p&gt;

&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;span class="keyword"&gt;if&lt;/span&gt; &lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="number"&gt;1&lt;/span&gt; &lt;span class="punct"&gt;+&lt;/span&gt; &lt;span class="number"&gt;1&lt;/span&gt; &lt;span class="punct"&gt;==&lt;/span&gt; &lt;span class="number"&gt;2&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt; &lt;span class="keyword"&gt;then&lt;/span&gt;
  &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;it is true&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt;
&lt;span class="keyword"&gt;else&lt;/span&gt;
  &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;it is false&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt;
&lt;span class="keyword"&gt;end&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;But I was kind of surprised, given Ruby&amp;#8217;s ties to Smalltalk, that someone hadn&amp;#8217;t hacked it in. So, I went about hacking it in myself. That&amp;#8217;s when I found out why.&lt;/p&gt;

&lt;p&gt;It turns out that blocks in Ruby have a very high level of syntactic sugariness. Not only do they have their own special literal form (which is a key advantage over say Java&amp;#8217;s Inner Classes, or C++ functors without boost::lambda), but they also have their own special status which really makes them non-objects. (I found it amusing to discover that the most non-object entity in Ruby is a block).&lt;/p&gt;

&lt;p&gt;Here&amp;#8217;s the magic: blocks aren&amp;#8217;t passed as normal parameters to functions. They are passed through an implicit variable (showcasing Ruby&amp;#8217;s Perlishness here). So, if, for example, I wanted to add something like Smalltalk&amp;#8217;s ifTrue: to Ruby, I&amp;#8217;d do the following:&lt;/p&gt;

&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;span class="keyword"&gt;class &lt;/span&gt;&lt;span class="class"&gt;TrueClass&lt;/span&gt;
  &lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;ifTrue&lt;/span&gt;
      &lt;span class="keyword"&gt;yield&lt;/span&gt;
  &lt;span class="keyword"&gt;end&lt;/span&gt;
&lt;span class="keyword"&gt;end&lt;/span&gt;

&lt;span class="keyword"&gt;class &lt;/span&gt;&lt;span class="class"&gt;FalseClass&lt;/span&gt;
  &lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;ifTrue&lt;/span&gt;
  &lt;span class="keyword"&gt;end&lt;/span&gt;
&lt;span class="keyword"&gt;end&lt;/span&gt;

&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="number"&gt;1&lt;/span&gt; &lt;span class="punct"&gt;+&lt;/span&gt; &lt;span class="number"&gt;1&lt;/span&gt; &lt;span class="punct"&gt;==&lt;/span&gt; &lt;span class="number"&gt;2&lt;/span&gt;&lt;span class="punct"&gt;).&lt;/span&gt;&lt;span class="ident"&gt;ifTrue&lt;/span&gt; &lt;span class="punct"&gt;{&lt;/span&gt; &lt;span class="ident"&gt;puts&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;Math works&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt; &lt;span class="punct"&gt;}&lt;/span&gt;
&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="number"&gt;1&lt;/span&gt; &lt;span class="punct"&gt;+&lt;/span&gt; &lt;span class="number"&gt;3&lt;/span&gt; &lt;span class="punct"&gt;==&lt;/span&gt; &lt;span class="number"&gt;2&lt;/span&gt;&lt;span class="punct"&gt;).&lt;/span&gt;&lt;span class="ident"&gt;ifTrue&lt;/span&gt; &lt;span class="punct"&gt;{&lt;/span&gt; &lt;span class="ident"&gt;puts&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;Math is broken&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt; &lt;span class="punct"&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Notice that ifTrue doesn&amp;#8217;t appear to take any parameters, and neither does the &amp;#8220;yield&amp;#8221; method. In reality, the block is an implicit parameter. One Ruby tutorial claimed this is a good thing, because it means that all Ruby methods can take a block as a parameter&amp;#8230;. even if they don&amp;#8217;t use it. Me, I&amp;#8217;m a big fan of explicitness, but I can see that in a scripting world, sometimes these kind of shortcuts are nice to have. What&amp;#8217;s bad about this is that not only does it mean that all Ruby methods can take a block as a parameter, it also means all Ruby methods can only take &lt;em&gt;exactly one block&lt;/em&gt; as a parameter, and it has to be the last one.&lt;/p&gt;

&lt;p&gt;Now, it turns out that Ruby has a wrapper around blocks called Proc, which lets you treat a block like a real object, Of course, it has all the syntactic beauty of Java&amp;#8217;s Inner Classes. Here&amp;#8217;s how you can do ifTrueifFalse in Ruby:&lt;/p&gt;

&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;span class="keyword"&gt;class &lt;/span&gt;&lt;span class="class"&gt;TrueClass&lt;/span&gt;
  &lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;ifTrueIfFalse&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="constant"&gt;trueProc&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="constant"&gt;falseProc&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
    &lt;span class="constant"&gt;trueProc&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;call&lt;/span&gt;
  &lt;span class="keyword"&gt;end&lt;/span&gt;
&lt;span class="keyword"&gt;end&lt;/span&gt;

&lt;span class="keyword"&gt;class &lt;/span&gt;&lt;span class="class"&gt;FalseClass&lt;/span&gt;
  &lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;ifTrueIfFalse&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="constant"&gt;trueProc&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="constant"&gt;falseProc&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
    &lt;span class="constant"&gt;falseProc&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;call&lt;/span&gt;
  &lt;span class="keyword"&gt;end&lt;/span&gt;
&lt;span class="keyword"&gt;end&lt;/span&gt;

&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="number"&gt;1&lt;/span&gt; &lt;span class="punct"&gt;+&lt;/span&gt; &lt;span class="number"&gt;1&lt;/span&gt; &lt;span class="punct"&gt;==&lt;/span&gt; &lt;span class="number"&gt;2&lt;/span&gt;&lt;span class="punct"&gt;).&lt;/span&gt;&lt;span class="ident"&gt;ifTrueIfFalse&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="constant"&gt;Proc&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;new&lt;/span&gt; &lt;span class="punct"&gt;{&lt;/span&gt; &lt;span class="ident"&gt;puts&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;Math works&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt; &lt;span class="punct"&gt;},&lt;/span&gt;&lt;span class="constant"&gt;Proc&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;new&lt;/span&gt; &lt;span class="punct"&gt;{&lt;/span&gt;&lt;span class="ident"&gt;puts&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;Math is broken&lt;/span&gt;&lt;span class="punct"&gt;'})&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;But wait! There&amp;#8217;s more! Since Proc&amp;#8217;s are proper objects, you can query them for meta-information, which is really handy for various dynamic programming tricks. Only&amp;#8230; Ruby&amp;#8217;s interface is kind of weird. Proc&amp;#8217;s have this method &amp;#8220;arity&amp;#8221; which tells you how many arguments the block takes&amp;#8230; sort of. For reasons passing understanding, if a block takes zero arguments, the function returns &amp;#8220;-1&amp;#8221; intead of &amp;#8220;0&amp;#8221;, and if it takes 1 argument, it returns &amp;#8220;-2&amp;#8221; instead of &amp;#8220;1&amp;#8221;. So, now we&amp;#8217;ve established that it can never return 0 or 1, and that you can&amp;#8217;t always use the return value as an collection size for your argument list. Here&amp;#8217;s where it gets really crazy though: if your function takes a variable argument list with it&amp;#8217;s last parameter, arity returns &amp;#8220;0 - # of args&amp;#8221;. So, quick question for you: if arity returns back -2, does that mean it&amp;#8217;s argumetn list is one argument long, or that it takes one argument followed by a variable list of arguments? I&amp;#8217;m not sure how Bruce Tate can claim that Ruby doesn&amp;#8217;t have some weird anachronisms that get in the way of doing metaprogramming with a straight face.&lt;/p&gt;

&lt;p&gt;In fairness, the case where you want to pass a single block as your last argument seems like the common case, and Ruby is a scripting language after all. I&amp;#8217;m mostly annoyed because I&amp;#8217;ve heard so many people talk about Ruby&amp;#8217;s elegance, comparing it favourably with Smalltalk (which admittedly is not entirely without warts). Upon inspection it seems to have warts just like other languages (well, some languages have a few more warts than others). Still, there is hope. Ruby does seem to have some genuinely nice features, and it is open source, so there is always the possibility that some of these idiosyncracies will get cleaned up in the future.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;UPDATE:&lt;/strong&gt; So, someone with some real Ruby experience has clarified for me that nobody actually does &amp;#8220;Proc.new&amp;#8221; in Ruby. Instead they use Lambda. So, invoking my ifTrueIfFalse method would normally be done like so:&lt;/p&gt;

&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="number"&gt;1&lt;/span&gt; &lt;span class="punct"&gt;+&lt;/span&gt; &lt;span class="number"&gt;1&lt;/span&gt; &lt;span class="punct"&gt;==&lt;/span&gt; &lt;span class="number"&gt;2&lt;/span&gt;&lt;span class="punct"&gt;).&lt;/span&gt;&lt;span class="ident"&gt;ifTrueIfFalse&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;lambda&lt;/span&gt; &lt;span class="punct"&gt;{&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;Math Works&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt; &lt;span class="punct"&gt;},&lt;/span&gt;&lt;span class="ident"&gt;lambda&lt;/span&gt; &lt;span class="punct"&gt;{'&lt;/span&gt;&lt;span class="string"&gt;Math Doesn&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="ident"&gt;t&lt;/span&gt; &lt;span class="constant"&gt;Work&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt; })&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Which I have to admit does seem a lot prettier for some reason.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ANOTHER UPDATE:&lt;/strong&gt; I&amp;#8217;ve gotten some great comments to this article, and I thought I should incorporate their content. First, people have suggested that you can break up ifTrueIfFalse in to two calls that are chained together, and then get back some of the elegance. I thought about this when I first looked in to it, but you lose the ability to pick up a return object cleanly.&lt;/p&gt;

&lt;p&gt;Antti Tarvainen provided some excellent points. In particular he clarified the difference between a Proc that takes no arguments (arity returns 0) and a Proc that doesn&amp;#8217;t define any arguments returns -1. Furthermore, arity has been &lt;a href="http://ruby-doc.org/core/classes/Proc.src/M000808.html" title="Proc in Ruby 1.9"&gt;updated for Ruby 1.9&lt;/a&gt; to what seems like a more sensible behavior. I noticed that even in 1.8 &lt;pre&gt;puts lambda {|a|}.arity&lt;/pre&gt; returns 1, which suggests the Ruby documentation is a wee bit out of date.&lt;/p&gt;

&lt;p&gt;I still think it&amp;#8217;d be far more sensible to not overload the arity method and instead have &lt;strong&gt;numArgs?&lt;/strong&gt; which gets you the number of required arguments&amp;#8221;, &lt;strong&gt;hasOptional?&lt;/strong&gt; which gets you back a boolean as to whether there are optional arguments, and &lt;strong&gt;argsDefined?&lt;/strong&gt; which gets you back a boolean as to whether the Proc has defined arguments at all. Overloading the meaning of the return value just results in more code that needs to check for special cases and cases where you can&amp;#8217;t actually know which of two states is correct.&lt;/p&gt;

&lt;p&gt;Also, there seems to be confusion about my point in comparing it to Smalltalk&amp;#8217;s ifTrue:ifFalse:. Of course one should use Ruby idioms when doing Ruby. The ifTrue:ifFalse: example is just a simple and well understood example of having more than one block in your parameter list. I will say that there is a certain kind of semantic elegance that comes from having all your control flow done through methods and objects. Ruby advocates always say that in Ruby &amp;#8220;everything is an object&amp;#8221;, but it appears that blocks and control flow expressions are not, and in this regard Ruby doesn&amp;#8217;t quite live up to expectations set by Smalltalk and LISP.&lt;/p&gt;</description>
      <pubDate>Tue, 12 Sep 2006 10:59:00 -0700</pubDate>
      <guid isPermaLink="false">urn:uuid:e8cc37dd-780e-455b-8d2c-be60d618505e</guid>
      <author>Christopher Smith</author>
      <link>http://xblog.xman.org/articles/2006/09/12/ruby-on-nails-scratching-a-chalkboard</link>
      <category>Programming</category>
      <category>ruby</category>
      <category>smalltalk</category>
      <category>blocks</category>
      <category>proc</category>
      <category>closures</category>
      <trackback:ping>http://xblog.xman.org/articles/trackback/20</trackback:ping>
    </item>
    <item>
      <title>"Ruby On Nails Scratching a Chalkboard" by Jeremy Leader</title>
      <description>&lt;p&gt;&lt;em&gt;Algol -&gt; Fortran -&gt; C -&gt; C++ -&gt; Java -&gt;() C# is a pretty logical progression of languages, and that *is the progression in the mainstream.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I don&amp;#8217;t think I&amp;#8217;d describe Algol as &amp;#8220;mainstream&amp;#8221; in the same sense as the others in that list.  While Algol had a lot of influence in academia and on the design of other languages, the only commercial software development I know of using Algol was on Burroughs/Unisys &amp;#8220;Large Systems&amp;#8221; (aka B6xxx series) mainframes, and the Algol they used was &lt;em&gt;very&lt;/em&gt; non-standard.&lt;/p&gt;

&lt;p&gt;I&amp;#8217;d say the mainstream predecessor to Fortran was various kinds of assembly language (for particular IBM mainframes, but I know little about that world).&lt;/p&gt;</description>
      <pubDate>Fri, 22 Sep 2006 12:38:42 -0700</pubDate>
      <guid isPermaLink="false">urn:uuid:16063f02-4cc7-43e4-a995-0964947e4739</guid>
      <link>http://xblog.xman.org/articles/2006/09/12/ruby-on-nails-scratching-a-chalkboard#comment-82</link>
    </item>
    <item>
      <title>"Ruby On Nails Scratching a Chalkboard" by Dave Newton</title>
      <description>&lt;p&gt;Dammit! Sorry. Server musta been slow and there&amp;#8217;s no indicator to say something is happening; I thought Firefox had locked up.&lt;/p&gt;</description>
      <pubDate>Wed, 20 Sep 2006 18:18:08 -0700</pubDate>
      <guid isPermaLink="false">urn:uuid:f4759cb2-21a1-4e89-ac28-585df90dd5d4</guid>
      <link>http://xblog.xman.org/articles/2006/09/12/ruby-on-nails-scratching-a-chalkboard#comment-78</link>
    </item>
    <item>
      <title>"Ruby On Nails Scratching a Chalkboard" by Dave Newton</title>
      <description>&lt;p&gt;There are also a number of reasonable books that discuss development in Squeak which help out a lot. &lt;/p&gt;

&lt;p&gt;I&amp;#8217;ll have to try the Cincom, though; it would probably generate less resistence to management just because of the way it looks.&lt;/p&gt;</description>
      <pubDate>Wed, 20 Sep 2006 18:17:08 -0700</pubDate>
      <guid isPermaLink="false">urn:uuid:14f08c0a-5d46-4fbb-acf1-8f077e38f54b</guid>
      <link>http://xblog.xman.org/articles/2006/09/12/ruby-on-nails-scratching-a-chalkboard#comment-4</link>
    </item>
    <item>
      <title>"Ruby On Nails Scratching a Chalkboard" by Christopher Smith</title>
      <description>&lt;p&gt;I used to use Smalltalk professionally in days gone by (over a decade ago). I was using Visual Smalltalk which I believe has been discountinued. These days I mostly use Squeak (and I agree that it&amp;#8217;s UI is quite foreign, there is a project to bind it to wxWindows which I watch with great interest) and Seaside for personal web projects, but I&amp;#8217;m experimenting with Cincom (which I&amp;#8217;ve used in the past) and Vista Smalltalk.&lt;/p&gt;

&lt;p&gt;For getting started I usually recommend people use one of Cincom or Squeak. Squeak&amp;#8217;s environment is more foreign, but it does a fantastic job of getting you started. Cincom&amp;#8217;s stuff is more standard fare, but it&amp;#8217;s a more commerical grade experience (well, except for my pain with Linux).&lt;/p&gt;</description>
      <pubDate>Tue, 19 Sep 2006 20:31:55 -0700</pubDate>
      <guid isPermaLink="false">urn:uuid:a2736d97-8fb7-44a4-8ab7-08bbaadd51db</guid>
      <link>http://xblog.xman.org/articles/2006/09/12/ruby-on-nails-scratching-a-chalkboard#comment-61</link>
    </item>
    <item>
      <title>"Ruby On Nails Scratching a Chalkboard" by Dave Newton</title>
      <description>&lt;p&gt;@Elise:&lt;/p&gt;

&lt;p&gt;1) There are lots of reasons; a lot of it boils down to inertia&amp;#8230; Algol -&gt; Fortran -&gt; C -&gt; C++ -&gt; Java -&gt;(&lt;em&gt;) C# is a pretty logical progression of languages, and that *is&lt;/em&gt; the progression in the mainstream. There&amp;#8217;s a few others thrown in there (COBOL, Basic); I&amp;#8217;m speaking in general terms.&lt;/p&gt;

&lt;p&gt;2) Lisp and Smalltalk &lt;em&gt;syntax&lt;/em&gt; isn&amp;#8217;t difficult to grasp at all; like Christopher said, minutes. Wrapping your head around the languages&amp;#8217; &lt;em&gt;concepts&lt;/em&gt; is what takes the effort.&lt;/p&gt;

&lt;p&gt;As you&amp;#8217;ve discovered, Ruby combines things a bit (with a couple of warts :) and may make entry in to one of its &amp;#8220;parents&amp;#8221; easier.&lt;/p&gt;</description>
      <pubDate>Tue, 19 Sep 2006 09:22:35 -0700</pubDate>
      <guid isPermaLink="false">urn:uuid:8f7b0d9f-b47b-4be0-81e1-84477c4aa608</guid>
      <link>http://xblog.xman.org/articles/2006/09/12/ruby-on-nails-scratching-a-chalkboard#comment-84</link>
    </item>
    <item>
      <title>"Ruby On Nails Scratching a Chalkboard" by Elise</title>
      <description>&lt;p&gt;Christopher:&lt;/p&gt;

&lt;p&gt;Your simple explanation has prompted me to dig a bit further this time and try some Smalltalk coding. Thank you.&lt;/p&gt;

&lt;p&gt;The Cincom primer is great (thanks for the link) and the free VisualWorks environment looks appealing (first impression) compared to the open source Squeak Smalltalk environment I&amp;#8217;ve tried in the past. To be fair I haven&amp;#8217;t used either in any depth whatsoever. This comment is purely based on asthetics and my past IDE experience.&lt;/p&gt;

&lt;p&gt;Which Smalltalk do you use and do you use Smalltalk in any professional capacity?&lt;/p&gt;</description>
      <pubDate>Mon, 18 Sep 2006 21:12:07 -0700</pubDate>
      <guid isPermaLink="false">urn:uuid:8c8d142b-c2dd-409c-ba83-dde0763551f4</guid>
      <link>http://xblog.xman.org/articles/2006/09/12/ruby-on-nails-scratching-a-chalkboard#comment-81</link>
    </item>
    <item>
      <title>"Ruby On Nails Scratching a Chalkboard" by Christopher Smith</title>
      <description>&lt;p&gt;Elise:&lt;/p&gt;

&lt;blockquote&gt;Why hasn&amp;#8217;t Lisp or Smalltalk become as mainstream as Java or C++ if they are so powerful&lt;/blockquote&gt;

&lt;p&gt;Well, there is long and tortured history behind each of them, but it&amp;#8217;s worth noting that both of them &lt;em&gt;were&lt;/em&gt; mainstream at various points in time. I think one thing to keep in mind though is that a more powerful language isn&amp;#8217;t always an asset.&lt;/p&gt;

&lt;blockquote&gt;Why is the syntax so difficult to grasp for the uninitiated yet so beautiful to the practicing?&lt;/blockquote&gt;

&lt;p&gt;The beauty comes from the consistency. and simplicity. Honestly, I&amp;#8217;ve always been able to explain the syntax of either to someone in a matter of minutes. The catch is that their syntaxes are both quite different from the BCPL family of languages, which seems to intimidate people. They look alien but I assure you the syntax is far more approachable than most languages. LISP&amp;#8217;s infix notation is a bit weird for arithmetic, but otherwise is pretty similar to procedural code. Smalltalk&amp;#8217;s syntax is different, but it is incredibly simple. You basically only have three different bits of syntax to learn to get started, and there&amp;#8217;s maybe five or six syntactic structures in total. Cincom pretty much sums up the key bits of the syntax on &lt;a href="http://www.cincomsmalltalk.com/tutorials/version7/tutorial1/vwsyntax1.htm" rel="nofollow"&gt;one page&lt;/a&gt;..&lt;/p&gt;</description>
      <pubDate>Sat, 16 Sep 2006 12:13:15 -0700</pubDate>
      <guid isPermaLink="false">urn:uuid:b033bf98-6365-44a4-a8f6-95c28b05b7cb</guid>
      <link>http://xblog.xman.org/articles/2006/09/12/ruby-on-nails-scratching-a-chalkboard#comment-60</link>
    </item>
    <item>
      <title>"Ruby On Nails Scratching a Chalkboard" by Elise</title>
      <description>&lt;p&gt;I admit to not having any Smalltalk or Lisp experience.&lt;/p&gt;

&lt;p&gt;Having experienced Logo, Forth, C, C# Python and Ruby, looking at languages like Lisp and Smalltalk, the syntax often looks alien and unapproachable, hence my lack of progress with them.&lt;/p&gt;

&lt;p&gt;Ruby caused me to look at Smalltalk and Lisp. Yet despite the overwhelming love the proponents have for them, The value is difficult to comprehend. As one commented above, it is highly likely my experience with procedural languages blinds me to the benefits of Lisp, Smalltalk and other non procedural languages although Ruby is now my favorite which mixes these and other programming paradynes.&lt;/p&gt;

&lt;p&gt;So, I have two difficult questions:&lt;/p&gt;

&lt;p&gt;1) Why hasn&amp;#8217;t Lisp or Smalltalk become as mainstream as Java or C++ if they are so powerful?&lt;/p&gt;

&lt;p&gt;2) Why is the syntax so difficult to grasp for the uninitiated yet so beautiful to the practicing?&lt;/p&gt;</description>
      <pubDate>Sat, 16 Sep 2006 11:11:30 -0700</pubDate>
      <guid isPermaLink="false">urn:uuid:39ca916e-e1a3-4ea5-83cb-c69056afd571</guid>
      <link>http://xblog.xman.org/articles/2006/09/12/ruby-on-nails-scratching-a-chalkboard#comment-58</link>
    </item>
    <item>
      <title>"Ruby On Nails Scratching a Chalkboard" by justin</title>
      <description>&lt;p&gt;@Mike B:&lt;/p&gt;

&lt;p&gt;thanks to our good friend whytheluckystiff, one is never without ruby when there is an internet connection available:
&lt;a href="http://tryruby.hobix.com/" rel="nofollow"&gt;http://tryruby.hobix.com/&lt;/a&gt;&lt;/p&gt;</description>
      <pubDate>Sat, 16 Sep 2006 07:56:26 -0700</pubDate>
      <guid isPermaLink="false">urn:uuid:dc84de0c-c554-44f4-b772-7e3ab24bb1f7</guid>
      <link>http://xblog.xman.org/articles/2006/09/12/ruby-on-nails-scratching-a-chalkboard#comment-77</link>
    </item>
    <item>
      <title>"Ruby On Nails Scratching a Chalkboard" by Dave Newton</title>
      <description>&lt;p&gt;I was all excited about learning the secret handshake then you said you were kidding.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;snibble&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;@Christopher: I don&amp;#8217;t think anybody ever said there was anything &lt;em&gt;wrong&lt;/em&gt; with the different approaches, just that you had expected something else and discovered one of Ruby&amp;#8217;s Little Uglies :)&lt;/p&gt;</description>
      <pubDate>Fri, 15 Sep 2006 21:55:39 -0700</pubDate>
      <guid isPermaLink="false">urn:uuid:a1f01e88-6e27-40ea-83a2-e574fe66e716</guid>
      <link>http://xblog.xman.org/articles/2006/09/12/ruby-on-nails-scratching-a-chalkboard#comment-72</link>
    </item>
    <item>
      <title>"Ruby On Nails Scratching a Chalkboard" by Tero</title>
      <description>&lt;p&gt;This whole discussion reminds me of something that went on for months and years in the C++ circles: &amp;#8220;how to build an auto pointer&amp;#8221;. I think the final level in elegance was reached after many articles and rounds of critics and suggestions. Hurrah, we managed to create an auto-pointer class.&lt;/p&gt;

&lt;p&gt;&amp;#8220;Ten different ways to write one line of code that does the same thing in Ruby&amp;#8221; is probably even more hilarious than the auto pointer. No wonder programmers are again drooling over a chance to spend their time on endless niftiness and cool programming tricks which approaches cryptography. &lt;/p&gt;

&lt;p&gt;You could start secret societies that share their wildest Ruby tricks. The sheer obscurity of all the tricks would truely make such societies a hit.&lt;/p&gt;

&lt;p&gt;&amp;#8230;just kidding, of course.&lt;/p&gt;</description>
      <pubDate>Fri, 15 Sep 2006 18:44:55 -0700</pubDate>
      <guid isPermaLink="false">urn:uuid:650b17ac-b274-4803-9bf4-309adba8f30a</guid>
      <link>http://xblog.xman.org/articles/2006/09/12/ruby-on-nails-scratching-a-chalkboard#comment-68</link>
    </item>
    <item>
      <title>"Ruby On Nails Scratching a Chalkboard" by Christopher Smith</title>
      <description>&lt;p&gt;Dave Newton:
If you look at the language grammar for Scheme, say at &lt;a href="http://www.htdp.org/2001-01-18/Book/node43.htm" rel="nofollow"&gt;http://www.htdp.org/2001-01-18/Book/node43.htm&lt;/a&gt; (which doesn&#8217;t use &#8216;if&#8217; but that&#8217;s not important) see how orthagonal it is? See how the keywords simply occupy the same space as non-keywords? Regardless of implementation the syntax doesn&#8217;t change.&lt;/p&gt;

&lt;p&gt;Okay, let&amp;#8217;s some this up:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Ruby has special syntax for control flow statements, &lt;em&gt;not that there is anything wrong with that&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Smalltalk just uses methods and blocks to do all of it&amp;#8217;s control flow statements. Aside from the class library, there is no need to mention them at all in the definition of the language, &lt;em&gt;not that there is anything wrong with that&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;LISP requires special primitives in order to implement control flow (and if you think that&amp;#8217;s wrong, try to implement cond from car and cdr ;-), but the syntax for this primitives is logically consistent with its normal function syntax, so you only bump in to this if in specific cases where you try to treat those primitives like regular functions/symbols, &lt;em&gt;not that there is anything wrong with that&lt;/em&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Can we all pretty much agree on that?&lt;/p&gt;</description>
      <pubDate>Fri, 15 Sep 2006 17:31:24 -0700</pubDate>
      <guid isPermaLink="false">urn:uuid:3c3c112b-232c-4d18-a72d-e7853cf9df39</guid>
      <link>http://xblog.xman.org/articles/2006/09/12/ruby-on-nails-scratching-a-chalkboard#comment-63</link>
    </item>
    <item>
      <title>"Ruby On Nails Scratching a Chalkboard" by Dave Newton</title>
      <description>&lt;p&gt;That simply isn&amp;#8217;t a syntactic construct in the same way if/then/else etc. are, it&amp;#8217;s  a special form that takes two expressions as arguments. That&amp;#8217;s just not how languages with more syntactic noise operate, but whatever. &lt;em&gt;How&lt;/em&gt; it&amp;#8217;s implemented (a special form, in this case) still isn&amp;#8217;t relevent.&lt;/p&gt;

&lt;p&gt;If you look at the language grammar for Scheme, say at &lt;a href="http://www.htdp.org/2001-01-18/Book/node43.htm" rel="nofollow"&gt;http://www.htdp.org/2001-01-18/Book/node43.htm&lt;/a&gt; (which doesn&amp;#8217;t use &amp;#8216;if&amp;#8217; but that&amp;#8217;s not important) see how orthagonal it is? See how the keywords simply occupy the same space as non-keywords? Regardless of &lt;em&gt;implementation&lt;/em&gt; the &lt;em&gt;syntax&lt;/em&gt; doesn&amp;#8217;t change.&lt;/p&gt;</description>
      <pubDate>Fri, 15 Sep 2006 17:22:29 -0700</pubDate>
      <guid isPermaLink="false">urn:uuid:d2c445f2-6d3d-4dad-846b-38a222022611</guid>
      <link>http://xblog.xman.org/articles/2006/09/12/ruby-on-nails-scratching-a-chalkboard#comment-59</link>
    </item>
    <item>
      <title>"Ruby On Nails Scratching a Chalkboard" by Simen</title>
      <description>&lt;p&gt;It does have its own syntax. &lt;a href="http://www.schemers.org/Documents/Standards/R5RS/HTML/r5rs-Z-H-7.html#%_sec_4.1.5" rel="nofollow"&gt;Here&amp;#8217;s&lt;/a&gt; the part that describes it in R5RS. The fact that it all looks the same, and that code is data in Lisp, is irrelevant. This isn&amp;#8217;t implementation-specific.&lt;/p&gt;

&lt;p&gt;The Lisp &amp;#8220;if&amp;#8221; special form can&amp;#8217;t be implemented as a procedure, because Lisp semantics are strict, meaning a value is computed even if there&amp;#8217;s no need for it, contrasting with lazy languages such as Haskell. It can be implemented by macros, though.&lt;/p&gt;

&lt;p&gt;This contrasts with Smalltalk, where ifTrue:ifFalse is a method, used with standard method calling syntax. &lt;/p&gt;



&lt;p&gt;Bottom line, Ruby isn&amp;#8217;t Smalltalk, or Lisp, or Perl, and it doesn&amp;#8217;t try to be, but that block thing sure is annoying.&lt;/p&gt;</description>
      <pubDate>Fri, 15 Sep 2006 15:13:03 -0700</pubDate>
      <guid isPermaLink="false">urn:uuid:9a4c79db-3974-4015-bea7-82f5da5d826a</guid>
      <link>http://xblog.xman.org/articles/2006/09/12/ruby-on-nails-scratching-a-chalkboard#comment-2</link>
    </item>
    <item>
      <title>"Ruby On Nails Scratching a Chalkboard" by Dave Newton</title>
      <description>&lt;p&gt;Its Iimplementation* is irrelevent; it does not have its own syntax, like if/then/else in Ruby and similar languages.&lt;/p&gt;</description>
      <pubDate>Fri, 15 Sep 2006 14:02:28 -0700</pubDate>
      <guid isPermaLink="false">urn:uuid:b27045a6-d6c8-4d01-95a1-e8cdcc1ed831</guid>
      <link>http://xblog.xman.org/articles/2006/09/12/ruby-on-nails-scratching-a-chalkboard#comment-83</link>
    </item>
    <item>
      <title>"Ruby On Nails Scratching a Chalkboard" by Simen</title>
      <description>&lt;p&gt;Dave: no it&amp;#8217;s not. If is a syntactic construct. It just looks like a function because everything in Lisp is a list. Watch, Scheme and Common Lisp:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ csi
   ________    _      __
  / ____/ /_  (_)____/ /_____  ____
 / /   / __ / / ___/ //_/ _ / __ / /___/ / / / / /__/ ,&amp;lt; /  __/ / / /
____/_/ /_/_/___/_/|_|___/_/ /_/

Version 1, Build 63 - linux-unix-gnu-x86
(c)2000-2004 Felix L. Winkelmann
#;&amp;gt; (define my-if if)
Error: unbound variable: if

$ clisp
  i i i i i i i       ooooo    o        ooooooo   ooooo   ooooo
  I I I I I I I      8     8   8           8     8     o  8    8
  I   `+' /  I      8         8           8     8        8    8
     `-+-'  /       8         8           8      ooooo   8oooo
    `-__|__-'        8         8           8           8  8
        |            8     o   8           8     o     8  8
  ------+------       ooooo    8oooooo  ooo8ooo   ooooo   8

Copyright (c) Bruno Haible, Michael Stoll 1992, 1993
Copyright (c) Bruno Haible, Marcus Daniels 1994-1997
Copyright (c) Bruno Haible, Pierpaolo Bernardi, Sam Steingold 1998
Copyright (c) Bruno Haible, Sam Steingold 1999-2000
Copyright (c) Sam Steingold, Bruno Haible 2001-2006

[1]&amp;gt; (defvar my-if #'if)

*** - FUNCTION: undefined function IF
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Christopher: yes, you&amp;#8217;re right, the block thing is stupid, and it has bugged the hell out of me before. &lt;/p&gt;</description>
      <pubDate>Fri, 15 Sep 2006 11:21:20 -0700</pubDate>
      <guid isPermaLink="false">urn:uuid:5cb1ee96-9ada-45bc-a751-0d17b2474b80</guid>
      <link>http://xblog.xman.org/articles/2006/09/12/ruby-on-nails-scratching-a-chalkboard#comment-76</link>
    </item>
    <item>
      <title>"Ruby On Nails Scratching a Chalkboard" by Dave Newton</title>
      <description>&lt;p&gt;I&amp;#8217;m not sure how you&amp;#8217;d implement put:at: like that.&lt;/p&gt;</description>
      <pubDate>Fri, 15 Sep 2006 10:55:14 -0700</pubDate>
      <guid isPermaLink="false">urn:uuid:81ac5185-c734-4c4d-abd4-ba5d6f1432eb</guid>
      <link>http://xblog.xman.org/articles/2006/09/12/ruby-on-nails-scratching-a-chalkboard#comment-144</link>
    </item>
    <item>
      <title>"Ruby On Nails Scratching a Chalkboard" by Peter Cooper</title>
      <description>&lt;p&gt;Just because I&amp;#8217;m enjoying this thread so much, I thought I&amp;#8217;d throw in another pointless, though far more pragmatic, example:&lt;/p&gt;

&lt;pre&gt;puts case (1 + 1 == 2)
        when true: "True"
        when false: "False"
end&lt;/pre&gt;</description>
      <pubDate>Fri, 15 Sep 2006 10:16:23 -0700</pubDate>
      <guid isPermaLink="false">urn:uuid:c95f0b12-2907-450b-8fe9-aa93cc47eb51</guid>
      <link>http://xblog.xman.org/articles/2006/09/12/ruby-on-nails-scratching-a-chalkboard#comment-54</link>
    </item>
    <item>
      <title>"Ruby On Nails Scratching a Chalkboard" by Dave Newton</title>
      <description>&lt;p&gt;@Simen: The difference is that if/then/else in Ruby is an additional syntactic construct. In Lisp it&amp;#8217;s just another function.&lt;/p&gt;

&lt;p&gt;Nobody said Ruby &lt;em&gt;shouldn&amp;#8217;t&lt;/em&gt; have it. The OP was merely trying to compare a particular subset of claims of Ruby&amp;#8217;s Smalltalkiness vs. its implementation, which obviously don&amp;#8217;t match.&lt;/p&gt;

&lt;p&gt;Personally, I don&amp;#8217;t find Ruby to be &lt;em&gt;overly&lt;/em&gt; Smalltalky: things were &lt;em&gt;inspired&lt;/em&gt; by Smalltalk (things like .each, etc.) This isn&amp;#8217;t bad, this just *is*.&lt;/p&gt;

&lt;p&gt;Purists are offended by this (and rightfully so) because it isn&amp;#8217;t pure. That&amp;#8217;s why they&amp;#8217;re called purists. This doesn&amp;#8217;t make Ruby bad. I am a purist, some of the warts are very irritating, and I still prefer Smalltalk and Lisp. But I still find Ruby a very productive environment, because it combines two modes of programming I&amp;#8217;m very familiar with.&lt;/p&gt;

&lt;p&gt;KenM quoted Matz as freely admitting it&amp;#8217;s a bad ripoff of Smalltalk and Lisp. I actually think it&amp;#8217;s a &lt;em&gt;GOOD&lt;/em&gt; ripoff of Smalltalk and Lisp, not because it&amp;#8217;s &amp;#8220;pure&amp;#8221;, but because it&amp;#8217;s &lt;em&gt;productive&lt;/em&gt; and as Matz says, it&amp;#8217;s &amp;#8220;nicer to ordinary people.&amp;#8221;&lt;/p&gt;

&lt;p&gt;Perhaps it&amp;#8217;s a bridge language to bring people into the fold of Smalltalky, Lispy languages. Or maybe it&amp;#8217;s Just Plain Good Enough(tm).&lt;/p&gt;

&lt;p&gt;Either way, pure or not, syntactic warts and all, it has shaken things up, and this can only be a Good Thing.&lt;/p&gt;</description>
      <pubDate>Fri, 15 Sep 2006 08:09:02 -0700</pubDate>
      <guid isPermaLink="false">urn:uuid:43029abf-d3a8-4750-8930-fbba97e64874</guid>
      <link>http://xblog.xman.org/articles/2006/09/12/ruby-on-nails-scratching-a-chalkboard#comment-65</link>
    </item>
    <item>
      <title>"Ruby On Nails Scratching a Chalkboard" by Christopher Smith</title>
      <description>&lt;p&gt;Simen wrote:&lt;/p&gt;

&lt;blockquote&gt;
Also, about the main post: even Lisp, which has virtually no syntax at all, has if/else in its grammar. Why shouldn&#8217;t Ruby?
&lt;/blockquote&gt;

&lt;p&gt;Because Smalltalk doesn&amp;#8217;t. ;-)&lt;/p&gt;

&lt;p&gt;Seriously, I&amp;#8217;ve tried to make this clear several times, but I seem to be failing: I&amp;#8217;m not suggesting that Ruby needs to do if/else the way Smalltalk does. if/else was selected because it&amp;#8217;s a well understood case where two blocks are passed to a function, which is what I am suggesting Ruby should be able to do well. Lambda helps paper over some of the syntactic ugliness, but it&amp;#8217;s still not as clean as LISP or Smalltalk.&lt;/p&gt;</description>
      <pubDate>Fri, 15 Sep 2006 08:03:07 -0700</pubDate>
      <guid isPermaLink="false">urn:uuid:f12c7f2d-cf7b-45c6-a464-b5ff639a0434</guid>
      <link>http://xblog.xman.org/articles/2006/09/12/ruby-on-nails-scratching-a-chalkboard#comment-62</link>
    </item>
    <item>
      <title>"Ruby On Nails Scratching a Chalkboard" by Simen</title>
      <description>&lt;p&gt;In a prototype based language, every object is both a class and an instance. There are only instance variables, and you make a new object by cloning an existing one. The cloned object is linked to as the prototype, like an instance links to a class.&lt;/p&gt;

&lt;p&gt;Also, about the main post: even Lisp, which has virtually no syntax at all, has if/else in its grammar. Why shouldn&amp;#8217;t Ruby?&lt;/p&gt;</description>
      <pubDate>Fri, 15 Sep 2006 05:13:38 -0700</pubDate>
      <guid isPermaLink="false">urn:uuid:86c5b09d-c805-4824-949c-d3a2d102bd6b</guid>
      <link>http://xblog.xman.org/articles/2006/09/12/ruby-on-nails-scratching-a-chalkboard#comment-3</link>
    </item>
    <item>
      <title>"Ruby On Nails Scratching a Chalkboard" by Kirit</title>
      <description>&lt;p&gt;A bit wooly I know, but I was sort of considering the prototype to be the closest thing to a class that the language has.&lt;/p&gt;

&lt;p&gt;I admit to not having thought through too deeply on the difference between prototype languages and other language types, especially about the similarity/differences between the prototypes and classes.&lt;/p&gt;</description>
      <pubDate>Fri, 15 Sep 2006 04:44:05 -0700</pubDate>
      <guid isPermaLink="false">urn:uuid:13a64659-2eaf-483f-8303-697950cdf5d7</guid>
      <link>http://xblog.xman.org/articles/2006/09/12/ruby-on-nails-scratching-a-chalkboard#comment-55</link>
    </item>
    <item>
      <title>"Ruby On Nails Scratching a Chalkboard" by Simen</title>
      <description>&lt;p&gt;Kirit:&lt;/p&gt;

&lt;p&gt;Javascript has only instance methods, because it is prototype based, which means there are no classes. An object&amp;#8217;s prototype is its parent, etc. Self, Slate and Io are examples of prototype based languages.&lt;/p&gt;</description>
      <pubDate>Fri, 15 Sep 2006 00:18:37 -0700</pubDate>
      <guid isPermaLink="false">urn:uuid:c6b04c4e-0310-4f57-b117-75fa0b4893c4</guid>
      <link>http://xblog.xman.org/articles/2006/09/12/ruby-on-nails-scratching-a-chalkboard#comment-79</link>
    </item>
    <item>
      <title>"Ruby On Nails Scratching a Chalkboard" by Kirit</title>
      <description>&lt;blockquote&gt;
    &lt;p&gt;&amp;#8230;feature of Smalltalk Method&#8217;s syntax (or did they call them Messages?)&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;From a terminology perspective Smalltalk has both messages and methods.&lt;/p&gt;

&lt;p&gt;When you write:&lt;/p&gt;

&lt;p&gt;obj para1: some para2: thing&lt;/p&gt;

&lt;p&gt;You are sending a &lt;em&gt;message&lt;/em&gt; called para1: para2: to the object. The message dispatcher then matches this with the para1: para2: &lt;em&gt;method&lt;/em&gt; on the object that receives the message.&lt;/p&gt;

&lt;p&gt;In short the &lt;em&gt;message&lt;/em&gt; is at the call end and the &lt;em&gt;method&lt;/em&gt; is the code that is executed in response to it.&lt;/p&gt;

&lt;p&gt;This &lt;em&gt;message&lt;/em&gt;/&lt;em&gt;method&lt;/em&gt; distinction is built into all OO languages and constructs. How the message dispatcher works is one of the things that distinguishes OO languages.&lt;/p&gt;

&lt;p&gt;Smalltalk&amp;#8217;s message dispatcher is always dynamic and class based. I&amp;#8217;ve heard that the dispatcher can be upgraded to allow instance methods, but I never got it to work.&lt;/p&gt;

&lt;p&gt;Javascript&amp;#8217;s dispatcher allows both class and instance methods whilst C++&amp;#8217;s also adds in static binding (bypassing any dispatcher, or doing the dipatching at compile time depending on how you think about it).&lt;/p&gt;</description>
      <pubDate>Thu, 14 Sep 2006 21:23:47 -0700</pubDate>
      <guid isPermaLink="false">urn:uuid:e05d3d19-9625-42ce-b4c5-2259d7c352e2</guid>
      <link>http://xblog.xman.org/articles/2006/09/12/ruby-on-nails-scratching-a-chalkboard#comment-74</link>
    </item>
    <item>
      <title>"Ruby On Nails Scratching a Chalkboard" by Peter Cooper</title>
      <description>&lt;p&gt;The real downside of this technique is that operators like =~ and cute methods like _ may already be overridden to perform cute syntax hacks like those in my code. Still, just wanted to prove you can kinda contort Ruby into doing whatever you want, even if it&amp;#8217;s not practical for real world use ;-)&lt;/p&gt;</description>
      <pubDate>Thu, 14 Sep 2006 18:05:24 -0700</pubDate>
      <guid isPermaLink="false">urn:uuid:bf6c93eb-6153-4539-a1e8-517804fe6b2b</guid>
      <link>http://xblog.xman.org/articles/2006/09/12/ruby-on-nails-scratching-a-chalkboard#comment-71</link>
    </item>
  </channel>
</rss>
