<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="/stylesheets/rss.css" type="text/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>schuerrer.org Weblog: Tag ruby</title>
    <link>http://blog.schuerrer.org/articles/tag/ruby</link>
    <language>en-us</language>
    <ttl>40</ttl>
    <description>Martin Schuerrer's perspective</description>
    <item>
      <title>Random Updates</title>
      <description>&lt;p&gt;I&amp;#8217;m currently under quite some stress with the approaching final exams, but I&amp;#8217;ve nevertheless two findings worth sharing:&lt;/p&gt;


	&lt;ul&gt;
	&lt;li&gt;&lt;a href="http://www.madewithmolecules.com/serotoninnecklace.html"&gt;Necklaces resembling neurotransmitters&lt;/a&gt;&lt;/li&gt;
		&lt;li&gt;A &lt;a href="http://rbyaml.rubyforge.org/"&gt;&lt;span class="caps"&gt;YAML&lt;/span&gt; parser in pure Ruby&lt;/a&gt;,  that supports using a mapping as a key in one line.&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_default "&gt;[123, 123]: asd&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
This is something &lt;a href="http://whytheluckystiff.net/syck/"&gt;Syck&lt;/a&gt; won&amp;#8217;t parse, although it&amp;#8217;s correct &lt;span class="caps"&gt;YAML&lt;/span&gt;, as xitology from #yaml told me. He also informed me about his SoC project called libyaml, that would be a fast, feature complete alternative to Syck. If Google accepts his proposal he expects a release in 3 to 4 months.&lt;/li&gt;
	&lt;/ul&gt;
</description>
      <pubDate>Wed, 10 May 2006 12:22:00 +0200</pubDate>
      <guid isPermaLink="false">urn:uuid:abe04823-ca2c-4ad4-a17b-9f3f97ce6c5f</guid>
      <author>MSch</author>
      <link>http://blog.schuerrer.org/articles/2006/05/10/random-updates</link>
      <category>ruby</category>
      <category>yaml</category>
      <category>biology</category>
      <trackback:ping>http://blog.schuerrer.org/articles/trackback/47</trackback:ping>
    </item>
    <item>
      <title>How to write DSLs with Ruby</title>
      <description>&lt;p&gt;Recently I needed a &lt;span class="caps"&gt;DSL&lt;/span&gt; like the one in Rake for one of my projects. At first I just googled around a bit hoping to find a comprehensive tutorial. I did gain &lt;a href="http://www.artima.com/rubycs/articles/ruby_as_dslP.html"&gt;some&lt;/a&gt; &lt;a href="http://cubiclecoder.blogspot.com/2005/08/ruby-blocks-dsls-super-cool.html"&gt;more&lt;/a&gt; &lt;a href="http://nat.truemesh.com/archives/000538.html"&gt;or&lt;/a&gt; &lt;a href="http://www.oreillynet.com/ruby/blog/2005/12/what_is_a_dsl.html"&gt;less&lt;/a&gt; &lt;a href="http://www.onestepback.org/articles/lingo/"&gt;useful&lt;/a&gt; insights, but what I wanted was something as clean and coherent as a Rakefile:&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;  &lt;span class="ident"&gt;namespace&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;samples&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt; &lt;span class="keyword"&gt;do&lt;/span&gt;
    &lt;span class="ident"&gt;task&lt;/span&gt; &lt;span class="symbol"&gt;:build&lt;/span&gt; &lt;span class="keyword"&gt;do&lt;/span&gt;
      &lt;span class="comment"&gt;# Build the sample programs&lt;/span&gt;
    &lt;span class="keyword"&gt;end&lt;/span&gt;
  &lt;span class="keyword"&gt;end&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;After reading lots of tutorials and gaining come clues all I managed to code was:&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;  &lt;span class="ident"&gt;namespace&lt;/span&gt; &lt;span class="keyword"&gt;do&lt;/span&gt; &lt;span class="punct"&gt;|&lt;/span&gt;&lt;span class="ident"&gt;n&lt;/span&gt;&lt;span class="punct"&gt;|&lt;/span&gt;
    &lt;span class="ident"&gt;n&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;task&lt;/span&gt; &lt;span class="keyword"&gt;do&lt;/span&gt; &lt;span class="punct"&gt;|&lt;/span&gt;&lt;span class="ident"&gt;t&lt;/span&gt;&lt;span class="punct"&gt;|&lt;/span&gt;
      &lt;span class="comment"&gt;# Build the sample programs&lt;/span&gt;
    &lt;span class="keyword"&gt;end&lt;/span&gt;
  &lt;span class="keyword"&gt;end&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;I felt terrible and started reading the Pickaxe, desperate for a solution. Proc, Binding, Object, Kernel. I was looking everywhere for some clues on how to make my &lt;span class="caps"&gt;DSL&lt;/span&gt; as great as Rake&amp;#8217;s. Finally I found what I was looking for: &lt;a href="http://ruby-doc.org/docs/ProgrammingRuby/html/ref_c_object.html#Object.instance_eval"&gt;&lt;strong&gt;Object#instance_eval&lt;/strong&gt;&lt;/a&gt;!&lt;/p&gt;


	&lt;p&gt;I&amp;#8217;ll spare you any further explainations and present you the source (abridged, &lt;a href="/files/pseudorake.rb"&gt;download full version&lt;/a&gt;) to my &lt;span class="caps"&gt;DSL&lt;/span&gt; implementation:&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;PseudoRakefile&lt;/span&gt;
  &lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;evaluate&lt;/span&gt;&lt;span class="punct"&gt;(&amp;amp;&lt;/span&gt;&lt;span class="ident"&gt;block&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
    &lt;span class="constant"&gt;Tasks&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="punct"&gt;{},&lt;/span&gt; &lt;span class="constant"&gt;self&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="punct"&gt;&amp;amp;&lt;/span&gt;&lt;span class="ident"&gt;block&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
  &lt;span class="keyword"&gt;end&lt;/span&gt;

  &lt;span class="ident"&gt;protected&lt;/span&gt;
  &lt;span class="keyword"&gt;class &lt;/span&gt;&lt;span class="class"&gt;Tasks&lt;/span&gt;
    &lt;span class="ident"&gt;attr_reader&lt;/span&gt; &lt;span class="symbol"&gt;:parent&lt;/span&gt;
    &lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;initialize&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;args&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;options&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;parent&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="punct"&gt;&amp;amp;&lt;/span&gt;&lt;span class="ident"&gt;block&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
      &lt;span class="comment"&gt;# snip&lt;/span&gt;
      &lt;span class="ident"&gt;instance_eval&lt;/span&gt; &lt;span class="punct"&gt;&amp;amp;&lt;/span&gt;&lt;span class="ident"&gt;block&lt;/span&gt;
    &lt;span class="keyword"&gt;end&lt;/span&gt;

    &lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;task&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;task&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;args&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="punct"&gt;{},&lt;/span&gt; &lt;span class="punct"&gt;&amp;amp;&lt;/span&gt;&lt;span class="ident"&gt;block&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
     &lt;span class="constant"&gt;Tasks&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="attribute"&gt;@args&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;merge&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;args&lt;/span&gt;&lt;span class="punct"&gt;),&lt;/span&gt; &lt;span class="attribute"&gt;@options&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;merge&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="symbol"&gt;:task&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="ident"&gt;task&lt;/span&gt;&lt;span class="punct"&gt;),&lt;/span&gt; &lt;span class="constant"&gt;self&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="punct"&gt;&amp;amp;&lt;/span&gt;&lt;span class="ident"&gt;block&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
    &lt;span class="keyword"&gt;end&lt;/span&gt;
    &lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;namespace&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;name&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="punct"&gt;&amp;amp;&lt;/span&gt;&lt;span class="ident"&gt;block&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
      &lt;span class="constant"&gt;Tasks&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="attribute"&gt;@args&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="attribute"&gt;@options&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;merge&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="symbol"&gt;:namespace=&lt;/span&gt;&lt;span class="punct"&gt;&amp;gt;&lt;/span&gt;&lt;span class="ident"&gt;name&lt;/span&gt;&lt;span class="punct"&gt;),&lt;/span&gt; &lt;span class="constant"&gt;self&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="punct"&gt;&amp;amp;&lt;/span&gt;&lt;span class="ident"&gt;block&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
    &lt;span class="keyword"&gt;end&lt;/span&gt;

    &lt;span class="comment"&gt;# snip&lt;/span&gt;
    &lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;puts&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;msg&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
      &lt;span class="constant"&gt;Kernel&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;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;&lt;span class="expr"&gt;#{@options[:namespace]}&lt;/span&gt;:&lt;span class="expr"&gt;#{@options[:task]}&lt;/span&gt; &lt;span class="expr"&gt;#{msg}&lt;/span&gt;&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&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;end&lt;/span&gt;

&lt;span class="ident"&gt;rakefile&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="constant"&gt;PseudoRakefile&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;new&lt;/span&gt;

&lt;span class="ident"&gt;rakefile&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;evaluate&lt;/span&gt; &lt;span class="keyword"&gt;do&lt;/span&gt;
  &lt;span class="ident"&gt;namespace&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;samples&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt; &lt;span class="keyword"&gt;do&lt;/span&gt;
    &lt;span class="ident"&gt;task&lt;/span&gt; &lt;span class="symbol"&gt;:build&lt;/span&gt; &lt;span class="keyword"&gt;do&lt;/span&gt;
      &lt;span class="ident"&gt;develop&lt;/span&gt;&lt;span class="punct"&gt;('&lt;/span&gt;&lt;span class="string"&gt;deal&lt;/span&gt;&lt;span class="punct"&gt;',&lt;/span&gt; &lt;span class="symbol"&gt;:do_it&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="symbol"&gt;:great&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
      &lt;span class="ident"&gt;sleep&lt;/span&gt; &lt;span class="number"&gt;2&lt;/span&gt;
      &lt;span class="ident"&gt;develop&lt;/span&gt;&lt;span class="punct"&gt;('&lt;/span&gt;&lt;span class="string"&gt;solution&lt;/span&gt;&lt;span class="punct"&gt;',&lt;/span&gt; &lt;span class="symbol"&gt;:do_it&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="symbol"&gt;:sloppy&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
    &lt;span class="keyword"&gt;end&lt;/span&gt;
    &lt;span class="ident"&gt;task&lt;/span&gt; &lt;span class="symbol"&gt;:destroy&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="symbol"&gt;:probability&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="number"&gt;1&lt;/span&gt; &lt;span class="keyword"&gt;do&lt;/span&gt;
      &lt;span class="ident"&gt;puts&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;Tear everything down like a little kid&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;
      &lt;span class="ident"&gt;rm&lt;/span&gt;&lt;span class="punct"&gt;(&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;Schroedinger's Cat&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;,&lt;/span&gt; &lt;span class="symbol"&gt;:probability&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="number"&gt;0.5&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
      &lt;span class="ident"&gt;rm&lt;/span&gt;&lt;span class="punct"&gt;(&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;some unimportant file&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;)&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;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;It&amp;#8217;s free to use for anyone, but you&amp;#8217;d make this boy very happy by leaving a comment, especially if you have improved the core idea or actually use my code in your projects.&lt;/p&gt;
</description>
      <pubDate>Sat, 01 Apr 2006 22:51:00 +0200</pubDate>
      <guid isPermaLink="false">urn:uuid:92ef2066-576e-4e9c-bd68-b2112d5bd270</guid>
      <author>MSch</author>
      <link>http://blog.schuerrer.org/articles/2006/04/01/how-to-write-dsls-with-ruby</link>
      <category>ruby</category>
      <category>dsl</category>
      <enclosure length="1547" url="http://blog.schuerrer.org/files/pseudorake.rb" type="application/octet-stream"/>
      <trackback:ping>http://blog.schuerrer.org/articles/trackback/45</trackback:ping>
    </item>
    <item>
      <title>Ruby Extensions Project</title>
      <description>&lt;p&gt;After reading about the &lt;a href="http://extensions.rubyforge.org/rdoc/index.html"&gt;Ruby Extensions Project&lt;/a&gt; in &lt;a href="http://redhanded.hobix.com/inspect/hoppingThroughPipesAndClosures.html"&gt;Why&amp;#8217;s Hopping Through Pipes and Closures&lt;/a&gt;  I decided to try it out.&lt;/p&gt;


	&lt;p&gt;I installed it via &lt;code&gt;gem install -r extensions&lt;/code&gt; and started reading the &lt;a href="http://extensions.rubyforge.org/rdoc/index.html"&gt;documentation&lt;/a&gt;.&lt;/p&gt;


One of the many useful features I stumbled upon is the &lt;a href="http://extensions.rubyforge.org/rdoc/classes/Class.html#M000014"&gt;autoinit&lt;/a&gt; method: In the following example radius, location will be automagically assigned to the corresponding instance variables, while area will have some additional processing applied. And with the saved keystrokes I was able to type this post.
&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;Circle&lt;/span&gt;
  &lt;span class="ident"&gt;attr_reader&lt;/span&gt; &lt;span class="symbol"&gt;:radius&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="symbol"&gt;:location&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="symbol"&gt;:area&lt;/span&gt;
  &lt;span class="ident"&gt;autoinit&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="symbol"&gt;:radius&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="symbol"&gt;:location&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt; &lt;span class="keyword"&gt;do&lt;/span&gt;
    &lt;span class="attribute"&gt;@area&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="constant"&gt;Math&lt;/span&gt;&lt;span class="punct"&gt;::&lt;/span&gt;&lt;span class="constant"&gt;PI&lt;/span&gt; &lt;span class="punct"&gt;*&lt;/span&gt; &lt;span class="attribute"&gt;@radius&lt;/span&gt; &lt;span class="punct"&gt;**&lt;/span&gt; &lt;span class="number"&gt;2&lt;/span&gt;
  &lt;span class="keyword"&gt;end&lt;/span&gt;
&lt;span class="keyword"&gt;end&lt;/span&gt;

&lt;span class="constant"&gt;Circle&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="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="number"&gt;3&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;New with 0.6.0 comes &lt;a href="http://extensions.rubyforge.org/rdoc/classes/Kernel.html#M000039"&gt;require_relative&lt;/a&gt;, which requires a file relative to the file containing the statement.&lt;/p&gt;


	&lt;p&gt;Finally &lt;a href="http://extensions.rubyforge.org/rdoc/classes/Object.html#M000017"&gt;my_object.in? some_other_object&lt;/a&gt; provides a pythonesque way of expressing  some_other_object.include?(my_object).&lt;/p&gt;


	&lt;p&gt;Of course there are many many more features but these are the ones that seem particularly useful to me&lt;/p&gt;
</description>
      <pubDate>Mon, 21 Nov 2005 14:04:00 +0100</pubDate>
      <guid isPermaLink="false">urn:uuid:a27373be-3f98-470f-b926-1d4b607e3ac8</guid>
      <author>MSch</author>
      <link>http://blog.schuerrer.org/articles/2005/11/21/ruby-extensions-project</link>
      <category>ruby</category>
      <trackback:ping>http://blog.schuerrer.org/articles/trackback/1</trackback:ping>
    </item>
  </channel>
</rss>
