<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://msmvps.com/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Angel "Java" Lopez : Lenguajes de Programaci&amp;#243;n, Proyectos de C&amp;#243;digo Abierto</title><link>http://msmvps.com/blogs/lopez/archive/tags/Lenguajes+de+Programaci_26002300_243_3B00_n/Proyectos+de+C_26002300_243_3B00_digo+Abierto/default.aspx</link><description>Tags: Lenguajes de Programaci&amp;#243;n, Proyectos de C&amp;#243;digo Abierto</description><dc:language>en</dc:language><generator>CommunityServer 2008.5 SP2 (Build: 40407.4157)</generator><item><title>RubySharp, implementando Ruby en C# (1)</title><link>http://msmvps.com/blogs/lopez/archive/2013/06/03/rubysharp-implementando-ruby-en-c-1.aspx</link><pubDate>Mon, 03 Jun 2013 09:48:09 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1832247</guid><dc:creator>lopez</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/lopez/rsscomments.aspx?PostID=1832247</wfw:commentRss><comments>http://msmvps.com/blogs/lopez/archive/2013/06/03/rubysharp-implementando-ruby-en-c-1.aspx#comments</comments><description>&lt;p&gt;Ya saben que todos los días hago commit en mi cuenta de GitHub:&lt;/p&gt;  &lt;p&gt;&lt;a href="https://github.com/ajlopez"&gt;https://github.com/ajlopez&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;para entrenarme en practicar programación, lenguajes y TDD (no se olviden de eso, hagan TDD!)&lt;/p&gt;  &lt;p&gt;Desde hace unos tres meses, más o menos, estoy trabajando intermitentente en RubySharp:&lt;/p&gt;  &lt;p&gt;&lt;a href="https://github.com/ajlopez/RubySharp"&gt;https://github.com/ajlopez/RubySharp&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;un intérprete Ruby escrito en C# (como &lt;a href="https://github.com/ajlopez/PythonSharp"&gt;PythonSharp&lt;/a&gt;, ver &lt;a href="http://msmvps.com/blogs/lopez/archive/tags/PythonSharp/default.aspx"&gt;posts&lt;/a&gt;). Hay dos soluciones, una con tests, y otra sin tests, para que puedan compilar con un Visual Studio Express (lo mío es un apostolado ;-). La solución con tests:&lt;/p&gt;  &lt;p&gt;&lt;img src="http://www.ajlopez.com/images/articles2/rubysharp01.png" alt="" /&gt; &lt;/p&gt;  &lt;p&gt;Vean que tengo comandos y expresiones. Voy a revisar esa separación, al igual que comentaba en otro post sobre el lenguaje Mass: en Ruby todo es un valor, y así los comandos son expresiones. Agrego algo: &lt;a href="http://msmvps.com/blogs/lopez/archive/tags/Mass/default.aspx"&gt;el lenguaje Mass&lt;/a&gt; derivó de una simplificación de este trabajo.&lt;/p&gt;  &lt;p&gt;Como siempre, escribo con tests:&lt;/p&gt;  &lt;p&gt;&lt;img src="http://www.ajlopez.com/images/articles2/rubysharp02.png" alt="" /&gt; &lt;/p&gt;  &lt;p&gt;Y para que vean que no les “hago el verso” con lo de TDD, pueden siempre vigilar mis commits:&lt;/p&gt;  &lt;p&gt;&lt;a href="https://github.com/ajlopez/RubySharp/commits/master"&gt;https://github.com/ajlopez/RubySharp/commits/master&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Próximos posts: detalles de implementación, ejemplos de uso (especialmente para scripting sobre .NET).&lt;/p&gt;  &lt;p&gt;Nos leemos!&lt;/p&gt;  &lt;p&gt;Angel “Java” Lopez    &lt;br /&gt;&lt;a href="http://www.ajlopez.com"&gt;http://www.ajlopez.com&lt;/a&gt;     &lt;br /&gt;&lt;a href="http://twitter.com/ajlopez"&gt;http://twitter.com/ajlopez&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1832247" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/lopez/archive/tags/C+Sharp/default.aspx">C Sharp</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/Lenguajes+de+Programaci_26002300_243_3B00_n/default.aspx">Lenguajes de Programaci&amp;#243;n</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/TDD/default.aspx">TDD</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/Proyectos+de+C_26002300_243_3B00_digo+Abierto/default.aspx">Proyectos de C&amp;#243;digo Abierto</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/Ruby/default.aspx">Ruby</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/RubySharp/default.aspx">RubySharp</category></item><item><title>Mass Lenguaje de Programación (4) Lexer y Parser</title><link>http://msmvps.com/blogs/lopez/archive/2013/05/12/mass-lenguaje-de-programaci-243-n-4-lexer-y-parser.aspx</link><pubDate>Sun, 12 May 2013 08:40:21 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1830015</guid><dc:creator>lopez</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/lopez/rsscomments.aspx?PostID=1830015</wfw:commentRss><comments>http://msmvps.com/blogs/lopez/archive/2013/05/12/mass-lenguaje-de-programaci-243-n-4-lexer-y-parser.aspx#comments</comments><description>&lt;p&gt;&lt;a href="http://msmvps.com/blogs/lopez/archive/2013/04/28/mass-lenguaje-de-programaci-243-n-3-comandos.aspx"&gt;Anterior Post&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;En la implementación del lenguaje Mass, tengo una enumeración y una clase:&lt;/p&gt;  &lt;p&gt;&lt;img src="http://www.ajlopez.com/images/articles2/mass0401.jpg" alt="" /&gt; &lt;/p&gt;  &lt;p&gt;Un Token representa una palabra del código a procesar. El encargado de separar el código en palabras es el Lexer. Y con el Parser se transforma esa corriente de Tokens en expresiones y comandos:&lt;/p&gt;  &lt;p&gt;&lt;img src="http://www.ajlopez.com/images/articles2/mass0402.jpg" alt="" /&gt; &lt;/p&gt;  &lt;p&gt;El constructor de Lexer recibe un string:&lt;/p&gt;  &lt;pre style="background-color:black;width:600px;color:white;font-size:10pt;"&gt;&lt;span style="color:orange;"&gt;public&lt;/span&gt; Lexer&lt;span style="color:cyan;"&gt;(&lt;/span&gt;&lt;span style="color:orange;"&gt;string&lt;/span&gt; text&lt;span style="color:cyan;"&gt;)&lt;/span&gt;
&lt;span style="color:cyan;"&gt;{&lt;/span&gt;
    &lt;span style="color:orange;"&gt;this&lt;/span&gt;.text = text&lt;span style="color:cyan;"&gt;;&lt;/span&gt;
&lt;span style="color:cyan;"&gt;}&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;Y ese string es procesado para separarlo en tokens. Vean que el Lexer distingue entre operadores (como +) y separadores (como los paréntesis). También toma en cuenta al fin de línea como token (en otros lenguajes, como C, un fin de línea se puede tomar como un espacio en blanco en muchas situaciones). El principal método de Lexer es NextToken, que devuelve el próximo Token del texto. En algunas pocas situaciones, se hace necesario devolver el Token consumido, y para eso está PushToken y varianes.&lt;/p&gt;

&lt;p&gt;El Parser interamente maneja un Lexer. Le podemos pedir el próximo comando con ParseCommand, y la próxima expresión con ParseExpression. Cuando el texto en proceso se acaba, esos métodos devuelven null.&lt;/p&gt;

&lt;p&gt;Voy a modificar el Lexer para consumir un stream de texto, para poder procesar, por ejemplo, entrada de consola&lt;/p&gt;

&lt;p&gt;Tengo que seguir pensando si internamente, unifico comandos y expresiones, como pasa en Ruby, donde cada “comando” tiene un valor (en Mass también es así), y no solamente eso, sino que puede ser usado como expresión en el contexto de un comando.&lt;/p&gt;

&lt;p&gt;Nos leemos!&lt;/p&gt;

&lt;p&gt;Angel “Java” Lopez 
  &lt;br /&gt;&lt;a href="http://www.ajlopez.com"&gt;http://www.ajlopez.com&lt;/a&gt; 

  &lt;br /&gt;&lt;a href="http://twitter.com/ajlopez"&gt;http://twitter.com/ajlopez&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1830015" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/lopez/archive/tags/.NET/default.aspx">.NET</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/C+Sharp/default.aspx">C Sharp</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/Lenguajes+de+Programaci_26002300_243_3B00_n/default.aspx">Lenguajes de Programaci&amp;#243;n</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/TDD/default.aspx">TDD</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/Proyectos+de+C_26002300_243_3B00_digo+Abierto/default.aspx">Proyectos de C&amp;#243;digo Abierto</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/Mass/default.aspx">Mass</category></item><item><title>Mass Lenguaje de Programación (3) Comandos</title><link>http://msmvps.com/blogs/lopez/archive/2013/04/28/mass-lenguaje-de-programaci-243-n-3-comandos.aspx</link><pubDate>Sun, 28 Apr 2013 11:24:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1828666</guid><dc:creator>lopez</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/lopez/rsscomments.aspx?PostID=1828666</wfw:commentRss><comments>http://msmvps.com/blogs/lopez/archive/2013/04/28/mass-lenguaje-de-programaci-243-n-3-comandos.aspx#comments</comments><description>&lt;p&gt;&lt;a href="http://msmvps.com/blogs/lopez/archive/2013/04/27/mass-lenguaje-de-programaci-243-n-2-primeras-expresiones.aspx"&gt;Anterior Post&amp;nbsp;&lt;/a&gt;&amp;nbsp;&lt;br /&gt;&lt;a href="http://msmvps.com/blogs/lopez/archive/2013/05/12/mass-lenguaje-de-programaci-243-n-4-lexer-y-parser.aspx"&gt;Siguiente Post&lt;/a&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Veamos hoy c&amp;oacute;mo est&amp;aacute;n implementados los comandos en Mass (&lt;a href="http://github.com/ajlopez/Mass"&gt;ver repo&lt;/a&gt;). En el proyecto de librer&amp;iacute;a de clases, tengo:&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.ajlopez.com/images/articles2/mass0301.png" alt="" /&gt; &lt;/p&gt;
&lt;p&gt;Hay comandos para if, while, for, for each, etc&amp;hellip;. Todos implementan la interfaz ICommand:&lt;/p&gt;
&lt;pre style="background-color:black;color:white;"&gt;&lt;span style="color:orange;"&gt;public&lt;/span&gt; &lt;span style="color:orange;"&gt;interface&lt;/span&gt; ICommand
&lt;span style="color:cyan;"&gt;{&lt;/span&gt;
    &lt;span style="color:orange;"&gt;object&lt;/span&gt; Execute&lt;span style="color:cyan;"&gt;(&lt;/span&gt;Context context&lt;span style="color:cyan;"&gt;);&lt;/span&gt;
&lt;span style="color:cyan;"&gt;}&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;Vean que es muy parecido a IExpression. Igual quise mantener comandos y expresiones por separado, por lo menos en esta primera implementaci&amp;oacute;n, para tener un claro delineamiento de los conceptos de base del lenguaje.&lt;/p&gt;
&lt;p&gt;Un ejemplo t&amp;iacute;pico de comando es el WhileCommand (parte del c&amp;oacute;digo):&lt;/p&gt;
&lt;pre style="background-color:black;color:white;"&gt;&lt;span style="color:orange;"&gt;public&lt;/span&gt; &lt;span style="color:orange;"&gt;class&lt;/span&gt; WhileCommand : ICommand
&lt;span style="color:cyan;"&gt;{&lt;/span&gt;
    &lt;span style="color:orange;"&gt;private&lt;/span&gt; &lt;span style="color:orange;"&gt;static&lt;/span&gt; &lt;span style="color:orange;"&gt;int&lt;/span&gt; hashcode = &lt;span style="color:orange;"&gt;typeof&lt;/span&gt;&lt;span style="color:cyan;"&gt;(&lt;/span&gt;WhileCommand&lt;span style="color:cyan;"&gt;)&lt;/span&gt;.GetHashCode&lt;span style="color:cyan;"&gt;();&lt;/span&gt;

    &lt;span style="color:orange;"&gt;private&lt;/span&gt; IExpression condition&lt;span style="color:cyan;"&gt;;&lt;/span&gt;
    &lt;span style="color:orange;"&gt;private&lt;/span&gt; ICommand command&lt;span style="color:cyan;"&gt;;&lt;/span&gt;

    &lt;span style="color:orange;"&gt;public&lt;/span&gt; WhileCommand&lt;span style="color:cyan;"&gt;(&lt;/span&gt;IExpression condition&lt;span style="color:cyan;"&gt;,&lt;/span&gt; ICommand command&lt;span style="color:cyan;"&gt;)&lt;/span&gt;
    &lt;span style="color:cyan;"&gt;{&lt;/span&gt;
        &lt;span style="color:orange;"&gt;this&lt;/span&gt;.condition = condition&lt;span style="color:cyan;"&gt;;&lt;/span&gt;
        &lt;span style="color:orange;"&gt;this&lt;/span&gt;.command = command&lt;span style="color:cyan;"&gt;;&lt;/span&gt;
    &lt;span style="color:cyan;"&gt;}&lt;/span&gt;

    &lt;span style="color:orange;"&gt;public&lt;/span&gt; &lt;span style="color:orange;"&gt;object&lt;/span&gt; Execute&lt;span style="color:cyan;"&gt;(&lt;/span&gt;Context context&lt;span style="color:cyan;"&gt;)&lt;/span&gt;
    &lt;span style="color:cyan;"&gt;{&lt;/span&gt;
        &lt;span style="color:orange;"&gt;for&lt;/span&gt; &lt;span style="color:cyan;"&gt;(&lt;/span&gt;&lt;span style="color:orange;"&gt;object&lt;/span&gt; value = &lt;span style="color:orange;"&gt;this&lt;/span&gt;.condition.Evaluate&lt;span style="color:cyan;"&gt;(&lt;/span&gt;context&lt;span style="color:cyan;"&gt;);&lt;/span&gt; 
            value &lt;span style="color:cyan;"&gt;!&lt;/span&gt;= &lt;span style="color:orange;"&gt;null&lt;/span&gt; &lt;span style="color:cyan;"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span style="color:cyan;"&gt;!&lt;/span&gt;&lt;span style="color:orange;"&gt;false&lt;/span&gt;.Equals&lt;span style="color:cyan;"&gt;(&lt;/span&gt;value&lt;span style="color:cyan;"&gt;);&lt;/span&gt;
            value = &lt;span style="color:orange;"&gt;this&lt;/span&gt;.condition.Evaluate&lt;span style="color:cyan;"&gt;(&lt;/span&gt;context&lt;span style="color:cyan;"&gt;))&lt;/span&gt;
        &lt;span style="color:cyan;"&gt;{&lt;/span&gt;
            &lt;span style="color:orange;"&gt;this&lt;/span&gt;.command.Execute&lt;span style="color:cyan;"&gt;(&lt;/span&gt;context&lt;span style="color:cyan;"&gt;);&lt;/span&gt;
            &lt;span style="color:orange;"&gt;if&lt;/span&gt; &lt;span style="color:cyan;"&gt;(&lt;/span&gt;context.HasContinue&lt;span style="color:cyan;"&gt;())&lt;/span&gt;
                context.ClearContinue&lt;span style="color:cyan;"&gt;();&lt;/span&gt;
            &lt;span style="color:orange;"&gt;if&lt;/span&gt; &lt;span style="color:cyan;"&gt;(&lt;/span&gt;context.HasBreak&lt;span style="color:cyan;"&gt;())&lt;/span&gt;
            &lt;span style="color:cyan;"&gt;{&lt;/span&gt;
                context.ClearBreak&lt;span style="color:cyan;"&gt;();&lt;/span&gt;
                &lt;span style="color:orange;"&gt;break&lt;/span&gt;&lt;span style="color:cyan;"&gt;;&lt;/span&gt;
            &lt;span style="color:cyan;"&gt;}&lt;/span&gt;
        &lt;span style="color:cyan;"&gt;}&lt;/span&gt;

        &lt;span style="color:orange;"&gt;return&lt;/span&gt; &lt;span style="color:orange;"&gt;null&lt;/span&gt;&lt;span style="color:cyan;"&gt;;&lt;/span&gt;
    &lt;span style="color:cyan;"&gt;}&lt;/span&gt;
&lt;span style="color:cyan;"&gt;}&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;Para Mass: cualquier valor null o false es falso. Todo lo dem&amp;aacute;s es verdadero. Un tema a refactorizar: poner un m&amp;eacute;todo IsFalse para se usado tanto en la implementaci&amp;oacute;n de While como de If.&lt;/p&gt;
&lt;p&gt;Otro ejemplo es el ForEachCommand (parte del c&amp;oacute;digo):&lt;/p&gt;
&lt;pre style="background-color:black;color:white;"&gt;&lt;span style="color:orange;"&gt;public&lt;/span&gt; &lt;span style="color:orange;"&gt;class&lt;/span&gt; ForEachCommand : ICommand
&lt;span style="color:cyan;"&gt;{&lt;/span&gt;
    &lt;span style="color:orange;"&gt;private&lt;/span&gt; &lt;span style="color:orange;"&gt;string&lt;/span&gt; name&lt;span style="color:cyan;"&gt;;&lt;/span&gt;
    &lt;span style="color:orange;"&gt;private&lt;/span&gt; IExpression expression&lt;span style="color:cyan;"&gt;;&lt;/span&gt;
    &lt;span style="color:orange;"&gt;private&lt;/span&gt; ICommand command&lt;span style="color:cyan;"&gt;;&lt;/span&gt;

    &lt;span style="color:orange;"&gt;public&lt;/span&gt; ForEachCommand&lt;span style="color:cyan;"&gt;(&lt;/span&gt;&lt;span style="color:orange;"&gt;string&lt;/span&gt; name&lt;span style="color:cyan;"&gt;,&lt;/span&gt; IExpression expression&lt;span style="color:cyan;"&gt;,&lt;/span&gt; ICommand command&lt;span style="color:cyan;"&gt;)&lt;/span&gt;
    &lt;span style="color:cyan;"&gt;{&lt;/span&gt;
        &lt;span style="color:orange;"&gt;this&lt;/span&gt;.name = name&lt;span style="color:cyan;"&gt;;&lt;/span&gt;
        &lt;span style="color:orange;"&gt;this&lt;/span&gt;.expression = expression&lt;span style="color:cyan;"&gt;;&lt;/span&gt;
        &lt;span style="color:orange;"&gt;this&lt;/span&gt;.command = command&lt;span style="color:cyan;"&gt;;&lt;/span&gt;
    &lt;span style="color:cyan;"&gt;}&lt;/span&gt;

    &lt;span style="color:orange;"&gt;public&lt;/span&gt; &lt;span style="color:orange;"&gt;object&lt;/span&gt; Execute&lt;span style="color:cyan;"&gt;(&lt;/span&gt;Context context&lt;span style="color:cyan;"&gt;)&lt;/span&gt;
    &lt;span style="color:cyan;"&gt;{&lt;/span&gt;
        var values = &lt;span style="color:cyan;"&gt;(&lt;/span&gt;IEnumerable&lt;span style="color:cyan;"&gt;)&lt;/span&gt;&lt;span style="color:orange;"&gt;this&lt;/span&gt;.expression.Evaluate&lt;span style="color:cyan;"&gt;(&lt;/span&gt;context&lt;span style="color:cyan;"&gt;);&lt;/span&gt;

        &lt;span style="color:orange;"&gt;foreach&lt;/span&gt; &lt;span style="color:cyan;"&gt;(&lt;/span&gt;var value &lt;span style="color:orange;"&gt;in&lt;/span&gt; values&lt;span style="color:cyan;"&gt;)&lt;/span&gt;
        &lt;span style="color:cyan;"&gt;{&lt;/span&gt;
            context.Set&lt;span style="color:cyan;"&gt;(&lt;/span&gt;&lt;span style="color:orange;"&gt;this&lt;/span&gt;.name&lt;span style="color:cyan;"&gt;,&lt;/span&gt; value&lt;span style="color:cyan;"&gt;);&lt;/span&gt;
            &lt;span style="color:orange;"&gt;this&lt;/span&gt;.command.Execute&lt;span style="color:cyan;"&gt;(&lt;/span&gt;context&lt;span style="color:cyan;"&gt;);&lt;/span&gt;
            &lt;span style="color:orange;"&gt;if&lt;/span&gt; &lt;span style="color:cyan;"&gt;(&lt;/span&gt;context.HasContinue&lt;span style="color:cyan;"&gt;())&lt;/span&gt;
                context.ClearContinue&lt;span style="color:cyan;"&gt;();&lt;/span&gt;
            &lt;span style="color:orange;"&gt;if&lt;/span&gt; &lt;span style="color:cyan;"&gt;(&lt;/span&gt;context.HasBreak&lt;span style="color:cyan;"&gt;())&lt;/span&gt;
            &lt;span style="color:cyan;"&gt;{&lt;/span&gt;
                context.ClearBreak&lt;span style="color:cyan;"&gt;();&lt;/span&gt;
                &lt;span style="color:orange;"&gt;break&lt;/span&gt;&lt;span style="color:cyan;"&gt;;&lt;/span&gt;
            &lt;span style="color:cyan;"&gt;}&lt;/span&gt;
        &lt;span style="color:cyan;"&gt;}&lt;/span&gt;

        &lt;span style="color:orange;"&gt;return&lt;/span&gt; &lt;span style="color:orange;"&gt;null&lt;/span&gt;&lt;span style="color:cyan;"&gt;;&lt;/span&gt;
    &lt;span style="color:cyan;"&gt;}&lt;/span&gt;
&lt;span style="color:cyan;"&gt;}&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;Vean que para Mass, todo lo que sea IEnumerable se puede usar para ser consumido por este comando. Tuve que poner algunos datos en el contexto, para saber si se hab&amp;iacute;a hecho un break o un continue.&lt;/p&gt;
&lt;p&gt;Y como siempre, todo esto desarrollado con TDD: pueden &lt;a href="https://github.com/ajlopez/Mass/commits/master"&gt;ver los commits del repo&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Pr&amp;oacute;ximos posts: Lexer y Parser, ejemplos de Mass para scripting.&lt;/p&gt;
&lt;p&gt;Nos leemos!&lt;/p&gt;
&lt;p&gt;Angel &amp;ldquo;Java&amp;rdquo; Lopez 
  &lt;br /&gt;&lt;a href="http://www.ajlopez.com"&gt;http://www.ajlopez.com&lt;/a&gt; 
  &lt;br /&gt;&lt;a href="http://twitter.com/ajlopez"&gt;http://twitter.com/ajlopez&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1828666" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/lopez/archive/tags/.NET/default.aspx">.NET</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/C+Sharp/default.aspx">C Sharp</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/Lenguajes+de+Programaci_26002300_243_3B00_n/default.aspx">Lenguajes de Programaci&amp;#243;n</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/TDD/default.aspx">TDD</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/Proyectos+de+C_26002300_243_3B00_digo+Abierto/default.aspx">Proyectos de C&amp;#243;digo Abierto</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/Mass/default.aspx">Mass</category></item><item><title>Mass Lenguaje de Programación (2) Primeras Expresiones</title><link>http://msmvps.com/blogs/lopez/archive/2013/04/27/mass-lenguaje-de-programaci-243-n-2-primeras-expresiones.aspx</link><pubDate>Sat, 27 Apr 2013 13:26:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1828597</guid><dc:creator>lopez</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/lopez/rsscomments.aspx?PostID=1828597</wfw:commentRss><comments>http://msmvps.com/blogs/lopez/archive/2013/04/27/mass-lenguaje-de-programaci-243-n-2-primeras-expresiones.aspx#comments</comments><description>&lt;p&gt;&lt;a href="http://msmvps.com/blogs/lopez/archive/2013/04/08/mass-lenguaje-de-programaci-243-n-1-or-237-genes.aspx"&gt;Anterior Post&amp;nbsp;&lt;/a&gt;&amp;nbsp;&lt;br /&gt;&lt;a href="http://msmvps.com/blogs/lopez/archive/2013/04/28/mass-lenguaje-de-programaci-243-n-3-comandos.aspx"&gt;Siguiente Post&lt;/a&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Antes de ver c&amp;oacute;mo usar el lenguaje Mass (&lt;a href="http://github.com/ajlopez/Mass"&gt;ver repo&lt;/a&gt;), quisiera tratar algunos temas de implementaci&amp;oacute;n. Primero, una novedad: ahora hay una soluci&amp;oacute;n (en &lt;a href="https://github.com/ajlopez/Mass/blob/master/Src/Mass.sln"&gt;https://github.com/ajlopez/Mass/blob/master/Src/Mass.sln&lt;/a&gt;) que puede compilarse con alg&amp;uacute;n Visual Studio C# Express, de libre bajada e instalaci&amp;oacute;n.&lt;/p&gt;
&lt;p&gt;La soluci&amp;oacute;n Mass tiene un proyecto de librer&amp;iacute;a de clases. Ah&amp;iacute; hay un namespace dedicado a expresiones:&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.ajlopez.com/images/articles2/mass0201.png" alt="" /&gt; &lt;/p&gt;
&lt;p&gt;Una expresi&amp;oacute;n es algo que cumple con IExpression:&lt;/p&gt;
&lt;pre style="background-color:black;width:600px;color:white;"&gt;&lt;span&gt;&amp;nbsp; &lt;/span&gt;
&lt;span style="color:orange;"&gt;public&lt;/span&gt; &lt;span style="color:orange;"&gt;interface&lt;/span&gt; IExpression
&lt;span style="color:cyan;"&gt;{&lt;/span&gt;
	&lt;span style="color:orange;"&gt;object&lt;/span&gt; Evaluate&lt;span style="color:cyan;"&gt;(&lt;/span&gt;Context context&lt;span style="color:cyan;"&gt;);&lt;/span&gt;
&lt;span style="color:cyan;"&gt;}&lt;/span&gt;
&lt;span&gt;&amp;nbsp; &lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;Un Context mantiene un diccionario de nombre/valor, para guardar las variables actuales:&lt;/p&gt;
&lt;pre style="background-color:black;width:600px;color:white;"&gt;&lt;span&gt;&amp;nbsp; &lt;/span&gt;
&lt;span style="color:orange;"&gt;public&lt;/span&gt; &lt;span style="color:orange;"&gt;void&lt;/span&gt; Set&lt;span style="color:cyan;"&gt;(&lt;/span&gt;&lt;span style="color:orange;"&gt;string&lt;/span&gt; name&lt;span style="color:cyan;"&gt;,&lt;/span&gt; &lt;span style="color:orange;"&gt;object&lt;/span&gt; value&lt;span style="color:cyan;"&gt;)&lt;/span&gt;
&lt;span style="color:cyan;"&gt;{&lt;/span&gt;
	&lt;span style="color:orange;"&gt;this&lt;/span&gt;.values&lt;span style="color:cyan;"&gt;[&lt;/span&gt;name&lt;span style="color:cyan;"&gt;]&lt;/span&gt; = value&lt;span style="color:cyan;"&gt;;&lt;/span&gt;
&lt;span style="color:cyan;"&gt;}&lt;/span&gt;

&lt;span style="color:orange;"&gt;public&lt;/span&gt; &lt;span style="color:orange;"&gt;object&lt;/span&gt; Get&lt;span style="color:cyan;"&gt;(&lt;/span&gt;&lt;span style="color:orange;"&gt;string&lt;/span&gt; name&lt;span style="color:cyan;"&gt;)&lt;/span&gt;
&lt;span style="color:cyan;"&gt;{&lt;/span&gt;
	&lt;span style="color:orange;"&gt;if&lt;/span&gt; &lt;span style="color:cyan;"&gt;(&lt;/span&gt;&lt;span style="color:orange;"&gt;this&lt;/span&gt;.values.ContainsKey&lt;span style="color:cyan;"&gt;(&lt;/span&gt;name&lt;span style="color:cyan;"&gt;))&lt;/span&gt;
		&lt;span style="color:orange;"&gt;return&lt;/span&gt; &lt;span style="color:orange;"&gt;this&lt;/span&gt;.values&lt;span style="color:cyan;"&gt;[&lt;/span&gt;name&lt;span style="color:cyan;"&gt;];&lt;/span&gt;

	&lt;span style="color:orange;"&gt;if&lt;/span&gt; &lt;span style="color:cyan;"&gt;(&lt;/span&gt;&lt;span style="color:orange;"&gt;this&lt;/span&gt;.parent &lt;span style="color:cyan;"&gt;!&lt;/span&gt;= &lt;span style="color:orange;"&gt;null&lt;/span&gt;&lt;span style="color:cyan;"&gt;)&lt;/span&gt;
		&lt;span style="color:orange;"&gt;return&lt;/span&gt; &lt;span style="color:orange;"&gt;this&lt;/span&gt;.parent.Get&lt;span style="color:cyan;"&gt;(&lt;/span&gt;name&lt;span style="color:cyan;"&gt;);&lt;/span&gt;

	&lt;span style="color:orange;"&gt;return&lt;/span&gt; &lt;span style="color:orange;"&gt;null&lt;/span&gt;&lt;span style="color:cyan;"&gt;;&lt;/span&gt;
&lt;span style="color:cyan;"&gt;}&lt;/span&gt;
&lt;span&gt;&amp;nbsp; &lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;(vean de refil&amp;oacute;n, que soporta contextos anidados: cada contexto puede &amp;ldquo;heredar&amp;rdquo; de un contexto parent).&lt;/p&gt;
&lt;p&gt;La expresi&amp;oacute;n m&amp;aacute;s simple es la que devuelve una constante, que puede ser cualquier valor/objecto .NET:&lt;/p&gt;
&lt;pre style="background-color:black;width:600px;color:white;"&gt;&lt;span&gt;&amp;nbsp; &lt;/span&gt;
&lt;span style="color:orange;"&gt;public&lt;/span&gt; &lt;span style="color:orange;"&gt;class&lt;/span&gt; ConstantExpression : IExpression
&lt;span style="color:cyan;"&gt;{&lt;/span&gt;
	// ...

	&lt;span style="color:orange;"&gt;private&lt;/span&gt; &lt;span style="color:orange;"&gt;object&lt;/span&gt; value&lt;span style="color:cyan;"&gt;;&lt;/span&gt;

	&lt;span style="color:orange;"&gt;public&lt;/span&gt; ConstantExpression&lt;span style="color:cyan;"&gt;(&lt;/span&gt;&lt;span style="color:orange;"&gt;object&lt;/span&gt; value&lt;span style="color:cyan;"&gt;)&lt;/span&gt;
	&lt;span style="color:cyan;"&gt;{&lt;/span&gt;
		&lt;span style="color:orange;"&gt;this&lt;/span&gt;.value = value&lt;span style="color:cyan;"&gt;;&lt;/span&gt;
	&lt;span style="color:cyan;"&gt;}&lt;/span&gt;

	&lt;span style="color:orange;"&gt;public&lt;/span&gt; &lt;span style="color:orange;"&gt;object&lt;/span&gt; Evaluate&lt;span style="color:cyan;"&gt;(&lt;/span&gt;Context context&lt;span style="color:cyan;"&gt;)&lt;/span&gt;
	&lt;span style="color:cyan;"&gt;{&lt;/span&gt;
		&lt;span style="color:orange;"&gt;return&lt;/span&gt; &lt;span style="color:orange;"&gt;this&lt;/span&gt;.value&lt;span style="color:cyan;"&gt;;&lt;/span&gt;
	&lt;span style="color:cyan;"&gt;}&lt;/span&gt;

	// ...
&lt;span style="color:cyan;"&gt;}&lt;/span&gt;
&lt;span&gt;&amp;nbsp; &lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;La siguiente expresi&amp;oacute;n m&amp;aacute;s simple es la evaluaci&amp;oacute;n de un nombre de variable en el contexto actual:&lt;/p&gt;
&lt;pre style="background-color:black;width:600px;color:white;"&gt;&lt;span&gt;&amp;nbsp; &lt;/span&gt;
&lt;span style="color:orange;"&gt;public&lt;/span&gt; &lt;span style="color:orange;"&gt;class&lt;/span&gt; NameExpression : IExpression
&lt;span style="color:cyan;"&gt;{&lt;/span&gt;
	// ...
	
	&lt;span style="color:orange;"&gt;private&lt;/span&gt; &lt;span style="color:orange;"&gt;string&lt;/span&gt; name&lt;span style="color:cyan;"&gt;;&lt;/span&gt;

	&lt;span style="color:orange;"&gt;public&lt;/span&gt; NameExpression&lt;span style="color:cyan;"&gt;(&lt;/span&gt;&lt;span style="color:orange;"&gt;string&lt;/span&gt; name&lt;span style="color:cyan;"&gt;)&lt;/span&gt;
	&lt;span style="color:cyan;"&gt;{&lt;/span&gt;
		&lt;span style="color:orange;"&gt;this&lt;/span&gt;.name = name&lt;span style="color:cyan;"&gt;;&lt;/span&gt;
	&lt;span style="color:cyan;"&gt;}&lt;/span&gt;

	&lt;span style="color:orange;"&gt;public&lt;/span&gt; &lt;span style="color:orange;"&gt;object&lt;/span&gt; Evaluate&lt;span style="color:cyan;"&gt;(&lt;/span&gt;Context context&lt;span style="color:cyan;"&gt;)&lt;/span&gt;
	&lt;span style="color:cyan;"&gt;{&lt;/span&gt;
		&lt;span style="color:orange;"&gt;return&lt;/span&gt; context.Get&lt;span style="color:cyan;"&gt;(&lt;/span&gt;&lt;span style="color:orange;"&gt;this&lt;/span&gt;.name&lt;span style="color:cyan;"&gt;);&lt;/span&gt;
	&lt;span style="color:cyan;"&gt;}&lt;/span&gt;
	
	// ...
&lt;span style="color:cyan;"&gt;}&lt;/span&gt;
&lt;span&gt;&amp;nbsp; &lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;Es necesario especificar el contexto (por ejemplo, el contexto de la funci&amp;oacute;n actual, de una clausura, del objeto actual, del m&amp;oacute;dulo actual, etc), porque un mismo nombre puede tener distintas variables asociadas, como pasa en otros lenguajes.&lt;/p&gt;
&lt;p&gt;Como siempre, cada una de estas clases (Expresiones, Contexto, &amp;hellip;) fue armada usando el flujo de trabajo de TDD (ver el proyecto de tests, y la &lt;a href="https://github.com/ajlopez/Mass/commits/master"&gt;historia de commits del repo&lt;/a&gt; donde dej&amp;eacute; evidencia de c&amp;oacute;mo fue el desarrollo en el tiempo).&lt;/p&gt;
&lt;p&gt;Pr&amp;oacute;ximos posts: algunas expresiones adicionales, comandos, usando Mass para scripting, usando Mass desde nuestro programa .NET, etc..&lt;/p&gt;
&lt;p&gt;Nos leemos!&lt;/p&gt;
&lt;p&gt;Angel &amp;ldquo;Java&amp;rdquo; Lopez 
  &lt;br /&gt;&lt;a href="http://www.ajlopez.com"&gt;http://www.ajlopez.com&lt;/a&gt; 
  &lt;br /&gt;&lt;a href="http://twitter.com/ajlopez"&gt;http://twitter.com/ajlopez&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1828597" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/lopez/archive/tags/.NET/default.aspx">.NET</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/C+Sharp/default.aspx">C Sharp</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/Lenguajes+de+Programaci_26002300_243_3B00_n/default.aspx">Lenguajes de Programaci&amp;#243;n</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/TDD/default.aspx">TDD</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/Proyectos+de+C_26002300_243_3B00_digo+Abierto/default.aspx">Proyectos de C&amp;#243;digo Abierto</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/Mass/default.aspx">Mass</category></item><item><title>Mass Lenguaje de Programación (1) Orígenes</title><link>http://msmvps.com/blogs/lopez/archive/2013/04/08/mass-lenguaje-de-programaci-243-n-1-or-237-genes.aspx</link><pubDate>Mon, 08 Apr 2013 10:43:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1826814</guid><dc:creator>lopez</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/lopez/rsscomments.aspx?PostID=1826814</wfw:commentRss><comments>http://msmvps.com/blogs/lopez/archive/2013/04/08/mass-lenguaje-de-programaci-243-n-1-or-237-genes.aspx#comments</comments><description>&lt;p&gt;&lt;a href="http://msmvps.com/blogs/lopez/archive/2013/04/27/mass-lenguaje-de-programaci-243-n-2-primeras-expresiones.aspx"&gt;Siguiente Post&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Durante estos d&amp;iacute;as, estuve trabajando en la implementaci&amp;oacute;n de un lenguaje interpretado, sobre C#, llamado Mass (dedicado al bueno de &lt;a href="http://twitter.com/martinsalias"&gt;@MArtinSaliaS&lt;/a&gt;):&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/ajlopez/Mass"&gt;https://github.com/ajlopez/Mass&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.ajlopez.com/images/articles2/mass0101.png" alt="" /&gt; &lt;/p&gt;
&lt;p&gt;La soluci&amp;oacute;n actual se compone de tres proyectos: una librer&amp;iacute;a de clases, sus tests, y un programa de consola, mass.exe, para lanzar programas Mass&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.ajlopez.com/images/articles2/mass0102.png" alt="" /&gt; &lt;/p&gt;
&lt;p&gt;Pueden lanzar un programa escrito en un archivo hello.ms con&lt;/p&gt;
&lt;pre style="background-color:black;width:600px;color:white;"&gt;mass hello.ms&lt;/pre&gt;
&lt;p&gt;El cl&amp;aacute;sico Hello world es entonces&lt;/p&gt;
&lt;pre style="background-color:black;width:600px;color:white;"&gt;println&lt;span style="color:cyan;"&gt;(&lt;/span&gt;&lt;span style="color:lightgreen;"&gt;&amp;quot;Hello, world&amp;quot;&lt;/span&gt;&lt;span style="color:cyan;"&gt;)&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;Un ejemplo con clases y objetos&lt;/p&gt;
&lt;pre style="background-color:black;width:600px;color:white;"&gt;&lt;span style="color:orange;"&gt;class&lt;/span&gt; Person
	&lt;span style="color:orange;"&gt;define&lt;/span&gt; initialize&lt;span style="color:cyan;"&gt;(&lt;/span&gt;firstname&lt;span style="color:cyan;"&gt;,&lt;/span&gt; lastname&lt;span style="color:cyan;"&gt;)&lt;/span&gt;
		self.firstname = firstname
		self.lastname = lastname
	&lt;span style="color:orange;"&gt;end&lt;/span&gt;
	
	&lt;span style="color:orange;"&gt;define&lt;/span&gt; getName&lt;span style="color:cyan;"&gt;()&lt;/span&gt;
		&lt;span style="color:orange;"&gt;return&lt;/span&gt; self.lastname + &lt;span style="color:lightgreen;"&gt;&amp;quot;, &amp;quot;&lt;/span&gt; + self.firstname
	&lt;span style="color:orange;"&gt;end&lt;/span&gt;
&lt;span style="color:orange;"&gt;end&lt;/span&gt;

adam = new Person&lt;span style="color:cyan;"&gt;(&lt;/span&gt;&lt;span style="color:lightgreen;"&gt;&amp;quot;Adam&amp;quot;&lt;/span&gt;&lt;span style="color:cyan;"&gt;,&lt;/span&gt; &lt;span style="color:lightgreen;"&gt;&amp;quot;TheFirst&amp;quot;&lt;/span&gt;&lt;span style="color:cyan;"&gt;)&lt;/span&gt;

println&lt;span style="color:cyan;"&gt;(&lt;/span&gt;adam.getName&lt;span style="color:cyan;"&gt;())&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;Un ejemplo con acceso a tipos y objectos .NET:&lt;/p&gt;
&lt;pre style="background-color:black;width:600px;color:white;"&gt;dirinfo = new System.IO.DirectoryInfo&lt;span style="color:cyan;"&gt;(&lt;/span&gt;&lt;span style="color:lightgreen;"&gt;&amp;quot;.&amp;quot;&lt;/span&gt;&lt;span style="color:cyan;"&gt;)&lt;/span&gt;

&lt;span style="color:orange;"&gt;for&lt;/span&gt; fileinfo in dirinfo.GetFiles&lt;span style="color:cyan;"&gt;()&lt;/span&gt;
	println&lt;span style="color:cyan;"&gt;(&lt;/span&gt;fileinfo.Name&lt;span style="color:cyan;"&gt;)&lt;/span&gt;
&lt;span style="color:orange;"&gt;end&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;La idea es (como en AjSharp y otras implementaciones) tener un lenguaje din&amp;aacute;mico montado sobre un lenguaje/librer&amp;iacute;a de clases. Y poder acceder a esa librer&amp;iacute;a de clases desde el nuevo lenguaje. Me llev&amp;oacute; a escribir Mass de la forma en que lo hice, el haber trabajado antes en:&lt;/p&gt;
&lt;p&gt;- Implementar Python en C# (ver &lt;a href="https://github.com/ajlopez/PythonSharp"&gt;PythonSharp&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;- Implementar Ruby en C# (ver &lt;a href="https://github.com/ajlopez/RubySharp"&gt;RubySharp&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;- El ya mencionado AjSharp (ver &lt;a href="https://github.com/ajlopez/AjSharp"&gt;repo&lt;/a&gt; y &lt;a href="http://msmvps.com/blogs/lopez/archive/tags/AjSharp/default.aspx"&gt;posts&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;Pero esta vez quer&amp;iacute;a implementar algo que tuviera sintaxis y sem&amp;aacute;ntica simple. Ya estuve pensando en eso de &amp;ldquo;simple&amp;rdquo; para implementar un compilador de lenguaje simple a JavaScript &lt;a href="http://msmvps.com/blogs/lopez/archive/2013/01/03/simplescript-1-primeras-ideas.aspx"&gt;ver SimpleScript&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Entonces con Mass me propuse evitar:&lt;/p&gt;
&lt;p&gt;- M&amp;uacute;ltiples comandos en la misma l&amp;iacute;nea (descart&amp;eacute; el &amp;lsquo;;&amp;rsquo; de Ruby)&lt;/p&gt;
&lt;p&gt;- Sintaxis basada en espacios en blanco, indentaci&amp;oacute;n (descartado Python)&lt;/p&gt;
&lt;p&gt;- Llamadas a funciones con simplemente el nombre: se necesita expl&amp;iacute;citamente los par&amp;eacute;ntesis (descartado el Ruby cl&amp;aacute;sico)&lt;/p&gt;
&lt;p&gt;- Que las clases/valores de base (por ejemplo, enteros, strings, arreglos, etc&amp;hellip;) tuvieran multitud de m&amp;eacute;todos (tienen los dados por la librer&amp;iacute;a de clases de implementaci&amp;oacute;n, en este caso .NET) (descartado Ruby, que tiene casi tantos m&amp;eacute;todos nativos como PHP)&lt;/p&gt;
&lt;p&gt;Y quise tener:&lt;/p&gt;
&lt;p&gt;- Valores funcionales, como ciudadanos de primera clase, como en JavaScript. Vean que al tener que invocar una funci&amp;oacute;n con par&amp;eacute;ntesis, si o si, entonces la variable func tiene el valor funcional, y func() es la invocaci&amp;oacute;n expl&amp;iacute;cita&lt;/p&gt;
&lt;p&gt;- Objectos din&amp;aacute;micos: cada objeto puede extenderse en cualquier momento, con nuevas variables de instancia, funciones propias del objeto, como JavaScript&lt;/p&gt;
&lt;p&gt;- Sintaxis basada en l&amp;iacute;neas: cada comando va en una l&amp;iacute;nea distinta&lt;/p&gt;
&lt;p&gt;- Sintaxis basada en palabras claves: para los comandos compuestos se usa &amp;lsquo;end&amp;rsquo; para terminar un bloque&lt;/p&gt;
&lt;p&gt;- En lo posible, una sola forma de hacer algo, en vez de m&amp;uacute;ltiples maneras&lt;/p&gt;
&lt;p&gt;- Palabras claves completas, &amp;lsquo;define&amp;rsquo; en vez de &amp;lsquo;def&amp;rsquo;&lt;/p&gt;
&lt;p&gt;- Clases con herencia simple (aunque la esencia de Mass bien puede expresarse sin clases, y usar librer&amp;iacute;as de clases ya escritas en .NET)&lt;/p&gt;
&lt;p&gt;- Modificaci&amp;oacute;n expl&amp;iacute;cita de variables fuera del alcance local (para explicar en pr&amp;oacute;ximos posts)&lt;/p&gt;
&lt;p&gt;- Alcance de variables por archivo, como en JavaScript/NodeJs/CommonJS&lt;/p&gt;
&lt;p&gt;- M&amp;oacute;dulos por archivo, con un require que permite buscar en directorios autom&amp;aacute;ticamente, como en NodeJs/CommonJS&lt;/p&gt;
&lt;p&gt;- Empaquetamiento, manejo de dependencias e instalaci&amp;oacute;n de esos m&amp;oacute;dulos usando algo ya dado, como NPM, el manejador de paquetes de Node.js&lt;/p&gt;
&lt;p&gt;En pr&amp;oacute;ximos posts, m&amp;aacute;s detalles de implementaci&amp;oacute;n, ideas que guiaron el dise&amp;ntilde;o, ejemplos. Pero ya pueden ver el c&amp;oacute;digo, y los ejemplos que est&amp;aacute;n en los tests (s&amp;iacute;, est&amp;aacute; todo construido paso a paso usando TDD).&lt;/p&gt;
&lt;p&gt;Nos leemos!&lt;/p&gt;
&lt;p&gt;Angel &amp;ldquo;Java&amp;rdquo; Lopez 
  &lt;br /&gt;&lt;a href="http://www.ajlopez.com"&gt;http://www.ajlopez.com&lt;/a&gt; 
  &lt;br /&gt;&lt;a href="http://twitter.com/ajlopez"&gt;http://twitter.com/ajlopez&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1826814" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/lopez/archive/tags/.NET/default.aspx">.NET</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/C+Sharp/default.aspx">C Sharp</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/Lenguajes+de+Programaci_26002300_243_3B00_n/default.aspx">Lenguajes de Programaci&amp;#243;n</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/TDD/default.aspx">TDD</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/Proyectos+de+C_26002300_243_3B00_digo+Abierto/default.aspx">Proyectos de C&amp;#243;digo Abierto</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/Mass/default.aspx">Mass</category></item><item><title>Escribiendo un Intérprete en .NET (Parte 10)</title><link>http://msmvps.com/blogs/lopez/archive/2013/03/18/escribiendo-un-int-233-rprete-en-net-parte-10.aspx</link><pubDate>Mon, 18 Mar 2013 09:50:56 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1825406</guid><dc:creator>lopez</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/lopez/rsscomments.aspx?PostID=1825406</wfw:commentRss><comments>http://msmvps.com/blogs/lopez/archive/2013/03/18/escribiendo-un-int-233-rprete-en-net-parte-10.aspx#comments</comments><description>&lt;p&gt;Anteriores posts de la serie:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://msmvps.com/blogs/lopez/archive/2011/01/28/writing_2D00_an_2D00_interpreter_2D00_in_2D00_net_2D00_part_2D00_9.aspx"&gt;Escribiendo un Intérprete en .NET (Parte 9)&lt;/a&gt;    &lt;br /&gt;&lt;a href="http://msmvps.com/blogs/lopez/archive/2011/01/20/writing_2D00_an_2D00_interpreter_2D00_in_2D00_net_2D00_part_2D00_8.aspx"&gt;Escribiendo un Intérprete en .NET (Parte 8)&lt;/a&gt;    &lt;br /&gt;&lt;a href="http://msmvps.com/blogs/lopez/archive/2010/10/05/escribiendo-un-int-233-rprete-en-net-parte-7.aspx"&gt;Escribiendo un Intérprete en .NET (Parte 7)&lt;/a&gt;    &lt;br /&gt;&lt;a href="http://msmvps.com/blogs/lopez/archive/2010/09/21/escribiendo-un-int-233-rprete-en-net-parte-6.aspx"&gt;Escribiendo un Intérprete en .NET (Parte 6)&lt;/a&gt;    &lt;br /&gt;&lt;a href="http://msmvps.com/blogs/lopez/archive/2010/09/20/escribiendo-un-int-233-rprete-en-net-parte-5.aspx"&gt;Escribiendo un Intérprete en .NET (Parte 5)&lt;/a&gt;    &lt;br /&gt;&lt;a href="http://msmvps.com/blogs/lopez/archive/2010/09/18/escribiendo-un-int-233-rprete-en-net.aspx"&gt;Escribiendo un Intérprete en .NET (Parte 4)&lt;/a&gt;    &lt;br /&gt;&lt;a href="http://msmvps.com/blogs/lopez/archive/2010/09/17/escribiendo-un-int-233-rprete-en-net-parte-3.aspx"&gt;Escribiendo un Intérprete en .NET (Parte 3)&lt;/a&gt;    &lt;br /&gt;&lt;a href="http://msmvps.com/blogs/lopez/archive/2010/09/16/escribiendo-un-int-233-rprete-en-net-parte-2.aspx"&gt;Escribiendo un Intérprete en .NET (Parte 2)&lt;/a&gt;    &lt;br /&gt;&lt;a href="http://msmvps.com/blogs/lopez/archive/2010/09/15/escribiendo-un-int-233-rprete-en-net-parte-1.aspx"&gt;Escribiendo un Intérprete en .NET (Parte 1)&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Hace unos meses que no escribo en esta serie, pero es porque he directamente escrito varios intérpretes, usando TDD, y haciendo “commits” prácticamente por tests en &lt;a href="https://github.com/ajlopez"&gt;mi cuenta de GitHub&lt;/a&gt;, siguiendo las ideas de esos posts.&lt;/p&gt;  &lt;p&gt;Intérpretes que estoy escribiendo, parecidos al descripto en los posts, son:&lt;/p&gt;  &lt;p&gt;&lt;a href="https://github.com/ajlopez/PythonSharp"&gt;PythonSharp&lt;/a&gt; (ver &lt;a href="https://github.com/ajlopez/PythonSharp/commits/master"&gt;los commits&lt;/a&gt;) (lo presenté en la PyCon Argentina 2012)&lt;/p&gt;  &lt;p&gt;&lt;a href="https://github.com/ajlopez/RubySharp"&gt;RubySharp&lt;/a&gt; (ver &lt;a href="https://github.com/ajlopez/RubySharp/commits/master"&gt;los commits&lt;/a&gt;)&lt;/p&gt;  &lt;p&gt;Y para un ejemplo de un lenguaje diferente, vean una implementación de &lt;a href="http://clojure.org/"&gt;Clojure&lt;/a&gt; que estoy escribiendo en C#:&lt;/p&gt;  &lt;p&gt;&lt;a href="https://github.com/ajlopez/ClojSharp"&gt;ClojSharp&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Por ejemplo, hoy escribi un nuevo verbo de ClojSharp, la que se llama “let special form”, tienen los commits por tests de hoy:&lt;/p&gt;  &lt;p&gt;&lt;a title="https://github.com/ajlopez/ClojSharp/commits/master" href="https://github.com/ajlopez/ClojSharp/commits/master"&gt;https://github.com/ajlopez/ClojSharp/commits/master&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;img src="http://www.ajlopez.com/images/articles2/interpreter50.png" alt="" /&gt; &lt;/p&gt;  &lt;p&gt;Pueden ver uno en:&lt;/p&gt;  &lt;p&gt;&lt;a title="https://github.com/ajlopez/ClojSharp/commit/51c678ece96d6d1cef92f36afda8d8fc711ffd8c" href="https://github.com/ajlopez/ClojSharp/commit/51c678ece96d6d1cef92f36afda8d8fc711ffd8c"&gt;https://github.com/ajlopez/ClojSharp/commit/51c678ece96d6d1cef92f36afda8d8fc711ffd8c&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;donde GitHub nos muestra los cambios en el código. &lt;/p&gt;  &lt;p&gt;Otro ejemplo, lo que hice ayer, test por test, en RubySharp:&lt;/p&gt;  &lt;p&gt;&lt;a title="https://github.com/ajlopez/RubySharp/commits/master" href="https://github.com/ajlopez/RubySharp/commits/master"&gt;https://github.com/ajlopez/RubySharp/commits/master&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;img src="http://www.ajlopez.com/images/articles2/interpreter51.png" alt="" /&gt; &lt;/p&gt;  &lt;p&gt;Espero que estos ejemplos les sirvan para ir viendo cómo se puede usar TDD para este tipo de proyectos. Tengo más ejemplos de otros tipos de aplicaciones &lt;a href="http://msmvps.com/blogs/lopez/archive/tags/TDD/default.aspx"&gt;en mis posts de TDD&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;Nos leemos!&lt;/p&gt;  &lt;p&gt;Angel “Java” Lopez   &lt;br /&gt;&lt;a href="http://www.ajlopez.com"&gt;http://www.ajlopez.com&lt;/a&gt;    &lt;br /&gt;&lt;a href="http://twitter.com/ajlopez"&gt;http://twitter.com/ajlopez&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1825406" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/lopez/archive/tags/.NET/default.aspx">.NET</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/C+Sharp/default.aspx">C Sharp</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/Lenguajes+de+Programaci_26002300_243_3B00_n/default.aspx">Lenguajes de Programaci&amp;#243;n</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/TDD/default.aspx">TDD</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/Proyectos+de+C_26002300_243_3B00_digo+Abierto/default.aspx">Proyectos de C&amp;#243;digo Abierto</category></item><item><title>CobolScript (4) Páginas Web con Plantillas, en Node.js</title><link>http://msmvps.com/blogs/lopez/archive/2013/01/21/cobolscript-4-p-225-ginas-web-con-plantillas-en-node-js.aspx</link><pubDate>Mon, 21 Jan 2013 17:10:44 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1822948</guid><dc:creator>lopez</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/lopez/rsscomments.aspx?PostID=1822948</wfw:commentRss><comments>http://msmvps.com/blogs/lopez/archive/2013/01/21/cobolscript-4-p-225-ginas-web-con-plantillas-en-node-js.aspx#comments</comments><description>&lt;p&gt;&lt;a href="http://msmvps.com/blogs/lopez/archive/2012/12/30/cobolscript_2D00_3_2D00_templates.aspx"&gt;Anterior Post&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;En el anterior post mostré a CobolScript generando salida basada en plantillas. Hoy quiero mostrar que eso se puede usar para generar páginas web. El ejemplo está en:&lt;/p&gt;  &lt;p&gt;&lt;a title="https://github.com/ajlopez/CobolScript/tree/master/samples/templateweb" href="https://github.com/ajlopez/CobolScript/tree/master/samples/templateweb"&gt;https://github.com/ajlopez/CobolScript/tree/master/samples/templateweb&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;El programa a ejecutar es simple:&lt;/p&gt;  &lt;pre style="background-color:black;color:white;font-size:12pt;"&gt;&lt;span style="color:orange;"&gt;var&lt;/span&gt; cobs = require&lt;span style="color:cyan;"&gt;(&lt;/span&gt;&lt;span style="color:lightgreen;"&gt;&amp;#39;../..&amp;#39;&lt;/span&gt;&lt;span style="color:cyan;"&gt;),&lt;/span&gt;
    http = require&lt;span style="color:cyan;"&gt;(&lt;/span&gt;&lt;span style="color:lightgreen;"&gt;&amp;#39;http&amp;#39;&lt;/span&gt;&lt;span style="color:cyan;"&gt;),&lt;/span&gt;
    fs = require&lt;span style="color:cyan;"&gt;(&lt;/span&gt;&lt;span style="color:lightgreen;"&gt;&amp;#39;fs&amp;#39;&lt;/span&gt;&lt;span style="color:cyan;"&gt;);&lt;/span&gt;

&lt;span style="color:orange;"&gt;var&lt;/span&gt; program = cobs.compileTemplateFile&lt;span style="color:cyan;"&gt;(&lt;/span&gt;&lt;span style="color:lightgreen;"&gt;&amp;#39;./factorial.cobp&amp;#39;&lt;/span&gt;&lt;span style="color:cyan;"&gt;);&lt;/span&gt;

http.createServer&lt;span style="color:cyan;"&gt;(&lt;/span&gt;&lt;span style="color:orange;"&gt;function&lt;/span&gt;&lt;span style="color:cyan;"&gt;(&lt;/span&gt;req&lt;span style="color:cyan;"&gt;,&lt;/span&gt; res&lt;span style="color:cyan;"&gt;)&lt;/span&gt; &lt;span style="color:cyan;"&gt;{&lt;/span&gt;
    program.run&lt;span style="color:cyan;"&gt;(&lt;/span&gt;cobs.getRuntime&lt;span style="color:cyan;"&gt;({&lt;/span&gt; request: req&lt;span style="color:cyan;"&gt;,&lt;/span&gt; response: res &lt;span style="color:cyan;"&gt;}));&lt;/span&gt;
&lt;span style="color:cyan;"&gt;})&lt;/span&gt;.listen&lt;span style="color:cyan;"&gt;(&lt;/span&gt;8000&lt;span style="color:cyan;"&gt;);&lt;/span&gt;

console.log&lt;span style="color:cyan;"&gt;(&lt;/span&gt;&lt;span style="color:lightgreen;"&gt;&amp;#39;Server started, listening at port 8000&amp;#39;&lt;/span&gt;&lt;span style="color:cyan;"&gt;);&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;La parte clave es la llamada a compilar el archivo de plantilla. Esto produce una función JavaScript ya compilada, que puede invocarse varias veces. El llamado program.run ejecuta la plantilla ya compilada, dado un contexto de ejecución (“runtime context”). Ese contexto es armado en cada pedido web, dándole los objectos request y response de ese pedido. El contexto se arma internamente, de manera tal que toda la salida producida por el programa CobolScript se deriva a la salida del response. De esta manera, el programa no sabe nada de web, sólo genera texto. Podemos ver a este contexto de ejecución como un proveedor de servicios para el programa CobolScript. Sus propiedades pueden ser accedidas si definimos una LINKAGE SECTION como en COBOL clásico. Pero eso sería tema para otro post. Ese acceso no fue necesario en este simple ejemplo.&lt;/p&gt;

&lt;p&gt;El archivo de plantilla contiene:&lt;/p&gt;

&lt;pre style="background-color:black;color:white;font-size:12pt;"&gt;&lt;span style="color:cyan;"&gt;&amp;lt;&lt;/span&gt;h1&lt;span style="color:cyan;"&gt;&amp;gt;&lt;/span&gt;Factorial&lt;span style="color:cyan;"&gt;&amp;lt;&lt;/span&gt;/h1&lt;span style="color:cyan;"&gt;&amp;gt;&lt;/span&gt;
&lt;span style="color:cyan;"&gt;&amp;lt;&lt;/span&gt;p&lt;span style="color:cyan;"&gt;&amp;gt;&lt;/span&gt;Page generated &lt;span style="color:orange;"&gt;by&lt;/span&gt; CobolScript&lt;span style="color:cyan;"&gt;,&lt;/span&gt; &lt;span style="color:orange;"&gt;using&lt;/span&gt; templates&lt;span style="color:cyan;"&gt;&amp;lt;&lt;/span&gt;/p&lt;span style="color:cyan;"&gt;&amp;gt;&lt;/span&gt;
&lt;span style="color:cyan;"&gt;&amp;lt;&lt;/span&gt;table&lt;span style="color:cyan;"&gt;&amp;gt;&lt;/span&gt;
&lt;span style="color:cyan;"&gt;&amp;lt;&lt;/span&gt;tr&lt;span style="color:cyan;"&gt;&amp;gt;&amp;lt;&lt;/span&gt;th align=&lt;span style="color:cyan;"&gt;&amp;#39;&lt;/span&gt;right&lt;span style="color:cyan;"&gt;&amp;#39;&amp;gt;&lt;/span&gt;n&lt;span style="color:cyan;"&gt;&amp;lt;&lt;/span&gt;/th&lt;span style="color:cyan;"&gt;&amp;gt;&amp;lt;&lt;/span&gt;th align=&lt;span style="color:cyan;"&gt;&amp;#39;&lt;/span&gt;right&lt;span style="color:cyan;"&gt;&amp;#39;&amp;gt;&lt;/span&gt;n&lt;span style="color:cyan;"&gt;!
&amp;lt;&lt;/span&gt;/th&lt;span style="color:cyan;"&gt;&amp;gt;
&amp;lt;&lt;/span&gt;/tr&lt;span style="color:cyan;"&gt;&amp;gt;&lt;/span&gt;
&lt;span style="color:cyan;"&gt;&amp;lt;#&lt;/span&gt;
&lt;span style="color:orange;"&gt;local&lt;/span&gt; n.
&lt;span style="color:orange;"&gt;perform&lt;/span&gt; show-factorial &lt;span style="color:orange;"&gt;using&lt;/span&gt; n &lt;span style="color:orange;"&gt;varying&lt;/span&gt; n &lt;span style="color:orange;"&gt;from&lt;/span&gt; 1 &lt;span style="color:orange;"&gt;to&lt;/span&gt; 10.
&lt;span style="color:cyan;"&gt;#&amp;gt;&lt;/span&gt;
&lt;span style="color:cyan;"&gt;&amp;lt;&lt;/span&gt;/table&lt;span style="color:cyan;"&gt;&amp;gt;&lt;/span&gt;
&lt;span style="color:cyan;"&gt;&amp;lt;#&lt;/span&gt;
.
stop run.

show-factorial &lt;span style="color:orange;"&gt;section&lt;/span&gt; &lt;span style="color:orange;"&gt;using&lt;/span&gt; n.
&lt;span style="color:orange;"&gt;local&lt;/span&gt; result.
&lt;span style="color:orange;"&gt;perform&lt;/span&gt; factorial &lt;span style="color:orange;"&gt;using&lt;/span&gt; n &lt;span style="color:orange;"&gt;giving&lt;/span&gt; result.
&lt;span style="color:cyan;"&gt;#&amp;gt;&lt;/span&gt;
&lt;span style="color:cyan;"&gt;&amp;lt;&lt;/span&gt;tr&lt;span style="color:cyan;"&gt;&amp;gt;
&amp;lt;&lt;/span&gt;td align=&lt;span style="color:cyan;"&gt;&amp;#39;&lt;/span&gt;right&lt;span style="color:cyan;"&gt;&amp;#39;&amp;gt;${&lt;/span&gt;n&lt;span style="color:cyan;"&gt;}&amp;lt;&lt;/span&gt;/td&lt;span style="color:cyan;"&gt;&amp;gt;&amp;lt;&lt;/span&gt;td align=&lt;span style="color:cyan;"&gt;&amp;#39;&lt;/span&gt;right&lt;span style="color:cyan;"&gt;&amp;#39;&amp;gt;${&lt;/span&gt;result&lt;span style="color:cyan;"&gt;}
&amp;lt;&lt;/span&gt;/td&lt;span style="color:cyan;"&gt;&amp;gt;
&amp;lt;&lt;/span&gt;/tr&lt;span style="color:cyan;"&gt;&amp;gt;&lt;/span&gt;
&lt;span style="color:cyan;"&gt;&amp;lt;#&lt;/span&gt;
.

factorial &lt;span style="color:orange;"&gt;section&lt;/span&gt; &lt;span style="color:orange;"&gt;using&lt;/span&gt; n.
&lt;span style="color:orange;"&gt;local&lt;/span&gt; m.
&lt;span style="color:orange;"&gt;if&lt;/span&gt; n = 1 &lt;span style="color:orange;"&gt;then&lt;/span&gt; &lt;span style="color:orange;"&gt;return&lt;/span&gt; n.
&lt;span style="color:orange;"&gt;subtract&lt;/span&gt; 1 &lt;span style="color:orange;"&gt;from&lt;/span&gt; n &lt;span style="color:orange;"&gt;giving&lt;/span&gt; m.
&lt;span style="color:orange;"&gt;perform&lt;/span&gt; factorial &lt;span style="color:orange;"&gt;using&lt;/span&gt; m &lt;span style="color:orange;"&gt;giving&lt;/span&gt; m.
multiply n &lt;span style="color:orange;"&gt;by&lt;/span&gt; m.
&lt;span style="color:orange;"&gt;return&lt;/span&gt; m.
&lt;span style="color:cyan;"&gt;#&amp;gt;&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;Lanzamos el servidor con la línea de comando:&lt;/p&gt;

&lt;p&gt;node server&lt;/p&gt;

&lt;p&gt;Luego, navegar a localhost:8000, para obtener el resultado:&lt;/p&gt;

&lt;p&gt;&lt;img src="https://raw.github.com/ajlopez/CobolScript/master/images/templateweb.png" alt="" /&gt;&lt;/p&gt;

&lt;p&gt;Próximo post: un sitio web dinámico, escrito en CobolScript, ejecutando sobre Node.js, accediendo a una base de datos MySQL.&lt;/p&gt;

&lt;p&gt;Nos leemos!&lt;/p&gt;

&lt;p&gt;Angel “Java” Lopez 
  &lt;br /&gt;

  &lt;br /&gt;&lt;a href="http://www.ajlopez.com"&gt;http://www.ajlopez.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="http://twitter.com/ajlopez"&gt;http://twitter.com/ajlopez&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1822948" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/lopez/archive/tags/Lenguajes+de+Programaci_26002300_243_3B00_n/default.aspx">Lenguajes de Programaci&amp;#243;n</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/Desarrollo+Web/default.aspx">Desarrollo Web</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/Proyectos+de+C_26002300_243_3B00_digo+Abierto/default.aspx">Proyectos de C&amp;#243;digo Abierto</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/COBOL/default.aspx">COBOL</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/CobolScript/default.aspx">CobolScript</category></item><item><title>Code Katas en JavaScript/Node.js usando TDD</title><link>http://msmvps.com/blogs/lopez/archive/2013/01/14/code_2D00_katas_2D00_in_2D00_javascriptnode_2D00_js_2D00_using_2D00_tdd.aspx</link><pubDate>Mon, 14 Jan 2013 09:23:26 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1822588</guid><dc:creator>lopez</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/lopez/rsscomments.aspx?PostID=1822588</wfw:commentRss><comments>http://msmvps.com/blogs/lopez/archive/2013/01/14/code_2D00_katas_2D00_in_2D00_javascriptnode_2D00_js_2D00_using_2D00_tdd.aspx#comments</comments><description>&lt;p&gt;En estas semanas pasadas, he estado trabajando en ejemplos y módulos JavaScript/Node.js, usando TDD en cada paso. Practicar, practicar, practicar, el camino a la maestría.&lt;/p&gt;  &lt;p&gt;Pueden ver mi progreso y revisar los commits que hago ante cada test. Lo que sigue es un resumen de este trabajo:&lt;/p&gt;  &lt;p&gt;&lt;a href="https://github.com/ajlopez/CobolScript"&gt;CobolScript&lt;/a&gt;: &lt;a href="http://msmvps.com/blogs/lopez/archive/tags/COBOL/default.aspx"&gt;Ver mis posts&lt;/a&gt; un implementación de compilador de COBOL a JavaScript, con ejemplos de consola &lt;a href="https://github.com/ajlopez/SimpleWeb/tree/master/samples/customers"&gt; ejemplo web&lt;/a&gt;, usando MySQL y &lt;a href="http://github.com/ajlopez/SimpleWeb"&gt;SimpleWeb&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;&lt;img src="http://ajlopez.com/images/articles2/cobs09.png" alt="" /&gt; &lt;/p&gt;  &lt;p&gt;&lt;a href="https://github.com/ajlopez/SimplePipes"&gt;SimplePipes&lt;/a&gt;: Una manera de definir pasaje de mensajes usando ‘pipes’ para conectar diferentes nodes/funciones en un grafo. Quiero extenderlo para que tenga proceso distribuido.&lt;/p&gt;  &lt;p&gt;&lt;a href="https://github.com/ajlopez/SimpleBoggle"&gt;SimpleBoggle&lt;/a&gt;: Un programa que resuelve &lt;a href="http://en.wikipedia.org/wiki/Boggle"&gt;un tablero de Boggle&lt;/a&gt;, juega mejor que yo! Ver &lt;a href="https://github.com/ajlopez/SimpleBoggle/tree/master/samples/findwords"&gt;ejemplo de consola&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;&lt;a href="https://github.com/ajlopez/SimpleMemolap"&gt;SimpleMemolap&lt;/a&gt;: procesamiento tipo OLAP multidimensional, pero usando un modelo en memoria. Hay &lt;a href="https://github.com/ajlopez/SimpleWeb/tree/master/samples/customers"&gt;ejemplo web&lt;/a&gt; que usa mi &lt;a href="https://github.com/ajlopez/SimpleWeb"&gt;SimpleWeb&lt;/a&gt; (“dog fooding”):&lt;/p&gt;  &lt;p&gt;&lt;img src="http://ajlopez.com/images/articles2/smemo02.png" alt="" /&gt; &lt;/p&gt;  &lt;p&gt;&lt;a href="https://github.com/ajlopez/SimpleChess"&gt;SimpleChess&lt;/a&gt;: En progreso, define un tablero usando &lt;a href="https://github.com/ajlopez/SimpleBoard"&gt;SimpleBoard&lt;/a&gt;, y ya calcula movidas. Estoy también trabajando en &lt;a href="https://github.com/ajlopez/SimpleGo"&gt;SimpleGo&lt;/a&gt;, para tener un tablero, un juego y evaluadores.&lt;/p&gt;  &lt;p&gt;&lt;a href="https://github.com/ajlopez/SimpleRules"&gt;SimpleRules&lt;/a&gt;: Motor de reglas&amp;#160; “forward-chaining”, hacia adelante (ahora que está de nuevo “de moda” la programación reactiva. Trabaja inspirada en algoritmo RETE-2, detectando los cambios de estado para disparar las acciones apropiadas.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://api.viglink.com/api/click?format=go&amp;amp;key=cdee124b11d6baacda6c3e29b12e23dc&amp;amp;loc=http%3A%2F%2Fajlopez.wordpress.com%2F&amp;amp;v=1&amp;amp;libid=1358011009888&amp;amp;out=https%3A%2F%2Fgithub.com%2Fajlopez%2FSimpleScript&amp;amp;title=Angel%20%5C%E2%80%9DJava%5C%E2%80%9D%20Lopez%20on%20Blog&amp;amp;txt=repo&amp;amp;jsonp=vglnk_jsonp_13580115836212"&gt;SimpleScript&lt;/a&gt;: Ver &lt;a href="http://msmvps.com/blogs/lopez/archive/2013/01/03/simplescript-1-primeras-ideas.aspx"&gt;mi post&lt;/a&gt; con las primeras ideas sobre este lenguaje, que compila a JavaScript, trabajo en progreso.&lt;/p&gt;  &lt;p&gt;&lt;a href="https://github.com/ajlopez/Py2Script"&gt;Py2Script&lt;/a&gt;: Compilador de Python a JavaScript, primeros pasos.&lt;/p&gt;  &lt;p&gt;&lt;a href="https://github.com/ajlopez/SimpleWeb"&gt;SimpleWeb&lt;/a&gt;: Una capa de “middleware”, a la Connect, con un ejemplo web:&lt;/p&gt;  &lt;p&gt;&lt;img src="http://ajlopez.com/images/articles2/simpleweb02.png" alt="" /&gt; &lt;/p&gt;  &lt;p&gt;&lt;a href="https://github.com/ajlopez/BasicScript"&gt;BasicScript&lt;/a&gt;: Mis primeros pasos para compilar Basic a JavaScript. Quiero usarlo como lenguaje de programación para juegos en el browser.&lt;/p&gt;  &lt;p&gt;&lt;a href="https://github.com/ajlopez/SimplePermissions"&gt;SimplePermissions&lt;/a&gt;: El code kata de este sábado a la mañana ;-). Implementa Sujetos (Subjects), roles, permisos, otorgados en contexto.&lt;/p&gt;  &lt;p&gt;&lt;a href="https://github.com/ajlopez/SimpleFunc"&gt;SimpleFunc&lt;/a&gt;: Serialización/Deserialización de funciones y objectos con funciones.&lt;/p&gt;  &lt;p&gt;&lt;a href="https://github.com/ajlopez/SimpleMapReduce"&gt;SimpleMapReduce&lt;/a&gt;: Explorando la implementación del algoritmo Map-Reduce (y una variante, que llamo Map-Process) tanto sincrónico como asincrónico.&lt;/p&gt;  &lt;p&gt;&lt;a href="https://github.com/ajlopez/SimpleTuring"&gt;SimpleTuring&lt;/a&gt;: Implementación de una máquina de Turing.&lt;/p&gt;  &lt;p&gt;&lt;a href="https://github.com/ajlopez/Cellular"&gt;Cellular&lt;/a&gt;: Implementación de autómatas de estado, lineales o de otras dimensiaones. Incluye un ejemplo de &lt;a href="https://github.com/ajlopez/Cellular/tree/master/samples/life"&gt;juego de la vida en consola&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;Y en estos dos días pasados, agregué:&lt;/p&gt;  &lt;p&gt;&lt;a&gt;NodeDelicious&lt;/a&gt;: Para recuperar mis enlaces desde la cuenta de Delicious (sin tener que lidiar con el XML que devuelve directamente la API), ahora que el sitio ha sido rediseñado y no tiene paginación. La gente de Delicious sigue pensando que uno usa los enlaces como un feed (que lo viejo se pierde), pero no, muchos usamos a Delicious como un “Mis favoritos” en la nube y queremos acceder por rango de tiempo.&lt;/p&gt;  &lt;p&gt;&lt;a href="https://github.com/ajlopez/SimpleSudoku"&gt;SimpleSudoku&lt;/a&gt;: Una reescritura desde 0, con TDD, de mi anterior AjSudoku, resuelve tableros de Sudoku.&lt;/p&gt;  &lt;p&gt;Tengo que trabajar en:&lt;/p&gt;  &lt;p&gt;&lt;a href="https://github.com/ajlopez/SimpleDatabase"&gt;SimpleDatabase&lt;/a&gt;: Base de datos en memoria, puede que en algún momento le agregue persistencia en archivos.&lt;/p&gt;  &lt;p&gt;Y como siempre, todo esto es muy divertido ;-)&lt;/p&gt;  &lt;p&gt;Nos leemos!&lt;/p&gt;  &lt;p&gt;Angel “Java” Lopez    &lt;br /&gt;&lt;a href="http://www.ajlopez.com"&gt;http://www.ajlopez.com&lt;/a&gt;     &lt;br /&gt;&lt;a href="http://twitter.com/ajlopez"&gt;http://twitter.com/ajlopez&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1822588" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/lopez/archive/tags/Lenguajes+de+Programaci_26002300_243_3B00_n/default.aspx">Lenguajes de Programaci&amp;#243;n</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/TDD/default.aspx">TDD</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/Code+Katas/default.aspx">Code Katas</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/Javascript/default.aspx">Javascript</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/Proyectos+de+C_26002300_243_3B00_digo+Abierto/default.aspx">Proyectos de C&amp;#243;digo Abierto</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/NodeJs/default.aspx">NodeJs</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/COBOL/default.aspx">COBOL</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/Compilador/default.aspx">Compilador</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/CobolScript/default.aspx">CobolScript</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/MapReduce/default.aspx">MapReduce</category></item><item><title>Resoluciones del Nuevo Mes: Enero 2013</title><link>http://msmvps.com/blogs/lopez/archive/2013/01/07/new_2D00_months_2D00_resolutions_2D00_january_2D00_2013.aspx</link><pubDate>Mon, 07 Jan 2013 13:16:33 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1822260</guid><dc:creator>lopez</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/lopez/rsscomments.aspx?PostID=1822260</wfw:commentRss><comments>http://msmvps.com/blogs/lopez/archive/2013/01/07/new_2D00_months_2D00_resolutions_2D00_january_2D00_2013.aspx#comments</comments><description>&lt;p&gt;Ya comenzó el año, estamos en el primer mes de 2013. Estuve bastante ocupado, programando mis proyectos. Primero, una revisión de las &lt;a href="http://msmvps.com/blogs/lopez/archive/2012/12/04/resoluciones-del-nuevo-mes-diciembre-2012.aspx"&gt;resoluciones del mes pasado&lt;/a&gt;:&lt;/p&gt;  &lt;p&gt;- Trabajr en PythonSharp &lt;strong&gt;&lt;font color="#804040"&gt;[pendiente]&lt;/font&gt;&lt;/strong&gt;     &lt;br /&gt;- Trabajar en AjTalk en C# &lt;strong&gt;&lt;font color="#008000"&gt;[completo]&lt;/font&gt;&lt;/strong&gt; &lt;a href="https://github.com/ajlopez/AjTalk"&gt;ver repo&lt;/a&gt; y &lt;a href="http://msmvps.com/blogs/lopez/archive/tags/AjTalk/default.aspx"&gt;ver mis posts&lt;/a&gt;     &lt;br /&gt;- Dar un seminario sobre Node.js &lt;strong&gt;&lt;font color="#008000"&gt;[completo]&lt;/font&gt;&lt;/strong&gt; &lt;a href="http://msmvps.com/blogs/lopez/archive/2012/12/13/node-js-en-buenos-aires.aspx"&gt;ver mi post&lt;/a&gt;     &lt;br /&gt;- Comenzar mi tutorial de Java en páginas .md &lt;strong&gt;&lt;font color="#804040"&gt;[pendiente]&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Además, estuve trabajando en:&lt;/p&gt;  &lt;p&gt;- Comenzar Py2Script compilador de Python a JavaScript &lt;strong&gt;&lt;font color="#008000"&gt;[completo]&lt;/font&gt;&lt;/strong&gt; &lt;a href="https://github.com/ajlopez/Py2Script"&gt;ver repo&lt;/a&gt;     &lt;br /&gt;- Actualizar mis ejemplos Node.js &lt;strong&gt;&lt;font color="#008000"&gt;[completo]&lt;/font&gt;&lt;/strong&gt; &lt;a href="https://github.com/ajlopez/NodeSamples"&gt;ver repo&lt;/a&gt;     &lt;br /&gt;- Comenzar y publicar versión 0.0.1 de SimpleWeb, mi capa de middleware a la Connectr &lt;strong&gt;&lt;font color="#008000"&gt;[completo]&lt;/font&gt;&lt;/strong&gt; &lt;a href="https://github.com/ajlopez/SimpleWeb"&gt;ver repo&lt;/a&gt;     &lt;br /&gt;- Comenzar BasicScript &lt;strong&gt;&lt;font color="#008000"&gt;[completo]&lt;/font&gt;&lt;/strong&gt; &lt;a href="https://github.com/ajlopez/BasicScript"&gt;ver repo&lt;/a&gt;     &lt;br /&gt;- Comenzar y publicar la versión 0.0.1 de CobolScript &lt;strong&gt;&lt;font color="#008000"&gt;[completo]&lt;/font&gt;&lt;/strong&gt; &lt;a href="https://github.com/ajlopez/CobolScript"&gt;ver repo&lt;/a&gt; y &lt;a href="http://msmvps.com/blogs/lopez/archive/tags/CobolScript/default.aspx"&gt;ver mis posts&lt;/a&gt;.    &lt;br /&gt;- Actualizar AjConsorSite &lt;strong&gt;&lt;font color="#008000"&gt;[completo]&lt;/font&gt;&lt;/strong&gt; &lt;a href="https://github.com/ajlopez/AjConsorSite"&gt;ver repo&lt;/a&gt;     &lt;br /&gt;- Comenzar proyecto Inmob &lt;strong&gt;&lt;font color="#008000"&gt;[completo]&lt;/font&gt;&lt;/strong&gt; &lt;a href="https://github.com/ajlopez/Inmob"&gt;ver repo&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Para este nuevo mes, las nuevas resoluciones (algunas ya comenzaron, ver mi cuenta en GitHub) son:&lt;/p&gt;  &lt;p&gt;- Empezar SimpleScript    &lt;br /&gt;- Empezar SimpleBoard     &lt;br /&gt;- Empezar SimpleChess     &lt;br /&gt;- Empezar SimpleGo     &lt;br /&gt;- Comenzar y publicar una versión de SimpleMapReduce, con ejemplo local y distribuido     &lt;br /&gt;- Comenzar y publicar una versión de SimpleFunc, serialización de objeto con funciones de instancia     &lt;br /&gt;- Comenzar Memolap, una implementación C#, en memoria, de una librería OLAP multidimensional y sitio web de ejemplo     &lt;br /&gt;- Comenzar SimpleMemolap, lo mismo pero en JavaScript/Node.js     &lt;br /&gt;- Comenzar SimpleRules, un motor de reglas con encadenamiento hacia adelante, que compila a JavaScript    &lt;br /&gt;- Codificar SimpleBoggle, buscador de palabras en tablero de Boggle.&lt;/p&gt;  &lt;p&gt;Nos leemos!&lt;/p&gt;  &lt;p&gt;Angel “Java” Lopez    &lt;br /&gt;&lt;a href="http://www.ajlopez.com"&gt;http://www.ajlopez.com&lt;/a&gt;     &lt;br /&gt;&lt;a href="http://twitter.com/ajlopez"&gt;http://twitter.com/ajlopez&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1822260" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/lopez/archive/tags/C+Sharp/default.aspx">C Sharp</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/Lenguajes+de+Programaci_26002300_243_3B00_n/default.aspx">Lenguajes de Programaci&amp;#243;n</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/Javascript/default.aspx">Javascript</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/Proyectos+de+C_26002300_243_3B00_digo+Abierto/default.aspx">Proyectos de C&amp;#243;digo Abierto</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/NodeJs/default.aspx">NodeJs</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/Programaci_F300_n+Distribuida/default.aspx">Programación Distribuida</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/SimpleGo/default.aspx">SimpleGo</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/SimpleMapReduce/default.aspx">SimpleMapReduce</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/SimpleChess/default.aspx">SimpleChess</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/SimpleMemolap/default.aspx">SimpleMemolap</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/SimpleRules/default.aspx">SimpleRules</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/Memolap/default.aspx">Memolap</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/SimpleBoard/default.aspx">SimpleBoard</category></item><item><title>SimpleScript (1) Primeras ideas</title><link>http://msmvps.com/blogs/lopez/archive/2013/01/03/simplescript-1-primeras-ideas.aspx</link><pubDate>Thu, 03 Jan 2013 16:17:10 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1822044</guid><dc:creator>lopez</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/lopez/rsscomments.aspx?PostID=1822044</wfw:commentRss><comments>http://msmvps.com/blogs/lopez/archive/2013/01/03/simplescript-1-primeras-ideas.aspx#comments</comments><description>&lt;p&gt;Las pasadas dos semanas, estuve entretenido escribiendo &lt;a href="https://github.com/ajlopez/CobolScript"&gt;CobolScript&lt;/a&gt;, mi compilador COBOL a JavaScript (ver &lt;a href="http://ajlopez.wordpress.com/category/cobolscript/"&gt;posts&lt;/a&gt;). Tengo programas de consola de ejemplo, y otros que son sitios con páginas dinámicas escritas en CobolScript, ejecutadas sobre Node.js (ver &lt;a href="https://github.com/ajlopez/CobolScript#samples"&gt;samples&lt;/a&gt;). Los ejemplos web usan el simple módulo Node.js nativo http, y hay uno que usa mi nuevo módulo &lt;a href="https://github.com/ajlopez/SimpleWeb"&gt;SimpleWeb&lt;/a&gt;, un simple middleware sobre HTTP, a la Connect. Comencé también a escribir un compilador Python 3 a JavaScript, ver &lt;a href="https://github.com/ajlopez/Py2Script"&gt;Py2Script&lt;/a&gt;. Y ahora, luego de entrenarme en esos proyectos (los primeros donde compilo a JavaScript usando JavaScript), quiero ir un paso más allá y escribir un lenguaje simple compilado, lo llamé SimpleScript (ver &lt;a href="https://github.com/ajlopez/SimpleScript"&gt;repo&lt;/a&gt;).&lt;/p&gt;  &lt;p&gt;Los puntos principales:&lt;/p&gt;  &lt;p&gt;- Compila a JavaScript, así que está orientado a ese lenguaje. NO es lenguaje de scripting a ser implementado sobre distintas tecnologías (por ejemplo, .NET, Java y JavaScript). Está totalmente orientado a la semántica de JavaScript.&lt;/p&gt;  &lt;p&gt;- Me gusta la tradición del lenguaje C, pero esta vez no quiero tener punto y coma y llaves. Quiero una sintaxis más orientada a Python y Ruby.&lt;/p&gt;  &lt;p&gt;- No quiero depender de los espacios para agrupar comandos. Me gusta Python, pero el tema de la indentación no la quiero en este lenguaje.&lt;/p&gt;  &lt;p&gt;- No hay separador de comandos (como el punto y coma) solamente la nueva línea. Es decir, puedo escribir&lt;/p&gt;  &lt;p&gt;&lt;font face="Consolas"&gt;&lt;strong&gt;if&lt;/strong&gt; a &amp;lt; 1 a = 1&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;o&lt;/p&gt;  &lt;p&gt;&lt;font face="Consolas"&gt;&lt;strong&gt;if&lt;/strong&gt; a &amp;lt; 1       &lt;br /&gt;&amp;#160;&amp;#160; a = 1       &lt;br /&gt;&lt;strong&gt;end&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;Vean el uso de &lt;strong&gt;end&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;Pero no puedo (ni quiero) escribir DOS comandos en la misma línea:&lt;/p&gt;  &lt;p&gt;&lt;font face="Consolas"&gt;&lt;strong&gt;if&lt;/strong&gt; a &amp;lt; 1 a=1; b=2&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;En este caso, DEBERIA escribir:&lt;/p&gt;  &lt;p&gt;&lt;font face="Consolas"&gt;&lt;strong&gt;if&lt;/strong&gt; a &amp;lt; 1       &lt;br /&gt;&amp;#160; a = 1       &lt;br /&gt;&amp;#160; b = 2       &lt;br /&gt;&lt;strong&gt;end&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;- No más paréntesis alredor de las condiciones (ver el ejemplo de arriba).&lt;/p&gt;  &lt;p&gt;- Una sola variante de for, el&lt;strong&gt; for … in&lt;/strong&gt; , todavía lo estoy discutiendo conmigo mismo. Quiero tener un for..in… como en JavaScript, pero con alguna variante para poder acceder directamente a los valores en vez de a las claves/índices de un objeto/arreglo. Algo como&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;for&lt;/strong&gt; k &lt;strong&gt;in&lt;/strong&gt; myarray&lt;/p&gt;  &lt;p&gt;itera sobre los índices de myarray. En cambio&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;for&lt;/strong&gt; k &lt;strong&gt;in&lt;/strong&gt; myarray &lt;strong&gt;values&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;iteraría sobre los valores de myarray, directamente. Una expresión de rangos:&lt;/p&gt;  &lt;p&gt;&lt;font face="Consolas"&gt;&lt;strong&gt;for&lt;/strong&gt; k &lt;strong&gt;in&lt;/strong&gt; 0..n&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;compilaría a un simple for clásico.&lt;/p&gt;  &lt;p&gt;- Los ciclos soportan &lt;strong&gt;continue&lt;/strong&gt;, &lt;strong&gt;break&lt;/strong&gt;. El principal comando de ciclo es &lt;strong&gt;while&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;- Funciones como ciudadanos de primera clase.&lt;/p&gt;  &lt;p&gt;- La palabra clave &lt;strong&gt;function&lt;/strong&gt; keyword será usada para definir funciones anónimas. Estoy decidiendo si uso uso la palabra clave &lt;strong&gt;define&lt;/strong&gt; para definir funciones con nombre.&lt;/p&gt;  &lt;p&gt;- Invocación de funciones con parétesis explícitos (olvidarse de la convención de Ruby, o Python 2, ir hacia algo tipo Python 3.x).&lt;/p&gt;  &lt;p&gt;- Acceso a arreglos con &lt;strong&gt;[]&lt;/strong&gt; (olvidarse de la programación en Basic, donde se usan los paréntesis).&lt;/p&gt;  &lt;p&gt;- Variables externas. Aprendí mucho de su utilidad con mi trabajo en los ejemplos CobolScript, donde uso linkage section para pasar y recibir valores al invocar un programa. Una variable externa es algo que se da en ejecución, al llamar al programa,no es una variable global (caso típico, el require de Node.js que depende del archivo donde se está trabajando). Por ejemplo, la función &lt;strong&gt;print&lt;/strong&gt; puede ser una variable externa, de tal manera que el programa llamador puede definirla, para escribir a consola, a un buffer o al response de web.&lt;/p&gt;  &lt;p&gt;- Las variables globales deben ser declaradas explícitamente. Todas las variables no declaradas se consideran locales (a la función donde están siendo usadas).&lt;/p&gt;  &lt;p&gt;- Funciones tienen clausuras a la JavaScript. En contraste, por lo que entendí, en Python se debe declarar explícitamente su acceso. Prefiero la manera automática que usa JavaScript, así que por ahora la voy a incluir en el lenguaje.&lt;/p&gt;  &lt;p&gt;- Llamadas asincrónicas. Lo agregué a CobolScript, y me parece que quedó simple y útil. Sería algo similar al await/async de C# 5.0&lt;/p&gt;  &lt;p&gt;- Va a ejectuar en el navegador, y en Node.js.&lt;/p&gt;  &lt;p&gt;- Soporte de clases: no me decido todavía, tengo un solo caso de uso, para usarla en la programación de juegos, en mi proyecto de juegos.&lt;/p&gt;  &lt;p&gt;Sí, ya sé, hay otras implementaciones, como like CofeeScript. Pero quiero seguir enternándome en JavaScript, Node.js y TDD.&lt;/p&gt;  &lt;p&gt;Nos leemos!&lt;/p&gt;  &lt;p&gt;Angel “Java” Lopez    &lt;br /&gt;&lt;a href="http://www.ajlopez.com"&gt;http://www.ajlopez.com&lt;/a&gt;     &lt;br /&gt;&lt;a href="http://twitter.com/ajlopez"&gt;http://twitter.com/ajlopez&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1822044" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/lopez/archive/tags/Lenguajes+de+Programaci_26002300_243_3B00_n/default.aspx">Lenguajes de Programaci&amp;#243;n</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/Javascript/default.aspx">Javascript</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/Proyectos+de+C_26002300_243_3B00_digo+Abierto/default.aspx">Proyectos de C&amp;#243;digo Abierto</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/NodeJs/default.aspx">NodeJs</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/Compilador/default.aspx">Compilador</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/SimpleScript/default.aspx">SimpleScript</category></item><item><title>CobolScript (3) Plantillas</title><link>http://msmvps.com/blogs/lopez/archive/2012/12/30/cobolscript_2D00_3_2D00_templates.aspx</link><pubDate>Sun, 30 Dec 2012 16:22:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1821809</guid><dc:creator>lopez</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/lopez/rsscomments.aspx?PostID=1821809</wfw:commentRss><comments>http://msmvps.com/blogs/lopez/archive/2012/12/30/cobolscript_2D00_3_2D00_templates.aspx#comments</comments><description>&lt;p&gt;&lt;a href="http://msmvps.com/blogs/lopez/archive/2012/12/25/cobolscript_2D00_2_2D00_first_2D00_factorial_2D00_function.aspx"&gt;Anterior Post&lt;/a&gt;&amp;nbsp;&lt;br /&gt;&lt;a href="http://msmvps.com/blogs/lopez/archive/2013/01/21/cobolscript-4-p-225-ginas-web-con-plantillas-en-node-js.aspx"&gt;Siguiente Post&lt;/a&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Me gusta tener un motor de plantillas en los lenguajes que implemento, as&amp;iacute; que agregu&amp;eacute; uno a mi proyecto de c&amp;oacute;digo abierto CobolScript, un compilador COBOL a JavaScript. El primer ejemplo:&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/ajlopez/CobolScript/tree/master/samples/template" title="https://github.com/ajlopez/CobolScript/tree/master/samples/template"&gt;https://github.com/ajlopez/CobolScript/tree/master/samples/template&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;El c&amp;oacute;digo:&lt;/p&gt;
&lt;pre style="background-color:black;max-width:600px;color:white;font-size:12pt;"&gt;&lt;span style="color:cyan;"&gt;&amp;lt;#&lt;/span&gt;
&lt;span style="color:orange;"&gt;data&lt;/span&gt; &lt;span style="color:orange;"&gt;division&lt;/span&gt;.
&lt;span style="color:orange;"&gt;working&lt;/span&gt;-&lt;span style="color:orange;"&gt;storage&lt;/span&gt; &lt;span style="color:orange;"&gt;section&lt;/span&gt;.
01 n.

&lt;span style="color:orange;"&gt;procedure&lt;/span&gt; &lt;span style="color:orange;"&gt;division&lt;/span&gt;.
&lt;span style="color:cyan;"&gt;#&amp;gt;&lt;/span&gt;
Factorial
---------

&lt;span style="color:cyan;"&gt;&amp;lt;#&lt;/span&gt;
&lt;span style="color:orange;"&gt;perform&lt;/span&gt; show-factorial &lt;span style="color:orange;"&gt;varying&lt;/span&gt; n &lt;span style="color:orange;"&gt;from&lt;/span&gt; 1 &lt;span style="color:orange;"&gt;to&lt;/span&gt; 10.

show-factorial.
&lt;span style="color:orange;"&gt;local&lt;/span&gt; result.
&lt;span style="color:orange;"&gt;perform&lt;/span&gt; factorial &lt;span style="color:orange;"&gt;using&lt;/span&gt; n &lt;span style="color:orange;"&gt;giving&lt;/span&gt; result.
&lt;span style="color:cyan;"&gt;#&amp;gt;&lt;/span&gt;
&lt;span style="color:cyan;"&gt;${&lt;/span&gt;n&lt;span style="color:cyan;"&gt;}!&lt;/span&gt;= &lt;span style="color:cyan;"&gt;${&lt;/span&gt;result&lt;span style="color:cyan;"&gt;}&lt;/span&gt;
&lt;span style="color:cyan;"&gt;&amp;lt;#&lt;/span&gt;
.
factorial &lt;span style="color:orange;"&gt;using&lt;/span&gt; n.
&lt;span style="color:orange;"&gt;local&lt;/span&gt; m.
&lt;span style="color:orange;"&gt;if&lt;/span&gt; n = 1 &lt;span style="color:orange;"&gt;then&lt;/span&gt; &lt;span style="color:orange;"&gt;return&lt;/span&gt; n.
&lt;span style="color:orange;"&gt;subtract&lt;/span&gt; 1 &lt;span style="color:orange;"&gt;from&lt;/span&gt; n &lt;span style="color:orange;"&gt;giving&lt;/span&gt; m.
&lt;span style="color:orange;"&gt;perform&lt;/span&gt; factorial &lt;span style="color:orange;"&gt;using&lt;/span&gt; m &lt;span style="color:orange;"&gt;giving&lt;/span&gt; m.
multiply n &lt;span style="color:orange;"&gt;by&lt;/span&gt; m.
&lt;span style="color:orange;"&gt;return&lt;/span&gt; m.
&lt;span style="color:cyan;"&gt;#&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;El archivo plantilla es compilado a COBOL transformando cada texto en un comando DISPLAY &amp;hellip; WITH NO ADVANCING (los saltos de l&amp;iacute;nea ya est&amp;aacute;n en el texto). El c&amp;oacute;digo entre &amp;lt;# y #&amp;gt; se copia tal cual en el programa COBOL. Cada expresi&amp;oacute;n entre ${ y } se expande como otro par&amp;aacute;metro al comando DISPLAY. Entonces, luego de compilar todo el texto a COBOL, CobolScript compila el resultado a JavaScript. La sintaxis de la plantillas es, entonces, una especie de &amp;ldquo;syntax sugar&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;La salida del programa anterior:&lt;/p&gt;
&lt;pre style="background-color:black;max-width:600px;color:white;font-size:12pt;"&gt;Factorial
---------

1!= 1
2!= 2
3!= 6
4!= 24
5!= 120
6!= 720
7!= 5040
8!= 40320
9!= 362880
10!= 3628800&lt;/pre&gt;
&lt;p&gt;Podr&amp;iacute;a usar las plantillas para generar archivos de texto, y entonces, implementar generaci&amp;oacute;n de c&amp;oacute;digo en CobolScript, as&amp;iacute; como lo hice en AjGenesis (tanto en la variante cl&amp;aacute;sica en .NET, como en Ruby o JavaScript/NodeJs). Antes de eso, ya tengo una implementaci&amp;oacute;n de p&amp;aacute;ginas din&amp;aacute;micas basadas en este motor de plantillas (s&amp;iacute;, p&amp;aacute;ginas din&amp;aacute;micas en CobolScript, cosas vederes Sancho ;-). Pero es tema para otro post.&lt;/p&gt;
&lt;p&gt;Nos leemos!&lt;/p&gt;
&lt;p&gt;Angel &amp;ldquo;Java&amp;rdquo; Lopez 
  &lt;br /&gt;&lt;a href="http://www.ajlopez.com"&gt;http://www.ajlopez.com&lt;/a&gt; 
  &lt;br /&gt;&lt;a href="http://twitter.com/ajlopez"&gt;http://twitter.com/ajlopez&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1821809" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/lopez/archive/tags/Lenguajes+de+Programaci_26002300_243_3B00_n/default.aspx">Lenguajes de Programaci&amp;#243;n</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/Proyectos+de+C_26002300_243_3B00_digo+Abierto/default.aspx">Proyectos de C&amp;#243;digo Abierto</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/COBOL/default.aspx">COBOL</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/CobolScript/default.aspx">CobolScript</category></item><item><title>CobolScript (2) Primera Función, Factorial</title><link>http://msmvps.com/blogs/lopez/archive/2012/12/25/cobolscript_2D00_2_2D00_first_2D00_factorial_2D00_function.aspx</link><pubDate>Tue, 25 Dec 2012 12:52:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1821581</guid><dc:creator>lopez</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/lopez/rsscomments.aspx?PostID=1821581</wfw:commentRss><comments>http://msmvps.com/blogs/lopez/archive/2012/12/25/cobolscript_2D00_2_2D00_first_2D00_factorial_2D00_function.aspx#comments</comments><description>&lt;p&gt;&lt;a href="http://msmvps.com/blogs/lopez/archive/2012/12/23/cobolscript_2D00_1_2D00_cobol_2D00_compiler_2D00_to_2D00_javascriptnode_2D00_js.aspx"&gt;Anterior Post&lt;/a&gt;&amp;nbsp;&lt;br /&gt;&lt;a href="http://msmvps.com/blogs/lopez/archive/2012/12/30/cobolscript_2D00_3_2D00_templates.aspx"&gt;Siguiente Post&lt;/a&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;JavaScript es manteca en mis manos ;-). Estuve trabajando en mi proyecto CobolScript, compiladr de COBOL a JavaScript, que puede ejecutarse en el navegador o en Node.js.&lt;/p&gt;
&lt;p&gt;Agregu&amp;eacute; soporte de funciones definidaspor el usuario, con par&amp;aacute;metros, argumentos a pasar, y hasta variables locales. El primer ejemplo fue el cl&amp;aacute;sico factorial recursivo:&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/ajlopez/CobolScript/blob/master/samples/factorial/factorial.cob" title="https://github.com/ajlopez/CobolScript/blob/master/samples/factorial/factorial.cob"&gt;https://github.com/ajlopez/CobolScript/blob/master/samples/factorial/factorial.cob&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Pueden ejecutarlo en ese directorio, con la l&amp;iacute;nea de comando:&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Consolas;"&gt;node run factorial.cob&lt;/span&gt;&lt;/p&gt;
&lt;pre style="background-color:black;color:white;font-size:12pt;"&gt;&lt;span style="color:orange;"&gt;data&lt;/span&gt; &lt;span style="color:orange;"&gt;division&lt;/span&gt;.
&lt;span style="color:orange;"&gt;working&lt;/span&gt;-&lt;span style="color:orange;"&gt;storage&lt;/span&gt; &lt;span style="color:orange;"&gt;section&lt;/span&gt;.
01 n.

&lt;span style="color:orange;"&gt;procedure&lt;/span&gt; &lt;span style="color:orange;"&gt;division&lt;/span&gt;.
&lt;span style="color:orange;"&gt;perform&lt;/span&gt; show-factorial &lt;span style="color:orange;"&gt;varying&lt;/span&gt; n &lt;span style="color:orange;"&gt;from&lt;/span&gt; 1 &lt;span style="color:orange;"&gt;to&lt;/span&gt; 10.

show-factorial &lt;span style="color:orange;"&gt;local&lt;/span&gt; result.
&lt;span style="color:orange;"&gt;perform&lt;/span&gt; factorial &lt;span style="color:orange;"&gt;using&lt;/span&gt; n &lt;span style="color:orange;"&gt;giving&lt;/span&gt; result.
&lt;span style="color:orange;"&gt;display&lt;/span&gt; n &lt;span style="color:lightgreen;"&gt;&amp;quot;! = &amp;quot;&lt;/span&gt; result.

factorial &lt;span style="color:orange;"&gt;using&lt;/span&gt; n &lt;span style="color:orange;"&gt;local&lt;/span&gt; m.
&lt;span style="color:orange;"&gt;if&lt;/span&gt; n = 1 &lt;span style="color:orange;"&gt;then&lt;/span&gt; &lt;span style="color:orange;"&gt;return&lt;/span&gt; n.
&lt;span style="color:orange;"&gt;subtract&lt;/span&gt; 1 &lt;span style="color:orange;"&gt;from&lt;/span&gt; n &lt;span style="color:orange;"&gt;giving&lt;/span&gt; m.
&lt;span style="color:orange;"&gt;perform&lt;/span&gt; factorial &lt;span style="color:orange;"&gt;using&lt;/span&gt; m &lt;span style="color:orange;"&gt;giving&lt;/span&gt; m.
multiply n &lt;span style="color:orange;"&gt;by&lt;/span&gt; m.
&lt;span style="color:orange;"&gt;return&lt;/span&gt; m.&lt;/pre&gt;
&lt;p&gt;Le agregu&amp;eacute; nueva sintaxis:&lt;/p&gt;
&lt;p&gt;- &lt;strong&gt;perform&lt;/strong&gt; &amp;hellip; &lt;strong&gt;using&lt;/strong&gt; &amp;hellip; Para llamar a un procedimiento local pasando argumentos.&lt;/p&gt;
&lt;p&gt;- &amp;lt;&lt;strong&gt;proc&lt;/strong&gt;&amp;gt; &lt;strong&gt;using&lt;/strong&gt; &amp;hellip;&amp;nbsp; El procedimiento declara sus argumentos.&lt;/p&gt;
&lt;p&gt;- &amp;lt;&lt;strong&gt;proc&lt;/strong&gt;&amp;gt; &lt;strong&gt;local&lt;/strong&gt;(&lt;strong&gt;s&lt;/strong&gt;) &amp;hellip; El procedimiento declara sus variables locales (&lt;strong&gt;actualizaci&amp;oacute;n&lt;/strong&gt;: removido, ahora hay comando&lt;strong&gt; local(s)&amp;hellip;&lt;/strong&gt; directamente en el c&amp;oacute;digo del procedimiento).&lt;/p&gt;
&lt;p&gt;- &lt;strong&gt;perform&lt;/strong&gt; &amp;hellip; &lt;strong&gt;giving&lt;/strong&gt; &amp;lt;&lt;strong&gt;var&lt;/strong&gt;&amp;gt;&amp;hellip;&amp;nbsp; Puedo especificar que el valor de retorno del procedimiento (internamente, es una funci&amp;oacute;n JavaScript) sea guardado en una o varias variables.&lt;/p&gt;
&lt;p&gt;- &lt;strong&gt;return&lt;/strong&gt; (&lt;strong&gt;expr&lt;/strong&gt;)&amp;nbsp; El procedimiento puede retornar en cualquier momento, con un resultado opcional. Me falta implementar el cl&amp;aacute;sico &lt;strong&gt;exit&lt;/strong&gt; de COBOL.&lt;/p&gt;
&lt;p&gt;Le agregu&amp;eacute; soporte de plantillas, p&amp;aacute;ginas web din&amp;aacute;micas, y acceso a objetos JavaScript/Node.js nativos. Pero eso ya es tema para otro post.&lt;/p&gt;
&lt;p&gt;Nos leemos!&lt;/p&gt;
&lt;p&gt;Angel &amp;ldquo;Java&amp;rdquo; Lopez 
  &lt;br /&gt;&lt;a href="http://www.ajlopez.com"&gt;http://www.ajlopez.com&lt;/a&gt; 
  &lt;br /&gt;&lt;a href="http://twitter.com/ajlopez"&gt;http://twitter.com/ajlopez&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1821581" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/lopez/archive/tags/Lenguajes+de+Programaci_26002300_243_3B00_n/default.aspx">Lenguajes de Programaci&amp;#243;n</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/Javascript/default.aspx">Javascript</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/Proyectos+de+C_26002300_243_3B00_digo+Abierto/default.aspx">Proyectos de C&amp;#243;digo Abierto</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/NodeJs/default.aspx">NodeJs</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/COBOL/default.aspx">COBOL</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/Compilador/default.aspx">Compilador</category></item><item><title>CobolScript (1) Compilador COBOL a JavaScript/Node.js</title><link>http://msmvps.com/blogs/lopez/archive/2012/12/23/cobolscript_2D00_1_2D00_cobol_2D00_compiler_2D00_to_2D00_javascriptnode_2D00_js.aspx</link><pubDate>Sun, 23 Dec 2012 15:16:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1821478</guid><dc:creator>lopez</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/lopez/rsscomments.aspx?PostID=1821478</wfw:commentRss><comments>http://msmvps.com/blogs/lopez/archive/2012/12/23/cobolscript_2D00_1_2D00_cobol_2D00_compiler_2D00_to_2D00_javascriptnode_2D00_js.aspx#comments</comments><description>&lt;p&gt;&lt;a href="http://msmvps.com/blogs/lopez/archive/2012/12/25/cobolscript_2D00_2_2D00_first_2D00_factorial_2D00_function.aspx"&gt;Siguiente Post&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Ayer, comenc&amp;eacute; un nuevo proyecto en mi cuenta de GitHub:&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/ajlopez/CobolScript" title="https://github.com/ajlopez/CobolScript"&gt;https://github.com/ajlopez/CobolScript&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Es un compilador que lee COBOL y compila a JavaScript. Es un &amp;ldquo;work in progress&amp;rdquo;, pero el cl&amp;aacute;sico &amp;ldquo;Hello, world&amp;rdquo; est&amp;aacute; ya corriendo:&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/ajlopez/CobolScript/blob/master/samples/hello/hello.cobs" title="https://github.com/ajlopez/CobolScript/blob/master/samples/hello/hello.cobs"&gt;https://github.com/ajlopez/CobolScript/blob/master/samples/hello/hello.cobs&lt;/a&gt;&lt;/p&gt;
&lt;pre style="background-color:black;color:white;font-size:12pt;"&gt;&lt;span style="color:orange;"&gt;DISPLAY&lt;/span&gt; &lt;span style="color:lightgreen;"&gt;&amp;quot;HELLO, WORLD&amp;quot;&lt;/span&gt;.&lt;/pre&gt;
&lt;p&gt;Lo pueden ejecutar escribiendo desde ese directorio en la l&amp;iacute;nea de comando:&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Consolas;"&gt;node run hello.cobs&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Un ejemplo m&amp;aacute;s completo:&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/ajlopez/CobolScript/blob/master/samples/hellopgm/hello.cob" title="https://github.com/ajlopez/CobolScript/blob/master/samples/hellopgm/hello.cob"&gt;https://github.com/ajlopez/CobolScript/blob/master/samples/hellopgm/hello.cob&lt;/a&gt;&lt;/p&gt;
&lt;pre style="background-color:black;color:white;font-size:12pt;"&gt;&lt;span style="color:orange;"&gt;IDENTIFICATION&lt;/span&gt; &lt;span style="color:orange;"&gt;DIVISION&lt;/span&gt;.
    &lt;span style="color:orange;"&gt;PROGRAM&lt;/span&gt;-&lt;span style="color:orange;"&gt;ID&lt;/span&gt;. HELLO.
    &lt;span style="color:orange;"&gt;AUTHOR&lt;/span&gt;. A.J.LOPEZ.
    &lt;span style="color:orange;"&gt;INSTALLATION&lt;/span&gt;. TEST.
    &lt;span style="color:orange;"&gt;DATE&lt;/span&gt;-&lt;span style="color:orange;"&gt;WRITTEN&lt;/span&gt;. 2012-12-22.
    &lt;span style="color:orange;"&gt;DATE&lt;/span&gt;-&lt;span style="color:orange;"&gt;COMPILED&lt;/span&gt;. 2012-12-22.
&lt;span style="color:orange;"&gt;ENVIRONMENT&lt;/span&gt; &lt;span style="color:orange;"&gt;DIVISION&lt;/span&gt;.
    &lt;span style="color:orange;"&gt;CONFIGURATION&lt;/span&gt; &lt;span style="color:orange;"&gt;SECTION&lt;/span&gt;.
        &lt;span style="color:orange;"&gt;SOURCE&lt;/span&gt;-&lt;span style="color:orange;"&gt;COMPUTER&lt;/span&gt;. NODE.
        &lt;span style="color:orange;"&gt;OBJECT&lt;/span&gt;-&lt;span style="color:orange;"&gt;COMPUTER&lt;/span&gt;. NODE.
&lt;span style="color:orange;"&gt;DATA&lt;/span&gt; &lt;span style="color:orange;"&gt;DIVISION&lt;/span&gt;.
&lt;span style="color:orange;"&gt;PROCEDURE&lt;/span&gt; &lt;span style="color:orange;"&gt;DIVISION&lt;/span&gt;.
    &lt;span style="color:orange;"&gt;DISPLAY&lt;/span&gt; &lt;span style="color:lightgreen;"&gt;&amp;quot;HELLO, WORLD&amp;quot;&lt;/span&gt;.&lt;/pre&gt;
&lt;p&gt;Ejecutemos en ese directorio:&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Consolas;"&gt;node run hello.cob&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Actualizaci&amp;oacute;n: pas&amp;eacute; los ejemplos de arriba a min&amp;uacute;sculas. Me comentaron que los COBOL modernos aceptan may&amp;uacute;sculas y min&amp;uacute;sculas, as&amp;iacute; que voy a tratar de seguir escribiendo ejemplos pero en min&amp;uacute;sculas.&lt;/p&gt;
&lt;p&gt;Hoy sigo con este trabajo, implementando variantes de verbos como move, add, subtract, etc.. todo escrito usando TDD (Test-Driven Development). Tengo varias cosas que agregar como soporte de formato en los items (&amp;ldquo;picture&amp;rdquo;), la file section, y en alg&amp;uacute;n momento, quiero agregar comandos SQL. Tambi&amp;eacute;n pienso poner p&amp;aacute;ginas din&amp;aacute;micas ejecutadas en un servidor web soportado por Node.js. El c&amp;oacute;digo est&amp;aacute; armado de forma tal que tambi&amp;eacute;n pueda ejecutarse en el navegador.&lt;/p&gt;
&lt;p&gt;Nos leemos!&lt;/p&gt;
&lt;p&gt;Angel &amp;ldquo;Java&amp;rdquo; Lopez 
  &lt;br /&gt;&lt;a href="http://www.ajlopez.com"&gt;http://www.ajlopez.com&lt;/a&gt; 
  &lt;br /&gt;&lt;a href="http://twitter.com/ajlopez"&gt;http://twitter.com/ajlopez&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1821478" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/lopez/archive/tags/Lenguajes+de+Programaci_26002300_243_3B00_n/default.aspx">Lenguajes de Programaci&amp;#243;n</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/Javascript/default.aspx">Javascript</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/Proyectos+de+C_26002300_243_3B00_digo+Abierto/default.aspx">Proyectos de C&amp;#243;digo Abierto</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/NodeJs/default.aspx">NodeJs</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/COBOL/default.aspx">COBOL</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/Compilador/default.aspx">Compilador</category></item><item><title>PythonSharp (1) Un servidor web mínimo</title><link>http://msmvps.com/blogs/lopez/archive/2012/12/08/pythonsharp_2D00_1_2D00_a_2D00_minimal_2D00_web_2D00_server.aspx</link><pubDate>Sat, 08 Dec 2012 14:38:56 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1820579</guid><dc:creator>lopez</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/lopez/rsscomments.aspx?PostID=1820579</wfw:commentRss><comments>http://msmvps.com/blogs/lopez/archive/2012/12/08/pythonsharp_2D00_1_2D00_a_2D00_minimal_2D00_web_2D00_server.aspx#comments</comments><description>&lt;p&gt;El mes pasado (Noviembre 2012) presenté mi trabajo con PythonSharp en PyCon 2012 Argentina (ver &lt;a href="http://msmvps.com/blogs/lopez/archive/2012/11/17/mi-charla-en-pycon-argentina-2012-implementando-python.aspx"&gt;post&lt;/a&gt;), un intérprete Python 3.x que estoy escribiendo en C#. Como en otras de mis implementaciones, éste puede acceder a tipos nativos, para poder aprovechar lo que brinda una librería de clases ya implementada. Como prueba de concepto, escribí un ejemplo de servidor web mínimo:&lt;/p&gt;  &lt;pre style="font-size:10pt;color:white;background-color:black;"&gt;&lt;span style="color:orange;"&gt;from&lt;/span&gt; System &lt;span style="color:orange;"&gt;import&lt;/span&gt; Array&lt;span style="color:cyan;"&gt;,&lt;/span&gt; Byte
&lt;span style="color:orange;"&gt;from&lt;/span&gt; System.Net &lt;span style="color:orange;"&gt;import&lt;/span&gt; HttpListener
&lt;span style="color:orange;"&gt;from&lt;/span&gt; System.IO &lt;span style="color:orange;"&gt;import&lt;/span&gt; Path&lt;span style="color:cyan;"&gt;,&lt;/span&gt; FileStream&lt;span style="color:cyan;"&gt;,&lt;/span&gt; FileMode&lt;span style="color:cyan;"&gt;,&lt;/span&gt; File

root = &lt;span style="color:green;"&gt;&amp;quot;c:/apache-tomcat-6.0.18/webapps/docs&amp;quot;&lt;/span&gt;

bytes = Array.CreateInstance&lt;span style="color:cyan;"&gt;(&lt;/span&gt;Byte&lt;span style="color:cyan;"&gt;,&lt;/span&gt;1024&lt;span style="color:cyan;"&gt;)&lt;/span&gt;

listener = HttpListener&lt;span style="color:cyan;"&gt;()&lt;/span&gt;
listener.Prefixes.Add&lt;span style="color:cyan;"&gt;(&lt;/span&gt;&lt;span style="color:green;"&gt;&amp;quot;http://*:8000/&amp;quot;&lt;/span&gt;&lt;span style="color:cyan;"&gt;)&lt;/span&gt;

&lt;span style="color:orange;"&gt;def&lt;/span&gt; process&lt;span style="color:cyan;"&gt;(&lt;/span&gt;context&lt;span style="color:cyan;"&gt;):&lt;/span&gt;
    filename = context.Request.Url.AbsolutePath
    &lt;span style="color:orange;"&gt;if&lt;/span&gt; &lt;span style="color:orange;"&gt;not&lt;/span&gt; filename &lt;span style="color:orange;"&gt;or&lt;/span&gt; filename == &lt;span style="color:green;"&gt;&amp;#39;/&amp;#39;&lt;/span&gt;&lt;span style="color:cyan;"&gt;:&lt;/span&gt;
        filename = &lt;span style="color:green;"&gt;&amp;quot;index.html&amp;quot;&lt;/span&gt;
    &lt;span style="color:orange;"&gt;if&lt;/span&gt; filename&lt;span style="color:cyan;"&gt;[&lt;/span&gt;0&lt;span style="color:cyan;"&gt;]&lt;/span&gt; == &lt;span style="color:green;"&gt;&amp;#39;/&amp;#39;&lt;/span&gt;&lt;span style="color:cyan;"&gt;:&lt;/span&gt;
        filename = filename&lt;span style="color:cyan;"&gt;[&lt;/span&gt;1&lt;span style="color:cyan;"&gt;:]&lt;/span&gt;
    &lt;span style="color:orange;"&gt;print&lt;/span&gt;&lt;span style="color:cyan;"&gt;(&lt;/span&gt;filename&lt;span style="color:cyan;"&gt;)&lt;/span&gt;
    filename = Path.Combine&lt;span style="color:cyan;"&gt;(&lt;/span&gt;root&lt;span style="color:cyan;"&gt;,&lt;/span&gt; filename&lt;span style="color:cyan;"&gt;)&lt;/span&gt;
    &lt;span style="color:orange;"&gt;print&lt;/span&gt;&lt;span style="color:cyan;"&gt;(&lt;/span&gt;filename&lt;span style="color:cyan;"&gt;)&lt;/span&gt;
    &lt;span style="color:orange;"&gt;if&lt;/span&gt; &lt;span style="color:orange;"&gt;not&lt;/span&gt; File.Exists&lt;span style="color:cyan;"&gt;(&lt;/span&gt;filename&lt;span style="color:cyan;"&gt;):&lt;/span&gt;
        context.Response.Abort&lt;span style="color:cyan;"&gt;()&lt;/span&gt;
        &lt;span style="color:orange;"&gt;return&lt;/span&gt;
    input = FileStream&lt;span style="color:cyan;"&gt;(&lt;/span&gt;filename&lt;span style="color:cyan;"&gt;,&lt;/span&gt; FileMode.Open&lt;span style="color:cyan;"&gt;)&lt;/span&gt;
    bytes = Array.CreateInstance&lt;span style="color:cyan;"&gt;(&lt;/span&gt;Byte&lt;span style="color:cyan;"&gt;,&lt;/span&gt; 1024 * 16&lt;span style="color:cyan;"&gt;)&lt;/span&gt;
    nbytes = input.Read&lt;span style="color:cyan;"&gt;(&lt;/span&gt;bytes&lt;span style="color:cyan;"&gt;,&lt;/span&gt; 0&lt;span style="color:cyan;"&gt;,&lt;/span&gt; bytes.Length&lt;span style="color:cyan;"&gt;)&lt;/span&gt;
    &lt;span style="color:orange;"&gt;while&lt;/span&gt; nbytes&lt;span style="color:cyan;"&gt;&amp;gt;&lt;/span&gt;0&lt;span style="color:cyan;"&gt;:&lt;/span&gt;
        context.Response.OutputStream.Write&lt;span style="color:cyan;"&gt;(&lt;/span&gt;bytes&lt;span style="color:cyan;"&gt;,&lt;/span&gt; 0&lt;span style="color:cyan;"&gt;,&lt;/span&gt; nbytes&lt;span style="color:cyan;"&gt;)&lt;/span&gt;
        nbytes = input.Read&lt;span style="color:cyan;"&gt;(&lt;/span&gt;bytes&lt;span style="color:cyan;"&gt;,&lt;/span&gt; 0&lt;span style="color:cyan;"&gt;,&lt;/span&gt; bytes.Length&lt;span style="color:cyan;"&gt;)&lt;/span&gt;
    input.Close&lt;span style="color:cyan;"&gt;()&lt;/span&gt;
    context.Response.OutputStream.Close&lt;span style="color:cyan;"&gt;()&lt;/span&gt;

listener.Start&lt;span style="color:cyan;"&gt;()&lt;/span&gt;

&lt;span style="color:orange;"&gt;while&lt;/span&gt; True&lt;span style="color:cyan;"&gt;:&lt;/span&gt;
    context = listener.GetContext&lt;span style="color:cyan;"&gt;()&lt;/span&gt;
    &lt;span style="color:orange;"&gt;print&lt;/span&gt;&lt;span style="color:cyan;"&gt;(&lt;/span&gt;&lt;span style="color:green;"&gt;&amp;quot;new request&amp;quot;&lt;/span&gt;&lt;span style="color:cyan;"&gt;)&lt;/span&gt;
    process&lt;span style="color:cyan;"&gt;(&lt;/span&gt;context&lt;span style="color:cyan;"&gt;)&lt;/span&gt;
        &lt;/pre&gt;

&lt;p&gt;Vean el archivo en el repo:&lt;/p&gt;

&lt;p&gt;&lt;a title="https://github.com/ajlopez/PythonSharp/blob/master/Src/PythonSharp.Console/examples/httpserver.py" href="https://github.com/ajlopez/PythonSharp/blob/master/Src/PythonSharp.Console/examples/httpserver.py"&gt;https://github.com/ajlopez/PythonSharp/blob/master/Src/PythonSharp.Console/examples/httpserver.py&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Para ejecutar el ejemplo, hay que compilar la solución, y el proyecto PythonSharp.Console produce entonces un programa de consola pysh.exe. Pueden cambiar el valor de la variable root, que apunta en el ejemplo de arriba a mi disco local, donde tengo unos archivos estáticos con la documentación de un servidor Tomcat ;-) . Ejecutando pysh Programs\httpserver.py, se levanta el servidor, al que pueden como &lt;a href="http://localhost:8080"&gt;http://localhost:8080&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src="http://www.ajlopez.com/images/articles2/pythonsharp15.jpg" alt="" /&gt;&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;El código de este servidor mínimo se basa en mis anteriores ejemplos:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://ajlopez.wordpress.com/2011/02/01/a-minimal-http-server-in-c/"&gt;A Minimal Http Server In C#&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="http://ajlopez.wordpress.com/2010/11/27/a-minimal-http-server-in-java/"&gt;A Minimal Http Server in Java&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Como ven en el código, puedo importar namespaces .NET y manejarlos como si fueran módulos de Python. Estoy trabajando con .NET 3.5 (me gusta mantener al mínimo los requerimientos) así que no pude aprovechar otros métodos para copiar un archivo a la corriente de salida de la respuesta web, vean:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://stackoverflow.com/questions/230128/best-way-to-copy-between-two-stream-instances"&gt;Best way to copy between two Stream instances&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ahora, pasé a trabajar en tener la misma implementación para mi AjTalk, una Smalltalk Virtual Machine en C#. Ya lo tengo andando, pero eso es tema para otro post.&lt;/p&gt;

&lt;p&gt;Nos leemos!&lt;/p&gt;

&lt;p&gt;Angel “Java” Lopez
  &lt;br /&gt;&lt;a href="http://www.ajlopez.com"&gt;http://www.ajlopez.com&lt;/a&gt;

  &lt;br /&gt;&lt;a href="http://twitter.com/ajlopez"&gt;http://twitter.com/ajlopez&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1820579" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/lopez/archive/tags/C+Sharp/default.aspx">C Sharp</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/Lenguajes+de+Programaci_26002300_243_3B00_n/default.aspx">Lenguajes de Programaci&amp;#243;n</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/Python/default.aspx">Python</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/Proyectos+de+C_26002300_243_3B00_digo+Abierto/default.aspx">Proyectos de C&amp;#243;digo Abierto</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/PythonSharp/default.aspx">PythonSharp</category></item><item><title>Resoluciones del Nuevo Mes: Diciembre 2012</title><link>http://msmvps.com/blogs/lopez/archive/2012/12/04/resoluciones-del-nuevo-mes-diciembre-2012.aspx</link><pubDate>Tue, 04 Dec 2012 17:45:48 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1820390</guid><dc:creator>lopez</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/lopez/rsscomments.aspx?PostID=1820390</wfw:commentRss><comments>http://msmvps.com/blogs/lopez/archive/2012/12/04/resoluciones-del-nuevo-mes-diciembre-2012.aspx#comments</comments><description>&lt;p&gt;Parece mentira, llegó el último mes de este año. Bueno, es tiempo de escribir las resoluciones de Diciembre, primero &lt;a href="http://msmvps.com/blogs/lopez/archive/2012/11/07/resoluciones-del-nuevo-mes-noviembre-2012.aspx"&gt;un repaso de las de Noviembre&lt;/a&gt;:&lt;/p&gt;  &lt;p&gt;- Trabajar en PythonSharp &lt;strong&gt;[&lt;font color="#008000"&gt;completo&lt;/font&gt;] &lt;/strong&gt;&lt;a href="https://github.com/ajlopez/PythonSharp"&gt;ver repo&lt;/a&gt;    &lt;br /&gt;- Dar una charla Implementando Python en PyCon 2012 (Argentina) &lt;strong&gt;[&lt;font color="#008000"&gt;completo&lt;/font&gt;] &lt;/strong&gt;&lt;a href="http://msmvps.com/blogs/lopez/archive/2012/11/17/mi-charla-en-pycon-argentina-2012-implementando-python.aspx"&gt;ver post&lt;/a&gt;    &lt;br /&gt;- Trabajar en AjTalk para Java &lt;strong&gt;[&lt;font color="#ff0000"&gt;pending&lt;/font&gt;]&lt;/strong&gt;    &lt;br /&gt;- Trabajar en AjTalk para Javascript &lt;strong&gt;[&lt;font color="#ff0000"&gt;pending&lt;/font&gt;]&lt;/strong&gt;    &lt;br /&gt;- Trabajar en BasicScript (lo quiero usar como ejemplo en mi proyecto Game Server) &lt;strong&gt;[&lt;font color="#804040"&gt;partial&lt;/font&gt;]&lt;/strong&gt; solamente demos y diseño    &lt;br /&gt;- Comenzar a pasar a Markdown mi tutorial de Java en español &lt;strong&gt;[&lt;font color="#804040"&gt;partial&lt;/font&gt;]&lt;/strong&gt; solo organizar el material    &lt;br /&gt;- Comenzar a escribir en Markdown lo que muestro en mi curso de Node.js &lt;strong&gt;[&lt;font color="#ff0000"&gt;pending&lt;/font&gt;]&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;En vez de trabajar en el AjTalk de Java o de JavaScript, estuve trabajando bastante en la versión C#&lt;/p&gt;  &lt;p&gt;- Trabajar en AjTalk para C# &lt;strong&gt;[&lt;font color="#008000"&gt;completo&lt;/font&gt;] &lt;/strong&gt; &lt;a href="https://github.com/ajlopez/AjTalk"&gt;see repo&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Voy a dar un curso de Node.js, y algún podcast, mis nuevas resoluciones:&lt;/p&gt;  &lt;p&gt;- Trabajar en PythonSharp   &lt;br /&gt;- Trabajar en AjTalk para C#    &lt;br /&gt;- Dar un curso de todo un día de Node.js    &lt;br /&gt;- Participar de un podcast sobre Generación de Código    &lt;br /&gt;- Comenzar a pasar a Markdown mi tutorial de Java&lt;/p&gt;  &lt;p&gt;Agrego:&lt;/p&gt;  &lt;p&gt;- Nuevo proyecto en PHP, propiedades inmobiliarias&lt;/p&gt;  &lt;p&gt;Espero escribir posts sobre lo nuevo que agregué en AjTalk de C#, ejemplos, etc. Ahora puede leer y grabar imágenes, tiene un ejemplo de web server mínimo, estoy agregando soporte de Traits, tiene un simple assert para hacer TDD simple, environments e import de paquetes, y tutti li fiocci ;-)&lt;/p&gt;  &lt;p&gt;Nos leemos!&lt;/p&gt;  &lt;p&gt;Angel “Java” Lopez   &lt;br /&gt;&lt;a href="http://www.ajlopez.com/"&gt;http://www.ajlopez.com&lt;/a&gt;    &lt;br /&gt;&lt;a href="http://twitter.com/ajlopez"&gt;http://twitter.com/ajlopez&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1820390" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/lopez/archive/tags/Smalltalk/default.aspx">Smalltalk</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/Lenguajes+de+Programaci_26002300_243_3B00_n/default.aspx">Lenguajes de Programaci&amp;#243;n</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/Python/default.aspx">Python</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/Proyectos+de+C_26002300_243_3B00_digo+Abierto/default.aspx">Proyectos de C&amp;#243;digo Abierto</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/NodeJs/default.aspx">NodeJs</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/Desarrollo+de+Juegos/default.aspx">Desarrollo de Juegos</category></item><item><title>Mi Charla en PyCon Argentina 2012: Implementando Python</title><link>http://msmvps.com/blogs/lopez/archive/2012/11/17/mi-charla-en-pycon-argentina-2012-implementando-python.aspx</link><pubDate>Sat, 17 Nov 2012 14:28:34 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1819373</guid><dc:creator>lopez</dc:creator><slash:comments>3</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/lopez/rsscomments.aspx?PostID=1819373</wfw:commentRss><comments>http://msmvps.com/blogs/lopez/archive/2012/11/17/mi-charla-en-pycon-argentina-2012-implementando-python.aspx#comments</comments><description>&lt;p&gt;Hoy sábado 17 de Noviembre, voy a dar una charla sobre “Implementando Python”. Mi presentación en:&lt;/p&gt;  &lt;p&gt;&lt;a title="http://t.co/whCm0uAt" href="http://t.co/whCm0uAt"&gt;http://t.co/whCm0uAt&lt;/a&gt;    &lt;br /&gt;&lt;a title="https://skydrive.live.com/view.aspx?resid=9F903F3D6DB0C176!5889&amp;amp;cid=9f903f3d6db0c176&amp;amp;app=PowerPoint" href="https://skydrive.live.com/view.aspx?resid=9F903F3D6DB0C176!5889&amp;amp;cid=9f903f3d6db0c176&amp;amp;app=PowerPoint"&gt;https://skydrive.live.com/view.aspx?resid=9F903F3D6DB0C176!5889&amp;amp;cid=9f903f3d6db0c176&amp;amp;app=PowerPoint&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Sobre Python como lenguaje y comentarios a distintas implementaciones:&lt;/p&gt;  &lt;p&gt;&lt;b&gt;&lt;a href="http://en.wikipedia.org/wiki/Python_(progamming_language)"&gt;http://en.wikipedia.org/wiki/Python_(progamming_language)&lt;/a&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;Voy a mostrar:&lt;/p&gt;  &lt;h3&gt;CPython&lt;/h3&gt;  &lt;p&gt;&lt;a href="http://www.python.org"&gt;http://www.python.org&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.python.org/download/releases/3.3.0/"&gt;http://www.python.org/download/releases/3.3.0/&lt;/a&gt; de aquí bajé el fuente que uso en la charla&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.python.org/getit/"&gt;http://www.python.org/getit/&lt;/a&gt;    &lt;br /&gt;&lt;a href="http://www.python.org/getit/source/"&gt;http://www.python.org/getit/source/&lt;/a&gt;    &lt;br /&gt;&lt;a href="http://docs.python.org/devguide/"&gt;http://docs.python.org/devguide/&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Estuve consultando: &lt;a href="http://www.slideshare.net/artagnon/an-insight-into-cpython-compiler-design"&gt;http://www.slideshare.net/artagnon/an-insight-into-cpython-compiler-design&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Para el tema del módulo ast vi:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://eli.thegreenplace.net/2009/11/28/python-internals-working-with-python-asts/"&gt;http://eli.thegreenplace.net/2009/11/28/python-internals-working-with-python-asts/&lt;/a&gt;    &lt;br /&gt;&lt;a href="http://codemonkeytips.blogspot.com.ar/2010/08/simple-python-nodevisitor-example.html"&gt;http://codemonkeytips.blogspot.com.ar/2010/08/simple-python-nodevisitor-example.html&lt;/a&gt;&lt;/p&gt;  &lt;h3&gt;IronPython&lt;/h3&gt;  &lt;p&gt;&lt;a href="http://ironpython.codeplex.com/"&gt;http://ironpython.codeplex.com/&lt;/a&gt;    &lt;br /&gt;&lt;a href="https://github.com/IronLanguages/main"&gt;https://github.com/IronLanguages/main&lt;/a&gt; es el repo que uso en la presentación&lt;/p&gt;  &lt;h3&gt;Jython&lt;/h3&gt;  &lt;p&gt;&lt;a href="http://www.jython.org/"&gt;http://www.jython.org/&lt;/a&gt;    &lt;br /&gt;&lt;a href="http://wiki.python.org/jython/JythonFaq"&gt;http://wiki.python.org/jython/JythonFaq&lt;/a&gt;    &lt;br /&gt;&lt;a href="http://wiki.python.org/jython/DeveloperFAQ"&gt;http://wiki.python.org/jython/DeveloperFAQ&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Jar ejecutable en &lt;a href="http://www.jython.org/downloads.html"&gt;http://www.jython.org/downloads.html&lt;/a&gt;    &lt;br /&gt;&lt;a href="http://wiki.python.org/jython/InstallationInstructions"&gt;http://wiki.python.org/jython/InstallationInstructions&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Para el fuente, bajé el jar de 2.5.3 que esta apuntado desde &lt;a href="http://www.jython.org/downloads.html"&gt;http://www.jython.org/downloads.html&lt;/a&gt;&amp;#160; &lt;br /&gt;con enlace:    &lt;br /&gt;&lt;a href="http://search.maven.org/#search%7Cga%7C1%7Cg%3A%22org.python%22%20AND%20v%3A%222.5.3%22"&gt;http://search.maven.org/#search%7Cga%7C1%7Cg%3A%22org.python%22%20AND%20v%3A%222.5.3%22&lt;/a&gt;&lt;/p&gt;  &lt;h3&gt;PyPy&lt;/h3&gt;  &lt;p&gt;&lt;b&gt;&lt;a href="http://pypy.org/"&gt;http://pypy.org/&lt;/a&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;Ver features en &lt;a href="http://pypy.org/features.html"&gt;http://pypy.org/features.html&lt;/a&gt;    &lt;br /&gt;soporta ctypes &lt;a href="http://docs.python.org/release/2.7.2/library/ctypes.html"&gt;http://docs.python.org/release/2.7.2/library/ctypes.html&lt;/a&gt; foreign function library for python    &lt;br /&gt;Lo baje de &lt;a href="http://pypy.org/download.html"&gt;http://pypy.org/download.html&lt;/a&gt;    &lt;br /&gt;Ahi hay un enlace a codigo fuente, Unix end of line &lt;a href="https://bitbucket.org/pypy/pypy/get/release-1.9.zip"&gt;https://bitbucket.org/pypy/pypy/get/release-1.9.zip&lt;/a&gt;    &lt;br /&gt;o lo pueden obtener con mercurial: &lt;/p&gt;  &lt;p&gt;&lt;font face="Consolas"&gt;hg clone &lt;/font&gt;&lt;a href="https://bitbucket.org/pypy/pypy"&gt;&lt;font face="Consolas"&gt;https://bitbucket.org/pypy/pypy&lt;/font&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;   &lt;br /&gt;Lo binario en &lt;a href="http://pypy.org/download.html#default-with-a-jit-compiler"&gt;http://pypy.org/download.html#default-with-a-jit-compiler&lt;/a&gt;    &lt;br /&gt;Baje https://bitbucket.org/pypy/pypy/downloads/pypy-1.9-win32.zip&lt;/p&gt;  &lt;h3&gt;PythonSharp&lt;/h3&gt;  &lt;p&gt;Y voy a comentar sobre mi implementación PythonSharp (Work In Progress)&lt;/p&gt;  &lt;p&gt;&lt;a title="https://github.com/ajlopez/PythonSharp" href="https://github.com/ajlopez/PythonSharp"&gt;https://github.com/ajlopez/PythonSharp&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Tengo los ejemplos &lt;a title="https://github.com/ajlopez/PythonSharp/tree/master/Src/PythonSharp.Console/examples" href="https://github.com/ajlopez/PythonSharp/tree/master/Src/PythonSharp.Console/examples"&gt;https://github.com/ajlopez/PythonSharp/tree/master/Src/PythonSharp.Console/examples&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Espero que les guste.&lt;/p&gt;  &lt;p&gt;Nos leemos!&lt;/p&gt;  &lt;p&gt;Angel “Java” Lopez   &lt;br /&gt;&lt;a href="http://www.ajlopez.com"&gt;http://www.ajlopez.com&lt;/a&gt;    &lt;br /&gt;&lt;a href="http://twitter.com/ajlopez"&gt;http://twitter.com/ajlopez&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1819373" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/lopez/archive/tags/Lenguajes+de+Programaci_26002300_243_3B00_n/default.aspx">Lenguajes de Programaci&amp;#243;n</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/Argentina/default.aspx">Argentina</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/Python/default.aspx">Python</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/Proyectos+de+C_26002300_243_3B00_digo+Abierto/default.aspx">Proyectos de C&amp;#243;digo Abierto</category></item><item><title>Resoluciones del Nuevo Mes: Noviembre 2012</title><link>http://msmvps.com/blogs/lopez/archive/2012/11/07/resoluciones-del-nuevo-mes-noviembre-2012.aspx</link><pubDate>Wed, 07 Nov 2012 16:15:49 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1818911</guid><dc:creator>lopez</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/lopez/rsscomments.aspx?PostID=1818911</wfw:commentRss><comments>http://msmvps.com/blogs/lopez/archive/2012/11/07/resoluciones-del-nuevo-mes-noviembre-2012.aspx#comments</comments><description>&lt;p&gt;Revisión de &lt;a href="http://msmvps.com/blogs/lopez/archive/2012/10/02/resoluciones-del-nuevo-mes-octubre-2012.aspx"&gt;mis resoluciones de Octubre&lt;/a&gt;:&lt;/p&gt;  &lt;p&gt;- Dar una charla sobre lenguajes de programación en Javascript &lt;strong&gt;&lt;font color="#008000"&gt;[completo]&lt;/font&gt;&lt;/strong&gt; &lt;a href="http://www.youtube.com/watch?feature=player_embedded&amp;amp;v=khbun9jb2T8"&gt;ver video&lt;/a&gt;     &lt;br /&gt;- Dar una chalar sobre Node.js/Socket.IO, aplicaciones web de tiempo real &lt;strong&gt;&lt;font color="#008000"&gt;[completo]&lt;/font&gt;&lt;/strong&gt; &lt;a href="http://msmvps.com/blogs/lopez/archive/2012/11/01/node-js-express-y-socket-io-en-udadev-2012-cuenca-ecuador.aspx"&gt;ver post&lt;/a&gt;    &lt;br /&gt;- Trabajar en PythonSharp &lt;strong&gt;&lt;font color="#008000"&gt;[completo]&lt;/font&gt;&lt;/strong&gt; &lt;a href="https://github.com/ajlopez/PythonSharp"&gt;ver repo&lt;/a&gt;     &lt;br /&gt;- Trabajar en AjTalk para Java &lt;strong&gt;&lt;font color="#800000"&gt;[pendiente]&lt;/font&gt;&lt;/strong&gt;     &lt;br /&gt;- Trabajar en AjConsorSite &lt;font color="#800000"&gt;&lt;strong&gt;[parcial]&lt;/strong&gt;&lt;/font&gt;&lt;font color="#000000"&gt;&lt;strong&gt; &lt;/strong&gt;solo tuve demo y reuniones&lt;/font&gt;     &lt;br /&gt;- Trabajar en GameServer &lt;font color="#800000"&gt;&lt;strong&gt;[parcial] &lt;/strong&gt;&lt;font color="#000000"&gt;&lt;strong&gt;&lt;/strong&gt;solo tuve demo y reuniones&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;Adicionalmente, estuve trabajando en:&lt;/p&gt;  &lt;p&gt;- Actualizar mis ejemplos de Node.js &lt;strong&gt;&lt;font color="#008000"&gt;[completo]&lt;/font&gt;&lt;/strong&gt; &lt;a href="https://github.com/ajlopez/NodeSamples"&gt;ver repo&lt;/a&gt;     &lt;br /&gt;- Autómata celular en Javascript/Node.js &lt;strong&gt;&lt;font color="#008000"&gt;[completo]&lt;/font&gt;&lt;/strong&gt; &lt;a href="https://github.com/ajlopez/Cellular"&gt;ver repo&lt;/a&gt;     &lt;br /&gt;- Mejoras menores de &lt;a href="https://github.com/ajlopez/AjTalkJs"&gt;AjTalkJs&lt;/a&gt; y &lt;a href="https://github.com/ajlopez/AjLispJs"&gt;AjLispJs&lt;/a&gt;     &lt;br /&gt;- Comenzar mi Basic Script (para Javascript/Node.js) &lt;font color="#008000"&gt;&lt;strong&gt;[completo] &lt;/strong&gt;&lt;/font&gt;&lt;font color="#000000"&gt;&lt;a href="https://github.com/ajlopez/BasicScript"&gt;ver repo&lt;/a&gt;       &lt;br /&gt;- Comenzar a portar AjGroups (librería de grupos finitos) a Javascript/Node.js &lt;/font&gt;&lt;font color="#008000"&gt;&lt;strong&gt;[completo] &lt;/strong&gt;&lt;/font&gt;&lt;font color="#000000"&gt;&lt;a href="https://github.com/ajlopez/AjGroupsJs"&gt;ver repo&lt;/a&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#000000"&gt;Para este nuevo mes:&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#000000"&gt;- Trabajar en PythonSharp      &lt;br /&gt;- Dar una charla sobre Implementando Python, en PyCon 2012 Argentina       &lt;br /&gt;- Trabajar en AjTalk para Java       &lt;br /&gt;- Trabajar en AjTalk para Javascript       &lt;br /&gt;- Trabajar en BasicScript (quiero comenzar a usarlo para que se pueda definir la lógica de un juego ejemplo de mi GameServer)       &lt;br /&gt;- Comenzar páginas markdown con Tutorial de Java, en español&amp;#160; &lt;br /&gt;- Comenzar páginas markdown con Tutorial de Node.js en español&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#000000"&gt;Nos leemos!&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#000000"&gt;Angel “Java” Lopez      &lt;br /&gt;&lt;a href="http://www.ajlopez.com"&gt;http://www.ajlopez.com&lt;/a&gt;       &lt;br /&gt;&lt;a href="http://twitter.com/ajlopez"&gt;http://twitter.com/ajlopez&lt;/a&gt;&lt;/font&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1818911" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/lopez/archive/tags/Smalltalk/default.aspx">Smalltalk</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/Desarrollo+de+Software/default.aspx">Desarrollo de Software</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/Lenguajes+de+Programaci_26002300_243_3B00_n/default.aspx">Lenguajes de Programaci&amp;#243;n</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/Programaci_F300_n/default.aspx">Programación</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/Python/default.aspx">Python</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/Javascript/default.aspx">Javascript</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/Proyectos+de+C_26002300_243_3B00_digo+Abierto/default.aspx">Proyectos de C&amp;#243;digo Abierto</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/NodeJs/default.aspx">NodeJs</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/Desarrollo+de+Juegos/default.aspx">Desarrollo de Juegos</category></item><item><title>Lenguajes de Programación en Javascript para Bogotá JS</title><link>http://msmvps.com/blogs/lopez/archive/2012/10/17/lenguajes-de-programaci-243-n-en-javascript-para-bogot-225-js.aspx</link><pubDate>Wed, 17 Oct 2012 17:20:45 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1818150</guid><dc:creator>lopez</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/lopez/rsscomments.aspx?PostID=1818150</wfw:commentRss><comments>http://msmvps.com/blogs/lopez/archive/2012/10/17/lenguajes-de-programaci-243-n-en-javascript-para-bogot-225-js.aspx#comments</comments><description>&lt;p&gt;Hace un tiempo escribí sobre la actividad que &lt;a href="http://msmvps.com/blogs/lopez/archive/2012/09/19/bogot-225-js-pr-243-xima-javascript-hangout-sobre-gr-225-ficos-y-visualizaci-243-n-de-datos.aspx"&gt;están desarrollando en Bogotá JS&lt;/a&gt;. Este sábado próximo, 20 de Octubre, voy a participar de esa actividad, compartiendo una charla sobre lenguajes de programación en Javascript. Ver:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://jshangouts.org/"&gt;http://jshangouts.org/&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Leo ahí:&lt;/p&gt;  &lt;p&gt;Javascript es un lenguaje maduro y dinámico, que puede ejecutarse en distintas plataformas (clientes, servidor) y dispositivos. Hay docenas de lenguajes implementados en Javascript. Veremos algunas formas de implementación de intérpretes y máquinas virtuales, en navegadores y en Node.js como servidor.&lt;/p&gt;  &lt;p&gt;Mi idea es mostrar algunas implementaciones y estrategias de implementación de lenguajes de programación sobre Javascript. Quiero mostrar por lo menos algún intérprete (basado en un árbol de evaluación en memoria), uno lenguaje implementado sobre bytecodes (donde una máquina virtual Javascript los va ejecutando) y un lenguaje implementado por compilación a Javascript. Quiero mostrar algo de Typescript, el “new kid on the block”, y ver cómo compila a Javascript.&lt;/p&gt;  &lt;p&gt;Habrá ejemplos sencillos, con Javascript para browser y servidor Node.js, escritos usando TDD, y otros ejemplos más completos, con código en GitHub (por ejemplo, quiero mostrar Amber, Smalltalk en Javascript).&lt;/p&gt;  &lt;p&gt;Espero que les resulte interesante y útil. Seguramente como modo Hangout, luego quedará publicada como video en Youtube.&lt;/p&gt;  &lt;p&gt;Nos leemos!&lt;/p&gt;  &lt;p&gt;Angel “Java” Lopez   &lt;br /&gt;&lt;a href="http://www.ajlopez.com"&gt;http://www.ajlopez.com&lt;/a&gt;    &lt;br /&gt;&lt;a href="http://twitter.com/ajlopez"&gt;http://twitter.com/ajlopez&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1818150" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/lopez/archive/tags/Lenguajes+de+Programaci_26002300_243_3B00_n/default.aspx">Lenguajes de Programaci&amp;#243;n</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/Javascript/default.aspx">Javascript</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/Proyectos+de+C_26002300_243_3B00_digo+Abierto/default.aspx">Proyectos de C&amp;#243;digo Abierto</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/Reuniones/default.aspx">Reuniones</category></item><item><title>Resoluciones del Nuevo Mes: Octubre 2012</title><link>http://msmvps.com/blogs/lopez/archive/2012/10/02/resoluciones-del-nuevo-mes-octubre-2012.aspx</link><pubDate>Tue, 02 Oct 2012 17:09:18 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1817648</guid><dc:creator>lopez</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/lopez/rsscomments.aspx?PostID=1817648</wfw:commentRss><comments>http://msmvps.com/blogs/lopez/archive/2012/10/02/resoluciones-del-nuevo-mes-octubre-2012.aspx#comments</comments><description>&lt;p&gt;Es tiempo de revisar &lt;a href="http://msmvps.com/blogs/lopez/archive/2012/09/06/resoluciones-del-nuevo-mes-septiembre-2012.aspx"&gt;mis resoluciones del mes pasado&lt;/a&gt; y escribir las de este mes:&lt;/p&gt;  &lt;p&gt;- Dar una charla sobre aplicaciones distribuidas &lt;strong&gt;&lt;font color="#008000"&gt;[completo]&lt;/font&gt;&lt;/strong&gt; &lt;a href="http://msmvps.com/blogs/lopez/archive/2012/09/25/presentando-node-js.aspx"&gt;ver post&lt;/a&gt;     &lt;br /&gt;- Dar una charla sobre TDD con .NET &lt;strong&gt;&lt;font color="#008000"&gt;[completo]&lt;/font&gt;&lt;/strong&gt; &lt;a href="http://msmvps.com/blogs/lopez/archive/2012/09/26/presentando-tdd.aspx"&gt;ver post&lt;/a&gt;     &lt;br /&gt;- Seguir trabajando en PythonSharp &lt;strong&gt;&lt;font color="#008000"&gt;[completo]&lt;/font&gt;&lt;/strong&gt; &lt;a href="https://github.com/ajlopez/PythonSharp"&gt;ver repo&lt;/a&gt;     &lt;br /&gt;- Seguir preparando mi charla sobre generación de código en Ruby &lt;strong&gt;&lt;font color="#008000"&gt;[completo]&lt;/font&gt;&lt;/strong&gt;     &lt;br /&gt;- Seguir preparando mi charla para Python PyCon Argentina &lt;strong&gt;&lt;font color="#008000"&gt;[completo]&lt;/font&gt;&lt;/strong&gt;     &lt;br /&gt;- Más trabajo en AjConsorSite &lt;strong&gt;&lt;font color="#008000"&gt;[completo]&lt;/font&gt;&lt;/strong&gt; &lt;a href="https://github.com/ajlopez/AjConsorSite"&gt;ver repo&lt;/a&gt;     &lt;br /&gt;- Trabajar en AjContab (versión PHP) &lt;strong&gt;&lt;font color="#008000"&gt;[completo]&lt;/font&gt;&lt;/strong&gt; &lt;a href="https://github.com/ajlopez/AjContabPhp"&gt;ver repo&lt;/a&gt;     &lt;br /&gt;- Trabajar en AjTalk para Java &lt;strong&gt;&lt;font color="#008000"&gt;[completo]&lt;/font&gt;&lt;/strong&gt; &lt;a href="https://github.com/ajlopez/AjTalkJava"&gt;ver repo&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;También estuve trabajando en GameServer &lt;a href="http://msmvps.com/blogs/lopez/archive/2012/09/15/un-simple-servidor-de-juegos.aspx"&gt;ver post&lt;/a&gt;&amp;#160; &lt;a href="https://github.com/ajlopez/GameServer"&gt;ver repo&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Resoluciones para Octubre:&lt;/p&gt;  &lt;p&gt;- Dar una charla sobre lenguajes de programación en Javascript    &lt;br /&gt;- Dar una charla sobre about Node.js/Socket.io aplicaciones web real-time     &lt;br /&gt;- Trabajar en PythonSharp     &lt;br /&gt;- Trabajar en AjTalk para Java     &lt;br /&gt;- Trabajar en AjConsorSite     &lt;br /&gt;- Trabajar en GameServer&lt;/p&gt;  &lt;p&gt;Las dos charlas planeadas me van a llevar tiempo de preparación, igual pienso trabajar en los otros proyectos. Quiero presentar mi trabajo en PythonSharp en la PyCon Argentina 2012, en Noviembre.&lt;/p&gt;  &lt;p&gt;Nos leemos! &lt;/p&gt;  &lt;p&gt;Angel “Java” Lopez    &lt;br /&gt;&lt;a href="http://www.ajlopez.com"&gt;http://www.ajlopez.com&lt;/a&gt;     &lt;br /&gt;&lt;a href="http://twitter.com/ajlopez"&gt;http://twitter.com/ajlopez&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1817648" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/lopez/archive/tags/Smalltalk/default.aspx">Smalltalk</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/Desarrollo+de+Software/default.aspx">Desarrollo de Software</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/Lenguajes+de+Programaci_26002300_243_3B00_n/default.aspx">Lenguajes de Programaci&amp;#243;n</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/Python/default.aspx">Python</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/Proyectos+de+C_26002300_243_3B00_digo+Abierto/default.aspx">Proyectos de C&amp;#243;digo Abierto</category></item><item><title>Resoluciones del Nuevo Mes: Septiembre 2012</title><link>http://msmvps.com/blogs/lopez/archive/2012/09/06/resoluciones-del-nuevo-mes-septiembre-2012.aspx</link><pubDate>Thu, 06 Sep 2012 17:33:22 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1815937</guid><dc:creator>lopez</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/lopez/rsscomments.aspx?PostID=1815937</wfw:commentRss><comments>http://msmvps.com/blogs/lopez/archive/2012/09/06/resoluciones-del-nuevo-mes-septiembre-2012.aspx#comments</comments><description>&lt;p&gt;Llegó la hora de escribir las resoluciones del nuevo mes. Estuve ocupado anunciando reuniones, pero ya estamos en septiembre y quiero pasar en limpio esta lista. Primer, revisar &lt;a href="http://msmvps.com/blogs/lopez/archive/2012/08/06/resoluciones-del-nuevo-mes-agosto-de-2012.aspx"&gt;el mes pasado&lt;/a&gt;:&lt;/p&gt;  &lt;p&gt;- Comenar a preparar mi charla para Python Argentina &lt;strong&gt;&lt;font color="#008000"&gt;[completo]&lt;/font&gt;&lt;/strong&gt;     &lt;br /&gt;- Trabajar en PythonSharp &lt;strong&gt;&lt;font color="#ff0000"&gt;[pendiente]&lt;/font&gt;&lt;/strong&gt;     &lt;br /&gt;- Escribir un nuevo post sobre TDD &lt;strong&gt;&lt;font color="#008000"&gt;[completo]&lt;/font&gt;&lt;/strong&gt; &lt;a href="http://ajlopez.wordpress.com/2012/08/08/tdd-unit-tests-and-mocks/"&gt;see post&lt;/a&gt;; &lt;a href="http://msmvps.com/blogs/lopez/archive/2012/08/09/tdd_2D00_unit_2D00_tests_2D00_and_2D00_mocks.aspx"&gt;ver post&lt;/a&gt;    &lt;br /&gt;- Continuar preparando una charla sobre generación de código en Ruby &lt;strong&gt;&lt;font color="#008000"&gt;[completo]&lt;/font&gt;&lt;/strong&gt;     &lt;br /&gt;- Comenzar a preparar una charla sobre aplicaciones distribuidas (varios ejemplos en NodeJs) &lt;strong&gt;&lt;font color="#008000"&gt;[completo]&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Estuve ocupado el mes pasado con mis resoluciones no técnicas, especialmente estudiando temas y escribiendo posts (&lt;a href="http://ajlopez.zoomblog.com/archivo/2012/09/01/resoluciones-del-Nuevo-Mes-Septiembre-.html"&gt;ver post&lt;/a&gt;).&lt;/p&gt;  &lt;p&gt;Resoluciones para Septiembre:&lt;/p&gt;  &lt;p&gt;- Dar una charla sobre aplicaciones distribuidas    &lt;br /&gt;- Dar una charla sobre TDD para .NET     &lt;br /&gt;- Continuar trabajando en PythonSharp     &lt;br /&gt;- Continuar preparando la charla sobre generación de código en Ruby     &lt;br /&gt;- Continuar preparando mi charla para Python Argentina     &lt;br /&gt;- Más trabajo en AjConsorSite     &lt;br /&gt;- Trabajar en AjContab (PHP version)     &lt;br /&gt;- Trabajar en AjTalk para Java&lt;/p&gt;  &lt;p&gt;Nos leemos!&lt;/p&gt;  &lt;p&gt;Angel “Java” Lopez    &lt;br /&gt;&lt;a href="http://www.ajlopez.com"&gt;http://www.ajlopez.com&lt;/a&gt;     &lt;br /&gt;&lt;a href="http://twitter.com/ajlopez"&gt;http://twitter.com/ajlopez&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1815937" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/lopez/archive/tags/Desarrollo+de+Software/default.aspx">Desarrollo de Software</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/Lenguajes+de+Programaci_26002300_243_3B00_n/default.aspx">Lenguajes de Programaci&amp;#243;n</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/Proyectos+de+C_26002300_243_3B00_digo+Abierto/default.aspx">Proyectos de C&amp;#243;digo Abierto</category></item></channel></rss>