<?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</title><link>http://msmvps.com/blogs/lopez/archive/tags/Lenguajes+de+Programaci_26002300_243_3B00_n/default.aspx</link><description>Tags: Lenguajes de Programaci&amp;#243;n</description><dc:language>en</dc:language><generator>CommunityServer 2008.5 SP2 (Build: 40407.4157)</generator><item><title>Segunda Nerddinner en Buenos Aires</title><link>http://msmvps.com/blogs/lopez/archive/2009/10/28/segunda-nerddinner-en-buenos-aires.aspx</link><pubDate>Wed, 28 Oct 2009 15:44:44 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1735866</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=1735866</wfw:commentRss><comments>http://msmvps.com/blogs/lopez/archive/2009/10/28/segunda-nerddinner-en-buenos-aires.aspx#comments</comments><description>&lt;p&gt;Hace un par de meses ya tuvimos la primer nerddinner de Buenos Aires, ahora se viene la segunda!&lt;/p&gt;  &lt;p&gt;Pueden ver los detalles en:&lt;/p&gt;  &lt;p&gt;&lt;a title="http://www.nerddinner.com/1236" href="http://www.nerddinner.com/1236"&gt;http://www.nerddinner.com/1236&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;img src="http://www.ajlopez.com/images/articles/nerddinner02.png" alt="" /&gt; &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Pueden inscribirse ahí, o contactar a los organizadores &lt;a href="http://twitter.com/PabloZaiden" target="_blank"&gt;@PabloZaiden&lt;/a&gt; &lt;a href="http://twitter.com/rodolfof" target="_blank"&gt;@Rodolfof&lt;/a&gt; por Twitter. Es el jueves 5 de Noviembre, 21 horas, se espera cerveza y pizza, y conversaciones nerd a full!&lt;/p&gt;  &lt;p&gt;La anterior (y primera en Buenos Aires) se desarrolló en &lt;a href="http://www.lamaie.com.ar"&gt;http://www.lamaie.com.ar&lt;/a&gt; (donde suelo &lt;a href="http://ajlopez.zoomblog.com/archivo/2009/02/16/en-defensa-de-cortar-la-empanada.html" target="_blank"&gt;comer empanadas que corto con cuchillo&lt;/a&gt;), buen lugar, cervezas, y pizzas. Asistieron una veintena de nerds locales, y hubo interesantes discusiones, de todo tipo, desde multitouch hasta “mi mac enciende más rapido que tu Windows 7”. Nerd a full… :-)… Por ejemplo, el bueno de &lt;a href="http://twitter.com/rodolfof" target="_blank"&gt;@Rodolfof&lt;/a&gt; me explicó su trabajo en el “metadata framework” que estuvieron implementando en Lagash, &lt;/p&gt;  &lt;p&gt;La segunda será en la pizzería San Carlos, en Rivadavia 4548:&lt;/p&gt;  &lt;p&gt;&lt;img src="http://www.ajlopez.com/images/articles/nerddinner03.png" alt="" /&gt; &lt;/p&gt;  &lt;p&gt;Según el bueno de @Rodolfof ahí se reunía la gente de FidoNet en los 90. Yo no iba a esas reuniones. Pero recuerdo la pizzería (y café) de la época de principios de los 80. Iba a desayunar ahí, cuando llegaba de Quilmes, a trabajar en un cliente que vendía máquinas y sistemas (en aquel entonces, se vendía todo junto). Tenía que programar con Ohio Scientific, computadoras Ontel, alguna Cromenco, bueno… éramos tan pobres… :-)&lt;/p&gt;  &lt;p&gt;Siempre pueden organizar una nerddinner en su ciudad, Uds. mismos, visitar la portada del sitio:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.nerddinner.com"&gt;http://www.nerddinner.com&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Ven ahí las que están siendo planeadas para los próximos días, en todo el mundo:&lt;/p&gt;  &lt;p&gt;&lt;img src="http://www.ajlopez.com/images/articles/nerddinner01.png" alt="" /&gt; &lt;/p&gt;  &lt;p&gt;La aplicación que soporta al sitio está hecha con ASP.NET MVC, y está publicado el código en:&lt;/p&gt;  &lt;p&gt;&lt;a title="http://nerddinner.codeplex.com/" href="http://nerddinner.codeplex.com/"&gt;http://nerddinner.codeplex.com/&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Para entender cómo lo fueron haciendo en ASP.NET MVC, se pueden bajar un .pdf desde &lt;a title="http://tinyurl.com/aspnetmvc" href="http://tinyurl.com/aspnetmvc"&gt;http://tinyurl.com/aspnetmvc&lt;/a&gt;. Pueden probar de ejecutarlo en Mono, leer: &lt;a title="http://www.jprl.com/Blog/archive/development/mono/2009/May-14.html" href="http://www.jprl.com/Blog/archive/development/mono/2009/May-14.html"&gt;http://www.jprl.com/Blog/archive/development/mono/2009/May-14.html&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=1735866" 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></item><item><title>VAN sobre Boo con Rodolfo Finochietti</title><link>http://msmvps.com/blogs/lopez/archive/2009/10/23/van-sobre-boo-con-rodolfo-finochietti.aspx</link><pubDate>Fri, 23 Oct 2009 09:22:26 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1734501</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=1734501</wfw:commentRss><comments>http://msmvps.com/blogs/lopez/archive/2009/10/23/van-sobre-boo-con-rodolfo-finochietti.aspx#comments</comments><description>&lt;p&gt;&lt;img style="display:inline;margin:0px 20px 20px 0px;" src="http://www.todocontenidos.com/images/articles/boo01.png" align="left" alt="" /&gt; Vuelven las VAN (Reuniones Virtuales) de ALT.NET Hispano. La próxima, es este sábado 24 de Octubre, a las 18:00 GMT/UTC (Greenwich) (En Buenos Aires, con GMT-3, serían las 3 de la tarde). El tema será, principalmente, &lt;a href="http://boo.codehaus.org/" target="_blank"&gt;el lenguaje Boo&lt;/a&gt;, a cargo del bueno de &lt;a href="http://weblogs.shockbyte.com.ar/" target="_blank"&gt;Rodolfo Finochietti&lt;/a&gt; (&lt;a href="http://twitter.com/rodolfof"&gt;@rodofof&lt;/a&gt;).&lt;/p&gt;  &lt;p&gt;Pueden ver detalles en&lt;/p&gt;  &lt;p&gt;&lt;a href="http://groups.google.com/group/altnet-hispano/browse_thread/thread/dab63bbb407c3822?hl=es" target="_blank"&gt;VAN sobre Boo con Rodolfo Finochietti, Sábado 24 de Octubre&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Será en parte, continuación de la anterior&lt;/p&gt;  &lt;p&gt;&lt;a title="Alt.NET Hispano- VAN con Martín Salías y lenguajes en .NET" href="http://msmvps.com/blogs/lopez/archive/2009/10/01/alt-net-hispano-van-con-mart-237-n-sal-237-as-y-lenguajes-en-net.aspx"&gt;Alt.NET Hispano- VAN con Martín Salías y lenguajes en .NET&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Pueden ver el video resultado de esa anterior reunión en:&lt;/p&gt;  &lt;p&gt;&lt;a title="Virtual ALT.NET sobre Lenguajes" href="http://blog.salias.com.ar/2009/10/virtual-altnet-sobre-lenguajes.html"&gt;Virtual ALT.NET sobre Lenguajes&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Son todos temas como los que tratamos en algún TechNight de Buenos Aires, el año pasado: &lt;a title="lenguajes de programación e implementaciones en .NET" href="http://msmvps.com/blogs/lopez/archive/2008/10/16/babel-de-lenguajes-en-net.aspx"&gt;lenguajes de programación e implementaciones en .NET&lt;/a&gt; (ahí dejé bastantes enlaces sobre los temas que ahora están siendo actualizados en esta serie de VANs).&lt;/p&gt;  &lt;p&gt;Según adelanta Rodolfo, el tema será:&lt;/p&gt;  &lt;p&gt;&lt;em&gt;Básicamente mi exposición se va a centrar en porque me gusta Boo. Todos los lenguajes estáticos en .NET son bastante similares (con el DLR esto cambio un poco), y esto creo yo tiene una razón que voy a explicar en el charla. En cambio Boo no se parece un lenguaje .NET. Su diseñador (Rodrigo De Oliveira) lo creo como un herramientas que le facilita la construcción de aplicaciones. &lt;/em&gt;&lt;/p&gt;  &lt;p&gt;&lt;em&gt;Resumiendo: Voy a hacer una intro al diseño de lenguajes estáticos en .NET y después me voy a centrar en Boo y sus características. &lt;/em&gt;&lt;/p&gt;  &lt;p&gt;Recuerden:&lt;/p&gt;  &lt;p&gt;&lt;em&gt;Si no conocen qué es una reunión VAN, pueden consultar &lt;/em&gt;&lt;a href="http://www.zachariahyoung.com/zy/post/2009/01/Introduction-to-Virtual-ALTNET.aspx"&gt;&lt;em&gt;VAN meetings&lt;/em&gt;&lt;/a&gt;&lt;em&gt;. Para ver cómo se desarrolla una VAN de ALT.NET Hispano, y qué software necesitan para asistir, ver &lt;/em&gt;&lt;a href="http://altnet-hispano.pbworks.com/Descripcion-de-Reuniones-VAN"&gt;&lt;em&gt;Descripcion-de-Reuniones-VAN&lt;/em&gt;&lt;/a&gt;&lt;em&gt;. Pueden ver &lt;/em&gt;&lt;a href="http://altnet-hispano.pbworks.com/Historial-de-reuniones"&gt;&lt;em&gt;el historial de anteriores reuniones VAN&lt;/em&gt;&lt;/a&gt;&lt;em&gt; (visiten las que dieron, por ejemplo, sobre NHibernate, WPF y demás) (yo ya participé en &lt;/em&gt;&lt;a href="http://msmvps.com/blogs/lopez/archive/2009/09/18/resultado-de-la-van-en-alt-net-hispano-sobre-scrum.aspx"&gt;&lt;em&gt;VAN sobre Scrum&lt;/em&gt;&lt;/a&gt;&lt;em&gt; y en otra &lt;/em&gt;&lt;a href="http://msmvps.com/blogs/lopez/archive/2009/09/25/van-reuni-243-n-virtual-en-alt-net-hispano-sobre-generaci-243-n-de-c-243-digo.aspx"&gt;&lt;em&gt;sobre generación de código&lt;/em&gt;&lt;/a&gt;&lt;em&gt;, que quedará publicada en estos días). Supongo (pero confirmen) que la URL de entrada de la VAN de Martín será &lt;/em&gt;&lt;a href="http://snipr.com/virtualaltnet"&gt;&lt;em&gt;http://snipr.com/virtualaltnet&lt;/em&gt;&lt;/a&gt;&lt;em&gt;. Cualquier cosa, pueden consultar &lt;/em&gt;&lt;a href="http://groups.google.com/group/altnet-hispano/"&gt;&lt;em&gt;la lista de correo de ALT.NET Hispano&lt;/em&gt;&lt;/a&gt;&lt;em&gt;. También pueden suscribirse para proponer nuevos temas, y colaborar con la comunidad.&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;Visiten &lt;a href="http://boo.codehaus.org/" target="_blank"&gt;el sitio de Boo&lt;/a&gt; si quieren averiguar más sobre el lenguaje, y lean &lt;a href="http://www.google.com/url?q=http://boo.codehaus.org/BooManifesto.pdf&amp;amp;ei=n9rgSpPkKNOh8AbEqc2eDQ&amp;amp;sa=X&amp;amp;oi=nshc&amp;amp;resnum=1&amp;amp;ct=result&amp;amp;cd=1&amp;amp;ved=0CAsQzgQoAA&amp;amp;usg=AFQjCNFakzlVrlPRdxPt-ENYggy1Y8Af4g" target="_blank"&gt;el Boo Manifesto&lt;/a&gt;. Tomé la imagen del blog &lt;a title="http://blogs.codehaus.org/people/bamboo/archives/boo.html" href="http://blogs.codehaus.org/people/bamboo/archives/boo.html"&gt;http://blogs.codehaus.org/people/bamboo/archives/boo.html&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=1734501" 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/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/ALT.NET/default.aspx">ALT.NET</category></item><item><title>Alt.NET Hispano: VAN con Martín Salías y lenguajes en .NET</title><link>http://msmvps.com/blogs/lopez/archive/2009/10/01/alt-net-hispano-van-con-mart-237-n-sal-237-as-y-lenguajes-en-net.aspx</link><pubDate>Thu, 01 Oct 2009 09:32:57 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1728700</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=1728700</wfw:commentRss><comments>http://msmvps.com/blogs/lopez/archive/2009/10/01/alt-net-hispano-van-con-mart-237-n-sal-237-as-y-lenguajes-en-net.aspx#comments</comments><description>&lt;p&gt;&lt;img style="display:inline;margin:0px 20px 20px 0px;" src="http://www.ajlopez.com/images/articles/babel.jpg" align="left" alt="" /&gt; Este viernes, 2 de Octubre, la comunidad de Alt.NET Hispano preparar una VAN (desconferencia, reunión virtual), a las 5:00pm GMT (2 de la tarde acá en Buenos Aires), sobre lenguajes en .NET, con el bueno de &lt;a href="http://blog.salias.com.ar" target="_blank"&gt;Martín Salías&lt;/a&gt; (&lt;a href="http://twitter.com/MartinSalias" target="_blank"&gt;@MartinSalias&lt;/a&gt;). Pueden ver más detalle en:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://groups.google.com/group/altnet-hispano/browse_thread/thread/336c9f1ae2ed16f9?hl=es" target="_blank"&gt;Por primera vez tendremos VAN entre semana con Martín Salías&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Explica ahí Martín:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;mi idea es charlar un poco entre todos sobre el florecimiento de los lenguajes en entornos manejados. Me parece que no es coincidencia que en el ambiente Java esté pasando algo similar a lo que tenemos en .NET. &lt;/p&gt;    &lt;p&gt;Lenguajes Dinámicos:      &lt;br /&gt;JVM: Jython, JRuby, Groovy       &lt;br /&gt;.NET: IronPython, IronRuby &lt;/p&gt;    &lt;p&gt;Lenguajes funcionales:      &lt;br /&gt;JVM: Scala, Clojure       &lt;br /&gt;.NET: F#, C# (¡cada vez más!) &lt;/p&gt;    &lt;p&gt;Otros:      &lt;br /&gt;Ioke (JVM/.NET), Boo (.NET) &lt;/p&gt;    &lt;p&gt;…&lt;/p&gt;    &lt;p&gt;Me parece interesante repasar juntos los objetivos y desarrollo histórico del CLR, el DLR, y cómo impactó en esta nueva tanda de lenguajes la influencia del ambiente Open Source, que es tan cercano al espíritu Alt.NET. &lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;El bueno de Martín, menciona algunos proyectos míos de lenguajes… snif… me van a hacer llorar de la emoción… snif… :-)&lt;/p&gt;  &lt;p&gt;Si no conocen qué es una reunión VAN, pueden consultar &lt;a href="http://www.zachariahyoung.com/zy/post/2009/01/Introduction-to-Virtual-ALTNET.aspx"&gt;VAN meetings&lt;/a&gt;. Para ver cómo se desarrolla una VAN de ALT.NET Hispano, y qué software necesitan para asistir, ver &lt;a href="http://altnet-hispano.pbworks.com/Descripcion-de-Reuniones-VAN"&gt;Descripcion-de-Reuniones-VAN&lt;/a&gt;. Pueden ver &lt;a href="http://altnet-hispano.pbworks.com/Historial-de-reuniones"&gt;el historial de anteriores reuniones VAN&lt;/a&gt; (visiten las que dieron, por ejemplo, sobre NHibernate, WPF y demás) (yo ya participé en &lt;a href="http://msmvps.com/blogs/lopez/archive/2009/09/18/resultado-de-la-van-en-alt-net-hispano-sobre-scrum.aspx"&gt;VAN sobre Scrum&lt;/a&gt; y en otra &lt;a href="http://msmvps.com/blogs/lopez/archive/2009/09/25/van-reuni-243-n-virtual-en-alt-net-hispano-sobre-generaci-243-n-de-c-243-digo.aspx" target="_blank"&gt;sobre generación de código&lt;/a&gt;, que quedará publicada en estos días). Supongo (pero confirmen) que la URL de entrada de la VAN de Martín será &lt;a title="http://snipr.com/virtualaltnet" href="http://snipr.com/virtualaltnet"&gt;http://snipr.com/virtualaltnet&lt;/a&gt;. Cualquier cosa, pueden consultar &lt;a href="http://groups.google.com/group/altnet-hispano/" target="_blank"&gt;la lista de correo de ALT.NET Hispano&lt;/a&gt;. También pueden suscribirse para proponer nuevos temas, y colaborar con la comunidad.&lt;/p&gt;  &lt;p&gt;El año pasado con &lt;a href="http://weblogs.shockbyte.com.ar/" target="_blank"&gt;Rodolfo Finochietti&lt;/a&gt; (&lt;a href="http://twitter.com/rodolfof" target="_blank"&gt;@rodofof&lt;/a&gt;) y Martín, dimos un Technight en las oficinas de Microsoft Argentina (Buenos Aires), sobre &lt;a href="http://msmvps.com/blogs/lopez/archive/2008/10/16/babel-de-lenguajes-en-net.aspx" target="_blank"&gt;lenguajes de programación e implementaciones en .NET&lt;/a&gt;. (Lean el material de Rodolfo &lt;a href="http://weblogs.shockbyte.com.ar/rodolfof/archive/2009/08/30/juti-c4.aspx" target="_blank"&gt;sobre C# 4.0&lt;/a&gt;). Me pareció muy interesante esa charla, y me divertí mucho preparándola y compartiéndola con Martín y Rodolfo. Creo que deberíamos invitar a Rodolfo para que siga con una próxima VAN completando el tema que inicia Martín.&lt;/p&gt;  &lt;p&gt;Post relacionados:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blog.salias.com.ar/2008/09/javascript-la-programacin-del-futuro.html" target="_blank"&gt;Javascript, la programación del futuro&lt;/a&gt;    &lt;br /&gt;&lt;a href="http://msmvps.com/blogs/lopez/archive/2008/10/16/babel-de-lenguajes-en-net.aspx" target="_blank"&gt;Babel de lenguajes en .NET&lt;/a&gt;    &lt;br /&gt;&lt;a href="http://msmvps.com/blogs/lopez/archive/2008/09/17/papa-fritas-cervezas-y-una-babel-de-esos-raros-lenguajes-nuevos.aspx" target="_blank"&gt;Papas fritas, cervezas y una babel de esos raros lenguajes nuevos&lt;/a&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;(Me gustó tanto la pintura de la Torre de Babel, aludiendo a múltiples lenguajes, que usé en otro post, que la vuelvo a usar acá, con mi propio permiso… :-)&lt;/p&gt;  &lt;p&gt;Como es hábito, colecciono enlaces sobre estos temas en:&lt;/p&gt;  &lt;p&gt;Bueno, como siempre, los enlaces de estos temas, que colecciono, desde:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://delicious.com/ajlopez/dlr"&gt;http://delicious.com/ajlopez/dlr&lt;/a&gt;    &lt;br /&gt;&lt;a href="http://delicious.com/ajlopez/javascript"&gt;http://delicious.com/ajlopez/javascript&lt;/a&gt;    &lt;br /&gt;&lt;a href="http://delicious.com/ajlopez/programminglanguages"&gt;http://delicious.com/ajlopez/programminglanguages&lt;/a&gt;    &lt;br /&gt;&lt;a href="http://delicious.com/ajlopez/functionalprogramming"&gt;http://delicious.com/ajlopez/functionalprogramming&lt;/a&gt;    &lt;br /&gt;&lt;a href="http://delicious.com/ajlopez/ruby"&gt;http://delicious.com/ajlopez/ruby&lt;/a&gt;    &lt;br /&gt;&lt;a href="http://delicious.com/ajlopez/python"&gt;http://delicious.com/ajlopez/python&lt;/a&gt;    &lt;br /&gt;&lt;a href="http://delicious.com/ajlopez/scala"&gt;http://delicious.com/ajlopez/scala&lt;/a&gt;    &lt;br /&gt;&lt;a href="http://delicious.com/ajlopez/clojure"&gt;http://delicious.com/ajlopez/clojure&lt;/a&gt;    &lt;br /&gt;&lt;a href="http://delicious.com/ajlopez/f#"&gt;http://delicious.com/ajlopez/f#&lt;/a&gt;    &lt;br /&gt;&lt;a href="http://delicious.com/ajlopez/prolog"&gt;http://delicious.com/ajlopez/prolog&lt;/a&gt;    &lt;br /&gt;&lt;a href="http://delicious.com/ajlopez/lisp"&gt;http://delicious.com/ajlopez/lisp&lt;/a&gt;    &lt;br /&gt;&lt;a href="http://delicious.com/ajlopez/smalltalk"&gt;http://delicious.com/ajlopez/smalltalk&lt;/a&gt;    &lt;br /&gt;&lt;a href="http://delicious.com/ajlopez/logo"&gt;http://delicious.com/ajlopez/logo&lt;/a&gt;    &lt;br /&gt;&lt;a href="http://delicious.com/ajlopez/scripting"&gt;http://delicious.com/ajlopez/scripting&lt;/a&gt;    &lt;br /&gt;&lt;a href="http://delicious.com/ajlopez/dynamiclanguages"&gt;http://delicious.com/ajlopez/dynamiclanguages&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;   &lt;br /&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=1728700" 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/F_2300_/default.aspx">F#</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/ALT.NET/default.aspx">ALT.NET</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/Dynamic+Language+Runtime/default.aspx">Dynamic Language Runtime</category></item><item><title>Explorando objetos con Smalltalk</title><link>http://msmvps.com/blogs/lopez/archive/2009/09/24/explorando-objetos-con-smalltalk.aspx</link><pubDate>Thu, 24 Sep 2009 09:33:50 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1726240</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=1726240</wfw:commentRss><comments>http://msmvps.com/blogs/lopez/archive/2009/09/24/explorando-objetos-con-smalltalk.aspx#comments</comments><description>&lt;p&gt;Estoy siguiendo a &lt;a href="http://twitter.com/jarober" target="_blank"&gt;@jarober&lt;/a&gt; (James A. Robertson) en Twitter. El es el Cincom Smalltalk Product Evangelist. Postea enlaces, recursos y novedades sobre Smalltalk, en particular sobre los productos Cincom. Escribe un blog:&lt;/p&gt;  &lt;p&gt;&lt;a title="http://www.cincomsmalltalk.com/blog/View.ssp" href="http://www.cincomsmalltalk.com/blog/View.ssp"&gt;http://www.cincomsmalltalk.com/blog/View.ssp&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;que corre sobre Smalltalk. Si visitan ese blog, encontrarán varios posts con videas sobre Smalltalk. Hace poco, Robertson publicó:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.cincomsmalltalk.com/blog/blogView?entry=3430713089" target="_blank"&gt;Smalltalk Daily: Exploring Objects&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Este es el video:&lt;/p&gt;  &lt;p&gt;(Please visit the site to view this media)&lt;/p&gt;  &lt;p&gt;Robertson escribe:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;Many times, you want to do something, know that it can be done - but just aren&amp;#39;t sure how to construct the code to do it. If you have an object, you can usually solve that problem by drilling into it with the inspector and looking at it. Today we learn how to programmatically change workspace page text by drilling into a workspace.&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Es refrescante ver este tipo de interacción con objetos, tan “a la Smalltalk”.&lt;/p&gt;  &lt;p&gt;Debo reanudar mi trabajo en mi &lt;a href="http://ajlopez.wordpress.com/category/ajtalk/" target="_blank"&gt;Smalltalk VM (intérprete) AjTalk&lt;/a&gt;, pueden leer&lt;/p&gt;  &lt;p&gt;&lt;a href="http://msmvps.com/blogs/lopez/archive/2008/07/15/ajtalk-un-int-233-rprete-tipo-smalltalk.aspx" target="_blank"&gt;AjTalk, un intérprete tipo Smalltalk&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Le tendría que agregar soporte visual. Mi idea, como en otros intérpretes que estoy escribiendo, es interactuar con el framework de base, en este caso, .NET con su CLR. De esta forma, puedo sacar provecho de todo lo que está armado en ese framework. En estos días, todo lenguaje debería tomar ventaja de un framework de clases ya armado: .NET y Java son las opciones obvias a tomar (ver &lt;a href="http://clojure.org" target="_blank"&gt;Clojure&lt;/a&gt; como un ejemplo “moderno” de esta estrategia) (o &lt;a href="http://msmvps.com/blogs/lopez/archive/2009/09/22/ajsharp-un-lenguaje-din-225-mico-en-c.aspx" target="_blank"&gt;AjSharp&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=1726240" 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></item><item><title>AjSharp: un lenguaje dinámico en C#</title><link>http://msmvps.com/blogs/lopez/archive/2009/09/22/ajsharp-un-lenguaje-din-225-mico-en-c.aspx</link><pubDate>Tue, 22 Sep 2009 10:04:06 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1725706</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=1725706</wfw:commentRss><comments>http://msmvps.com/blogs/lopez/archive/2009/09/22/ajsharp-un-lenguaje-din-225-mico-en-c.aspx#comments</comments><description>&lt;p&gt;Durante el desarrollo de &lt;a href="http://ajgenesis.codeplex.com" target="_blank"&gt;AjGenesis&lt;/a&gt;, mi proyecto de generación de código, definí y usé un lenguaje interpretado, llamdado AjBasic, que me dió libertad para implementar tareas, plantillas y acceso a .NET, de una forma muy flexible. El año pasado comencé a separar la implementación de AjBasic del núcleo de AjGenesis, para poder irlo mejorando. Escribí el núcleo de un intérprete, AjInterpreter, y como prueba de concepto, construí sobre él a AjBasic, y a otro lenguaje &lt;a href="http://ajlopez.wordpress.com/category/ajsharp/" target="_blank"&gt;AjSharp&lt;/a&gt;, con una sintaxis más tipo C#. Más információn en:&lt;/p&gt;  &lt;p&gt;&lt;a title="AjSharp- a C Sharp-like interpreter, work in progress" href="http://ajlopez.wordpress.com/2008/09/25/ajsharp-a-c-sharp-like-interpreter-work-in-progress/"&gt;AjSharp- a C Sharp-like interpreter, work in progress&lt;/a&gt;    &lt;br /&gt;&lt;a href="http://msmvps.com/blogs/lopez/archive/2008/09/26/ajsharp-un-int-233-rprete-a-la-c-sharp-trabajo-en-progreso.aspx" target="_blank"&gt;AjSharp – un intérprete a la C# trabajo en progreso&lt;/a&gt;    &lt;br /&gt;&lt;/p&gt;  &lt;p&gt;Ahora, este año, lo reescribí en una implementación nueva, dentro de &lt;a href="http://code.google.com/p/ajcodekatas" target="_blank"&gt;mi AjCodeKatas Google Code&lt;/a&gt;. El núcleo del intérprete es ahora AjLanguage, y AjSharp es el lenguaje con un parser que se apoya en la “virtual machine” que da el AjLanguage, para armar y ejecutar un árbol de comandos y expresiones:&lt;/p&gt;  &lt;p&gt;&lt;img alt="" src="http://www.todocontenidos.com/images/articles/ajlanguage01.png" /&gt;&lt;/p&gt;  &lt;p&gt;Pueden ver el código en desarrollo y bajarlo desde:&lt;/p&gt;  &lt;p&gt;&lt;a title="http://code.google.com/p/ajcodekatas/source/browse/#svn/trunk/AjLanguage" href="http://code.google.com/p/ajcodekatas/source/browse/#svn/trunk/AjLanguage"&gt;http://code.google.com/p/ajcodekatas/source/browse/#svn/trunk/AjLanguage&lt;/a&gt;&lt;/p&gt;  &lt;h2&gt;Variables, expresiones y comandos&lt;/h2&gt;  &lt;p&gt;Las variables no son tipadas, y son automáticamente declaradas cuando son usadas:&lt;/p&gt;  &lt;div id="codeSnippetWrapper"&gt;   &lt;div id="codeSnippet" style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;     &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;a = 1;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;b = 2;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Estas variables contienen valores enteros, pero pueden asignarles valores de otros tipos en cualquier momento:&lt;/p&gt;

&lt;div id="codeSnippetWrapper"&gt;
  &lt;div id="codeSnippet" style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;
    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;a = “one”;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;b = “two”;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Los comandos habituales son soportados:&lt;/p&gt;

&lt;div id="codeSnippetWrapper"&gt;
  &lt;div id="codeSnippet" style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;
    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;&lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (k&amp;gt;0)&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;   &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt;;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;&amp;#160;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;&lt;span style="color:#0000ff;"&gt;for&lt;/span&gt; (k=1; k&amp;lt;=10; k++)&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;   sum = k+sum;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;&amp;#160;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;&lt;span style="color:#0000ff;"&gt;while&lt;/span&gt; (j&amp;lt;10)&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;   DoProcess(j);&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;&amp;#160;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;&lt;span style="color:#0000ff;"&gt;foreach&lt;/span&gt; (element &lt;span style="color:#0000ff;"&gt;in&lt;/span&gt; elements)&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;   AddElement(element);&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Las condiciones puede ser cualquier expresión, no solamente una que de resultado booleano. Ver más adelante, la explicación sobre el valor False.&lt;/p&gt;

&lt;div id="codeSnippetWrapper"&gt;
  &lt;div id="codeSnippetWrapper"&gt;
    &lt;h2&gt;Funciones y rutinas&lt;/h2&gt;

    &lt;p&gt;Esta es la sintaxies para escribir una función factorial. &lt;/p&gt;

    &lt;div id="codeSnippetWrapper"&gt;
      &lt;div id="codeSnippet" style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;
        &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;function Factorial(n)&lt;/pre&gt;


        &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;{&lt;/pre&gt;


        &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;    &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (n&amp;lt;=1)&lt;/pre&gt;


        &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;        &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; 1;&lt;/pre&gt;


        &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;&amp;#160;&lt;/pre&gt;


        &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;    &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; n * Factorial(n-1);&lt;/pre&gt;


        &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;}&lt;/pre&gt;
&lt;/div&gt;
    &lt;/div&gt;

    &lt;div id="codeSnippetWrapper"&gt;
      &lt;p&gt;La palabra sub puede ser usada para definir subrutinas.&lt;/p&gt;

      &lt;p&gt;Funciones y subrutinas son como cualquier otrosvalores. Puede ser definidos sin nombre y asignados a variables:&lt;/p&gt;

      &lt;div id="codeSnippetWrapper"&gt;
        &lt;div id="codeSnippet" style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;
          &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;Add1 = function (n) { &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; n+1; }&lt;/pre&gt;


          &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;two = Add1(1);&lt;/pre&gt;


          &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;function Apply(func,values)&lt;/pre&gt;


          &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;{&lt;/pre&gt;


          &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;    list = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; List();&lt;/pre&gt;


          &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;&amp;#160;&lt;/pre&gt;


          &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;    &lt;span style="color:#0000ff;"&gt;foreach&lt;/span&gt; (&lt;span style="color:#0000ff;"&gt;value&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;in&lt;/span&gt; values)&lt;/pre&gt;


          &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;        list.Add(func(&lt;span style="color:#0000ff;"&gt;value&lt;/span&gt;));&lt;/pre&gt;


          &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;&amp;#160;&lt;/pre&gt;


          &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;    &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; list;&lt;/pre&gt;


          &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;}&lt;/pre&gt;


          &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;&amp;#160;&lt;/pre&gt;


          &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;numbers = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; List();&lt;/pre&gt;


          &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;numbers.Add(1);&lt;/pre&gt;


          &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;numbers.Add(2);&lt;/pre&gt;


          &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;numbers.Add(3);&lt;/pre&gt;


          &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;&amp;#160;&lt;/pre&gt;


          &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;function Square(n) { &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; n*n; }&lt;/pre&gt;


          &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;&amp;#160;&lt;/pre&gt;


          &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;squared = Apply(Square, numbers);&lt;/pre&gt;


          &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;&amp;#160;&lt;/pre&gt;


          &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;squared2 = Apply(function (n) { &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; n*n; }, numbers);&lt;/pre&gt;
&lt;/div&gt;
      &lt;/div&gt;

      &lt;div id="codeSnippetWrapper"&gt;
        &lt;p&gt;&lt;/p&gt;

        &lt;h2&gt;Manejo de objetos .NET nativos&lt;/h2&gt;

        &lt;p&gt;Uno de los objetivos de diseño de AjLanguage es que pudiera acceder a objetos .NET. Pueden ser creados con la palabra new:&lt;/p&gt;

        &lt;div id="codeSnippetWrapper"&gt;
          &lt;div id="codeSnippet" style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;
            &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;ds = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; System.Data.DataSet();&lt;/pre&gt;


            &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;dinfo = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; System.IO.DirectoryInfo(“.”);&lt;/pre&gt;


            &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;&amp;#160;&lt;/pre&gt;


            &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;&lt;span style="color:#0000ff;"&gt;foreach&lt;/span&gt; (fi &lt;span style="color:#0000ff;"&gt;in&lt;/span&gt; dinfo.GetFiles()) {&lt;/pre&gt;


            &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;    PrintLine(fi.FullName);&lt;/pre&gt;


            &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;}&lt;/pre&gt;
&lt;/div&gt;
        &lt;/div&gt;

        &lt;div id="codeSnippetWrapper"&gt;
          &lt;p&gt;&lt;/p&gt;

          &lt;h2&gt;Objetos dynámicos&lt;/h2&gt;

          &lt;p&gt;Pueden ser creados usando la palabra new. Un objeto dinámico acepta nuevos miembros (variables y métodos):&lt;/p&gt;

          &lt;div id="codeSnippetWrapper"&gt;
            &lt;div id="codeSnippet" style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;
              &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;dynobj = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; DynamicObject();&lt;/pre&gt;


              &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;dynobj.FirstName = “Adam”;&lt;/pre&gt;


              &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;dynobj.LastName = &amp;quot;Genesis”;&lt;/pre&gt;


              &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;dynobj.Age = 800;&lt;/pre&gt;


              &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;dynobj.FullName = function() { &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; FirstName + “ “ + LastName; }&lt;/pre&gt;
&lt;/div&gt;
          &lt;/div&gt;

          &lt;p&gt;Otra notación:&lt;/p&gt;

          &lt;div id="codeSnippetWrapper"&gt;
            &lt;div id="codeSnippet" style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;
              &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;dynobj = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; { Name = “Adam”, Age = 800 };&lt;/pre&gt;
&lt;/div&gt;
          &lt;/div&gt;

          &lt;div id="codeSnippetWrapper"&gt;
            &lt;div id="codeSnippetWrapper"&gt;
              &lt;div id="codeSnippet" style="font-size:8pt;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;"&gt;&lt;/div&gt;

              &lt;p&gt;Otra notación:&lt;/p&gt;

              &lt;div id="codeSnippetWrapper"&gt;
                &lt;div id="codeSnippet" style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;
                  &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;dynobj = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; { var FirstName = “Adam”; var LastName = “Genesis”;&lt;/pre&gt;


                  &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt; function FullName() { &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; FirstName + “ “ + LastName; }&lt;/pre&gt;
&lt;/div&gt;
              &lt;/div&gt;

              &lt;div id="codeSnippetWrapper"&gt;
                &lt;div id="codeSnippet" style="font-size:8pt;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;"&gt;&lt;/div&gt;

                &lt;p&gt;Los objetos dinámicos se definen automáticamente, poniendo valores en sus propiedades:&lt;/p&gt;

                &lt;div id="codeSnippetWrapper"&gt;
                  &lt;div id="codeSnippet" style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;
                    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;Project.Database.Provider = “…”;&lt;/pre&gt;


                    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;Project.Database.ConnectionString = “…”;&lt;/pre&gt;
&lt;/div&gt;
                &lt;/div&gt;

                &lt;div id="codeSnippetWrapper"&gt;
                  &lt;p&gt;crea el objeto dinámico Project, con una propiedada Database que es a su vez otro objeto dinámico. Ese código equivale a:&lt;/p&gt;

                  &lt;div id="codeSnippetWrapper"&gt;
                    &lt;div id="codeSnippet" style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;
                      &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;Project = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; DynamicObject();&lt;/pre&gt;


                      &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;Project.Database = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; DynamicObject();&lt;/pre&gt;


                      &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;Project.Database.Provider = “…”;&lt;/pre&gt;


                      &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;Project.Database.ConnectionString = “…”;&lt;/pre&gt;
&lt;/div&gt;
                  &lt;/div&gt;

                  &lt;p&gt;Un experimento (veré si queda en la implementación final) las litas se definen automáticamente usando el método Add:&lt;/p&gt;

                  &lt;div id="codeSnippetWrapper"&gt;
                    &lt;div id="codeSnippet" style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;
                      &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;Project.Entities.Add(&lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; { Name = “Customer”, Table = “dbo.Customers” });&lt;/pre&gt;
&lt;/div&gt;
                  &lt;/div&gt;

                  &lt;div id="codeSnippetWrapper"&gt;
                    &lt;div id="codeSnippetWrapper"&gt;
                      &lt;p&gt;equivale a:&lt;/p&gt;

                      &lt;div id="codeSnippetWrapper"&gt;
                        &lt;div id="codeSnippet" style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;
                          &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;Project = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; DynamicObject();&lt;/pre&gt;


                          &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;Project.Entities = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; List();&lt;/pre&gt;


                          &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;Project.Entities.Add(&lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; { Name = “Customer”, Table = “dbo.Customers” });&lt;/pre&gt;
&lt;/div&gt;
                      &lt;/div&gt;

                      &lt;div id="codeSnippetWrapper"&gt;
                        &lt;h2&gt;Clases dinámicas&lt;/h2&gt;

                        &lt;p&gt;Una clase puede ser definida usando esta sintaxis:&lt;/p&gt;

                        &lt;div id="codeSnippetWrapper"&gt;
                          &lt;div id="codeSnippet" style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;
                            &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;&lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; Person {&lt;/pre&gt;


                            &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;    var FirstName;&lt;/pre&gt;


                            &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;    var LastName;&lt;/pre&gt;


                            &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;    var Age;&lt;/pre&gt;


                            &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;&amp;#160;&lt;/pre&gt;


                            &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;    function FullName() {&lt;/pre&gt;


                            &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;        &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; FirstName + “ “ +&lt;/pre&gt;


                            &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;            LastName;&lt;/pre&gt;


                            &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;    }&lt;/pre&gt;


                            &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;}&lt;/pre&gt;
&lt;/div&gt;
                        &lt;/div&gt;

                        &lt;div id="codeSnippetWrapper"&gt;
                          &lt;div id="codeSnippet" style="font-size:8pt;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;"&gt;&lt;/div&gt;

                          &lt;p&gt;Una nueva instancia puede ser creada como siempre:&lt;/p&gt;

                          &lt;div id="codeSnippetWrapper"&gt;
                            &lt;div id="codeSnippet" style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;
                              &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;adam = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; Person() { FirstName = “Adam”, LastName = “Genesis”, Age = 800 };&lt;/pre&gt;
&lt;/div&gt;
                          &lt;/div&gt;

                          &lt;div id="codeSnippetWrapper"&gt;
                            &lt;p&gt;La instancia, a su vez, es dinámica: nuevos miembros pueder serle adosados, y pueden agregar o redefinir métodos:&lt;/p&gt;

                            &lt;div id="codeSnippetWrapper"&gt;
                              &lt;div id="codeSnippet" style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;
                                &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;adam.FullName = function() { &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; “The “ + FirstName; };&lt;/pre&gt;
&lt;/div&gt;
                            &lt;/div&gt;

                            &lt;div id="codeSnippetWrapper"&gt;
                              &lt;p&gt;Pueden crear una clase como un valor:&lt;/p&gt;

                              &lt;div id="codeSnippetWrapper"&gt;
                                &lt;div id="codeSnippet" style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;
                                  &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;Person = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; DynamicClass();&lt;/pre&gt;
&lt;/div&gt;
                              &lt;/div&gt;

                              &lt;div id="codeSnippetWrapper"&gt;
                                &lt;p&gt;pero todavía tengo que definir bien la interfaz para agregar miembros de instancia.&lt;/p&gt;

                                &lt;p&gt;&amp;#160;&lt;/p&gt;

                                &lt;h2&gt;Clases ya definidas&lt;/h2&gt;

                                &lt;p&gt;Hay algunas clases predefinidas:&lt;/p&gt;

                                &lt;div id="codeSnippetWrapper"&gt;
                                  &lt;div id="codeSnippet" style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;
                                    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;dynobj = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; DynamicObject();&lt;/pre&gt;


                                    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;list = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; List(); &lt;span style="color:#008000;"&gt;// implementing IList&lt;/span&gt;&lt;/pre&gt;


                                    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;dict= &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; Dictionary(); // implementing IDictionary&lt;/pre&gt;
&lt;/div&gt;
                                &lt;/div&gt;

                                &lt;div id="codeSnippetWrapper"&gt;
                                  &lt;div id="codeSnippet" style="font-size:8pt;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;"&gt;&lt;/div&gt;

                                  &lt;h2&gt;Funciones primitivas&lt;/h2&gt;

                                  &lt;p&gt;Hay unas pocas funciones y subrutinas definidas:&lt;/p&gt;

                                  &lt;div id="codeSnippetWrapper"&gt;
                                    &lt;div id="codeSnippet" style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;
                                      &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;Print(“Hello”);&lt;/pre&gt;


                                      &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;PrintLine(“Hello World”);&lt;/pre&gt;
&lt;/div&gt;
                                  &lt;/div&gt;

                                  &lt;div id="codeSnippetWrapper"&gt;
                                    &lt;p&gt;Hay tres funciones predefenidas para ejecutar y evaluar código dinámicamente:&lt;/p&gt;

                                    &lt;div id="codeSnippetWrapper"&gt;
                                      &lt;div id="codeSnippet" style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;
                                        &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;Include(&lt;span style="color:#006080;"&gt;&amp;quot;program.ajs&amp;quot;&lt;/span&gt;);&lt;/pre&gt;


                                        &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;Evaluate(&lt;span style="color:#006080;"&gt;&amp;quot;k+1&amp;quot;&lt;/span&gt;);&lt;/pre&gt;


                                        &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;Execute(&lt;span style="color:#006080;"&gt;&amp;quot;k=1;&amp;quot;&lt;/span&gt;);&lt;/pre&gt;
&lt;/div&gt;
                                    &lt;/div&gt;

                                    &lt;div id="codeSnippetWrapper"&gt;
                                      &lt;div id="codeSnippetWrapper"&gt;Include ejecuta los comandos dentro de un archivo. Evalue analiza y evalúa una expresión. Execute compila y ejecuta comandos.&lt;/div&gt;

                                      &lt;h2&gt;El valor false&lt;/h2&gt;

                                      &lt;p&gt;Cualquier valor que sea false, null, 0 o el string vacío, será evaluado como falso dentro de una expresión condicional:&lt;/p&gt;

                                      &lt;div id="codeSnippetWrapper"&gt;
                                        &lt;div id="codeSnippet" style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;
                                          &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;&lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (k)&lt;/pre&gt;


                                          &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;    PrintLine(“&lt;span style="color:#0000ff;"&gt;true&lt;/span&gt;”);&lt;/pre&gt;


                                          &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;&lt;span style="color:#0000ff;"&gt;else&lt;/span&gt;&lt;/pre&gt;


                                          &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;    PrintLine(“&lt;span style="color:#0000ff;"&gt;false&lt;/span&gt;”);&lt;/pre&gt;
&lt;/div&gt;
                                      &lt;/div&gt;

                                      &lt;div id="codeSnippetWrapper"&gt;
                                        &lt;p&gt;El ejemplo de arriba imprime “false” en ejecución, si k es zero o indefinida. Si una variable es indefinida, cualquier acceso a sus miembros (que no sean métodos) retorna null, no una exception:&lt;/p&gt;

                                        &lt;div id="codeSnippetWrapper"&gt;
                                          &lt;div id="codeSnippet" style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;
                                            &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;&lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (Project.Database.ConnectionString)&lt;/pre&gt;


                                            &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;    PrintLine(“&lt;span style="color:#0000ff;"&gt;true&lt;/span&gt;”);&lt;/pre&gt;


                                            &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;&lt;span style="color:#0000ff;"&gt;else&lt;/span&gt;&lt;/pre&gt;


                                            &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;    PrintLine(“&lt;span style="color:#0000ff;"&gt;false&lt;/span&gt;”);&lt;/pre&gt;
&lt;/div&gt;
                                        &lt;/div&gt;

                                        &lt;div id="codeSnippetWrapper"&gt;
                                          &lt;p&gt;Este comando imprime de nuevo “false”, si la variable Project está indefinida.&lt;/p&gt;

                                          &lt;h2&gt;Arreglos, listas y diccionarios&lt;/h2&gt;

                                          &lt;p&gt;Vectores nativos puede ser definidos, usando una longitud:&lt;/p&gt;

                                          &lt;div id="codeSnippetWrapper"&gt;
                                            &lt;div id="codeSnippet" style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;
                                              &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;firstprimes = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;int&lt;/span&gt;[10];&lt;/pre&gt;
&lt;/div&gt;
                                          &lt;/div&gt;

                                          &lt;div id="codeSnippetWrapper"&gt;
                                            &lt;p&gt;o con valores:&lt;/p&gt;

                                            &lt;div id="codeSnippetWrapper"&gt;
                                              &lt;div id="codeSnippet" style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;
                                                &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;firstprimes = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;int&lt;/span&gt;[] { 1, 2, 3, 5, 7, 9 };&lt;/pre&gt;
&lt;/div&gt;
                                            &lt;/div&gt;

                                            &lt;div id="codeSnippetWrapper"&gt;
                                              &lt;p&gt;Una lista es creada dinámicamente si comenzamos a asignar valores con subíndices consecutivos, desde 0, a una variable no definida aún:&lt;/p&gt;

                                              &lt;div id="codeSnippetWrapper"&gt;
                                                &lt;div id="codeSnippet" style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;
                                                  &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;numbers[0] = “zero”;&lt;/pre&gt;


                                                  &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;numbers[1] = “one”;&lt;/pre&gt;


                                                  &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;numbers[2] = “two”;&lt;/pre&gt;


                                                  &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;numbers[3] = “three”;&lt;/pre&gt;
&lt;/div&gt;
                                              &lt;/div&gt;

                                              &lt;div id="codeSnippetWrapper"&gt;
                                                &lt;p&gt;Un diccionario es automáticamente creado si los subíndices no son numéricos:&lt;/p&gt;

                                                &lt;div id="codeSnippetWrapper"&gt;
                                                  &lt;div id="codeSnippet" style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;
                                                    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;numbers[“one”] = 1;&lt;/pre&gt;


                                                    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;numbers[“two”] = 2;&lt;/pre&gt;


                                                    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;numbers[“three”] = 3;&lt;/pre&gt;
&lt;/div&gt;
                                                &lt;/div&gt;

                                                &lt;div id="codeSnippetWrapper"&gt;
                                                  &lt;p&gt;Si necesitan más características, siempre pueden usar el framework .NET nativo.&lt;/p&gt;

                                                  &lt;h2&gt;Interfaz de consola&lt;/h2&gt;

                                                  &lt;p&gt;El proyecto AjSharp.Console es una aplicación de consola, donde pueden ingresar y ejecutar comandos AjSharp (no expresiones):&lt;/p&gt;

                                                  &lt;p&gt;&lt;img alt="" src="http://www.todocontenidos.com/images/articles/ajlanguage02.png" /&gt;&lt;/p&gt;

                                                  &lt;p&gt;No hay comando para salir, todavía. Simplemente, Control+C en Windows (no lo probé, pero todo el código debería ser recompilable en Mono).&lt;/p&gt;

                                                  &lt;h2&gt;Próximos pasos&lt;/h2&gt;

                                                  &lt;p&gt;Hay varias cosas que quisiera agregar. Una lista parcial:&lt;/p&gt;

                                                  &lt;p&gt;- Implementar AjBasic como otro lenguaje que use AjLanguage
                                                    &lt;br /&gt;- Soporte de Generics

                                                    &lt;br /&gt;- Soporte de plantillas/templates (como en AjGenesis)

                                                    &lt;br /&gt;- Integrar a la generación de código de &lt;a href="http://ajgenesis.codeplex.com" target="_blank"&gt;AjGenesis&lt;/a&gt;

                                                    &lt;br /&gt;- Compilar el AST a Dynamic Language Runtime (DLR)&lt;/p&gt;

                                                  &lt;p&gt;Nos leemos!&lt;/p&gt;

                                                  &lt;p&gt;Angel “Java” Lopez&lt;/p&gt;

                                                  &lt;p&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&gt;
                                              &lt;/div&gt;
                                            &lt;/div&gt;
                                          &lt;/div&gt;
                                        &lt;/div&gt;
                                      &lt;/div&gt;
                                    &lt;/div&gt;
                                  &lt;/div&gt;
                                &lt;/div&gt;
                              &lt;/div&gt;
                            &lt;/div&gt;
                          &lt;/div&gt;
                        &lt;/div&gt;
                      &lt;/div&gt;
                    &lt;/div&gt;
                  &lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;
          &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1725706" 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/AjGenesis/default.aspx">AjGenesis</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/AjSharp/default.aspx">AjSharp</category></item><item><title>Enlaces y noticias IV</title><link>http://msmvps.com/blogs/lopez/archive/2009/07/19/enlaces-y-noticias-iv.aspx</link><pubDate>Sun, 19 Jul 2009 13:51:36 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1703061</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=1703061</wfw:commentRss><comments>http://msmvps.com/blogs/lopez/archive/2009/07/19/enlaces-y-noticias-iv.aspx#comments</comments><description>&lt;p&gt;Sigo con la costumbre coleccionar enlaces, de distintos temas. Los que me llamaron la atención:&lt;/p&gt;  &lt;h3&gt;PHP&lt;/h3&gt;  &lt;p&gt;Es el lenguaje más usado para el desarrollo de sitios dinámicos en la web. Tiene la simplicidad necesaria, y también el soporte de clases, librerías, acceso a base de datos como para hacerlo más poderoso. Tal vez se ha quedado en el desarrollo web, perdiendo en el terreno de programas de consola, servicios, o de ventanas. Hay montañas de código de ejemplo para estudiar y aprender. Algunos enlaces:&lt;/p&gt;  &lt;p&gt;&lt;a title="PHP programming tips and tricks Code Purity" href="http://blog.code-purity.com/archives/2009/7/14/php_programming_tips_and_tricks/"&gt;PHP programming tips and tricks Code Purity&lt;/a&gt;    &lt;br /&gt;&lt;a title="Scripts Directory of PHP, ASP, ASP.NET, Java, Javascript, Perl and more! - Scripts" href="http://www.scripts.com/"&gt;Scripts Directory of PHP, ASP, ASP.NET, Java, Javascript, Perl and more! – Scripts&lt;/a&gt;    &lt;br /&gt;&lt;a title="43 Must Read PHP Articles and Resources Hi, I&amp;#39;m Grace Smith" href="http://www.gracesmith.co.uk/43-must-read-php-articles-and-resources/"&gt;43 Must Read PHP Articles and Resources Hi, I&amp;#39;m Grace Smith&lt;/a&gt;    &lt;br /&gt;&lt;a title="How To Create Your Own Stats Program (JavaScript, AJAX, PHP) Noupe" href="http://www.noupe.com/php/how-to-create-your-own-stats.html"&gt;How To Create Your Own Stats Program (JavaScript, AJAX, PHP) Noupe&lt;/a&gt;    &lt;br /&gt;&lt;a title="25 Resources to Get You Started with PHP from Scratch - Nettuts+" href="http://net.tutsplus.com/articles/web-roundups/25-resources-to-get-you-started-with-php-from-scratch/"&gt;25 Resources to Get You Started with PHP from Scratch - Nettuts+&lt;/a&gt;    &lt;br /&gt;&lt;a title="15 Wonderfully Creative Uses for PHP" href="http://net.tutsplus.com/tutorials/php/15-wonderfully-creative-uses-for-php/"&gt;15 Wonderfully Creative Uses for PHP&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Hay cantidad de sitios manejadores de contenidos (CMS) pueden ver&lt;/p&gt;  &lt;p&gt;&lt;a title="10 New PHP Content Management Systems(CMS)" href="http://www.dreamcss.com/2009/07/10-new-php-content-management.html"&gt;10 New PHP Content Management Systems(CMS)&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a title="http://php.opensourcecms.com/" href="http://php.opensourcecms.com/"&gt;http://php.opensourcecms.com/&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Para un rápido Altas, bajas y modicaciones ver &lt;a href="http://www.ajaxcrud.com/" target="_blank"&gt;AjaxCRUD.com - Use PHP &amp;amp; AJAX to CRUD from a mysql database (create / read / update / delete)&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;No creo que alguien pueda pasar fácilmente de PHP a ASP.NET pero pueden leer &lt;a title="Move from PHP to ASP.NET" href="http://msdn.microsoft.com/en-us/rampup/dd861537.aspx"&gt;Move from PHP to ASP.NET&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Tiene sus años, pero es interesante &lt;a title="Understanding MVC in PHP - O&amp;#39;Reilly Media" href="http://www.oreillynet.com/pub/a/php/2005/09/15/mvc_intro.html"&gt;Understanding MVC in PHP - O&amp;#39;Reilly Media&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Un armador de proyectos, a la Apache Ant, pero en PHP: &lt;a title="Phing" href="http://phing.info/trac/"&gt;Phing&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Comenzando con Joomla &lt;a title="Beginners - Joomla! Documentation" href="http://docs.joomla.org/Beginners"&gt;Beginners - Joomla! Documentation&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Veo implementando el &lt;a href="http://en.wikipedia.org/wiki/Template_Attribute_Language" target="_blank"&gt;Template Attribute Language&lt;/a&gt; en PHP: &lt;a title="http://phptal.org/" href="http://phptal.org/"&gt;http://phptal.org/&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;DEBEN VER &lt;a href="http://phpcamp.net/index.php" target="_blank"&gt;PHPCamp: learn something new everyday&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Para perderse en enlaces, &lt;a href="http://delicious.com/ajlopez/php"&gt;http://delicious.com/ajlopez/php&lt;/a&gt;&lt;/p&gt;  &lt;h3&gt;.NET&lt;/h3&gt;  &lt;p&gt;Para los que quieren ver manejadores de contenido (CMS) en ASP.NET:&lt;/p&gt;  &lt;p&gt;&lt;a title="http://aspx.opensourcecms.com/" href="http://aspx.opensourcecms.com/"&gt;http://aspx.opensourcecms.com/&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;El área de código abierto de .NET está bien activo: &lt;a title="Open Source .NET projects" href="http://spreadsheets.google.com/pub?key=pKxDW35algYebfs8nssTjIQ"&gt;Open Source .NET projects&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Para estudiar: &lt;a title="Expert to Expert- Brian Beckman and Erik Meijer - Inside the .NET Reactive Framework (Rx) Going" href="http://channel9.msdn.com/shows/Going+Deep/Expert-to-Expert-Brian-Beckman-and-Erik-Meijer-Inside-the-NET-Reactive-Framework-Rx/"&gt;Expert to Expert- Brian Beckman and Erik Meijer - Inside the .NET Reactive Framework (Rx) Going&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Un ejemplo de referencia &lt;a title="FabrikamShipping - Home" href="http://code.msdn.microsoft.com/FabrikamShipping"&gt;FabrikamShipping – Home&lt;/a&gt; con Geneva Framework, autenticación federada y tutti li fiocci.&lt;/p&gt;  &lt;p&gt;Un camino a explorar: reemplazar ORM (Object Relational Mapping) en runtime por generación de código: &lt;a title=".NET ORM, Object Relational Mapping for .NET Telerik" href="http://www.telerik.com/products/orm.aspx"&gt;.NET ORM, Object Relational Mapping for .NET Telerik&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Librería para Twitter &lt;a title="http://tweetsharp.com/" href="http://tweetsharp.com/"&gt;http://tweetsharp.com/&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;ASP.NET MVC 1.0 ejecutando en Mono &lt;a title="shaml-architecture - Google Code" href="http://code.google.com/p/shaml-architecture/"&gt;shaml-architecture - Google Code&lt;/a&gt; Basado en &lt;a title="s#arp-architecture" href="http://code.google.com/p/sharp-architecture/"&gt;s#arp-architecture&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Para mapear objetos &lt;a title="http://automapper.codeplex.com/" href="http://automapper.codeplex.com/"&gt;http://automapper.codeplex.com/&lt;/a&gt; (menos para el bueno de &lt;a href="http://weblogs.shockbyte.com.ar/rodolfof" target="_blank"&gt;Rodolfo Finochietti&lt;/a&gt; que prefiere hacerse su propio mapeador :-)&lt;/p&gt;  &lt;p&gt;Siempre es molesto el DataBinding a propiedades simples, habría que ver qué tal funciona &lt;a title="http://www.codeproject.com/KB/cs/ObjectBindingSource.aspx" href="http://www.codeproject.com/KB/cs/ObjectBindingSource.aspx"&gt;http://www.codeproject.com/KB/cs/ObjectBindingSource.aspx&lt;/a&gt; (nested property binding)&lt;/p&gt;  &lt;p&gt;Más de todo esto en &lt;a href="http://delicious.com/ajlopez/dotnet"&gt;http://delicious.com/ajlopez/dotnet&lt;/a&gt;&lt;/p&gt;  &lt;h3&gt;Generación de código&lt;/h3&gt;  &lt;p&gt;El proyecto Sculpture está muy bien armado, aunque focalizado en .NET &lt;a title="http://sculpture.codeplex.com/" href="http://sculpture.codeplex.com/"&gt;http://sculpture.codeplex.com/&lt;/a&gt; Es open source, se trasladó a la empresa:&lt;/p&gt;  &lt;p&gt;&lt;a title="http://www.dawliasoft.com/" href="http://www.dawliasoft.com/"&gt;http://www.dawliasoft.com/&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Tienen una implementación de referencia: &lt;a title="VotingManager.zip" href="http://www.dawliasoft.com/Portals/0/Learn/VotingManager.zip"&gt;VotingManager.zip&lt;/a&gt; que partiendo de 55 líneas, consiguen generar una aplicación de 4111 líneas. Bueno, nada que el &lt;a href="http://ajgenesis.codeplex.com" target="_blank"&gt;AjGenesis&lt;/a&gt; no pueda hacer… :-) … pero es más bonito.&lt;/p&gt;  &lt;p&gt;&lt;a title="Hibernate Class Generation Using hbm2java - O&amp;#39;Reilly Media" href="http://onjava.com/pub/a/onjava/2005/12/14/hibernate-class-generation-with-hbm2java.html?page=last"&gt;Hibernate Class Generation Using hbm2java - O&amp;#39;Reilly Media&lt;/a&gt; Estoy reviendo esto, quiero comenzar a usar el tag &amp;lt;meta&amp;gt; para usar hibernate.cfg.xml y archivos .hbm.xml para alimentar como modelo a &lt;a href="http://ajgenesis.codeplex.com" target="_blank"&gt;AjGenesis&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;Para estudiar dos “approachs” &lt;a title="Angle Bracket Percent - CodeDom vs T4- two approaches to Code Generation" href="http://blogs.msdn.com/davidebb/archive/2009/06/03/codedom-vs-t4-two-approaches-to-code-generation.aspx"&gt;Angle Bracket Percent - CodeDom vs T4- two approaches to Code Generation&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Veo el editor de T4 &lt;a title="T4 Editor - tangible T4 Editor plus UML tools" href="http://t4-editor.tangible-engineering.com/T4-Editor-Visual-T4-Editing.html"&gt;T4 Editor - tangible T4 Editor plus UML tools&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Desde AjGenesis puedo leer el archivo .dbml de Linq2Sql, que se puede generar desde la línea de comando con SqlMetal, tengo que estudiar &lt;a title="Oleg Sych - » T4 Toolbox- LINQ to SQL classes generator" href="http://www.olegsych.com/2009/01/t4-toolbox-linq-to-sql-classes-generator/"&gt;Oleg Sych - » T4 Toolbox- LINQ to SQL classes generator&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Yo tenía esta idea, pero la deseché por ser algo “convoluted”, pero es interesante: &lt;a title="Using ASP.Net for Code Generation" href="http://www.delphicsage.com/home/blog.aspx?d=600&amp;amp;title=Using_ASPNet_for_Code_Generation"&gt;Using ASP.Net for Code Generation&lt;/a&gt; . En su tiempo, usé también PHP como lenguaje de generación, pero me gustó tener un lenguaje dedicado a generación con objetos dinámicos (AjBasic) con acceso a un framework de base (.NET por ahora), cosa que no tiene PHP en principio. Y en cuanto a usar ASP.NET, me obligaba a usar un lenguaje tipado .NET, que me resistía a hacerlo.&lt;/p&gt;  &lt;p&gt;Siguiendo con T4, el lenguaje de templates de Visual Studio, a estudiar &lt;a title="Angle Bracket Percent - The MVC T4 template is now up on CodePlex, and it does change your code" href="http://blogs.msdn.com/davidebb/archive/2009/06/26/the-mvc-t4-template-is-now-up-on-codeplex-and-it-does-change-your-code-a-bit.aspx"&gt;Angle Bracket Percent - The MVC T4 template is now up on CodePlex, and it does change your code&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Parece interesante &lt;a title="Sample Fluent NHibernate T4 Templates for Code Generation via LINQ To SQL" href="http://www.pnpguidance.net/Post/SampleFluentNHibernateT4TemplatesCodeGenerationLINQToSQL.aspx"&gt;Sample Fluent NHibernate T4 Templates for Code Generation via LINQ To SQL&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.metacase.com/blogs/stevek/blogView" target="_blank"&gt;Steven Kelly&lt;/a&gt; siempre tiene algo interesante sobre DSM (Domain Specific Models) y generación de código. Comenta sobre &lt;a href="http://www.codegeneration.net/cg2009/" target="_blank"&gt;Code Generation 2009&lt;/a&gt; en &lt;a title="Code Generation 2009 round-up" href="http://www.metacase.com/blogs/stevek/blogView?showComments=true&amp;amp;entry=3423259520"&gt;Code Generation 2009 round-up&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Para los que estén con el framework .NET de Lohtka, CSLA, pueden visitar el&lt;/p&gt;  &lt;p&gt;&lt;a title="CslaGenerator Google Groups" href="http://groups.google.com/group/CslaGenerator"&gt;CslaGenerator Google Groups&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Ruby es un lenguaje que se presta a la generación de código, ver esto, de hace algunos años, pero a cargo del bueno Jack Herrington, autor de Code Generation in Action (alguien que vió la luz!!! :-) :&lt;/p&gt;  &lt;p&gt;   &lt;div class="wlWriterEditableSmartContent" id="scid:5737277B-5D6D-4f48-ABFC-DD9C333F4C5D:e1c89a3c-3fa7-4139-a58a-282866a26e43" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt; &lt;/p&gt;  &lt;p&gt;Como siempre, más información en &lt;a href="http://delicious.com/ajlopez/codegeneration"&gt;http://delicious.com/ajlopez/codegeneration&lt;/a&gt;&lt;/p&gt;  &lt;h3&gt;Lenguajes de Programación&lt;/h3&gt;  &lt;p&gt;Descubriendo un clásico: &lt;a title="Let&amp;#39;s Build a Compiler" href="http://compilers.iecc.com/crenshaw/"&gt;Let&amp;#39;s Build a Compiler&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Un texto corto &lt;a href="http://forums.devshed.com/other-programming-languages-139/how-does-an-interpreter-compiler-work-312483.html" target="_blank"&gt;How does a an interpreter compiler work&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Para estudiar &lt;a title="Create a Language Compiler for the .NET Framework Using C#" href="http://msdn.microsoft.com/en-us/magazine/cc136756.aspx"&gt;Create a Language Compiler for the .NET Framework Using C#&lt;/a&gt; usa Reflection.Emit, bien a lo macho… :-)&lt;/p&gt;  &lt;p&gt;Hay que escribir intérpretes y compiladores, “compiler generators are for sissies” :-), pero si quieren, pueden ver &lt;a href="http://www.ssw.uni-linz.ac.at/coco/" target="_blank"&gt;The Compiler Generator Coco/R&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Más para ver &lt;a title="Free Compiler Construction Tools- Lexers, Parser Generators, Optimizers (thefreecountry.com)" href="http://www.thefreecountry.com/programming/compilerconstruction.shtml"&gt;Free Compiler Construction Tools- Lexers, Parser Generators, Optimizers (thefreecountry.com)&lt;/a&gt; y &lt;a title="Basics of Compiler Design (pdf)" href="http://www.diku.dk/hjemmesider/ansatte/torbenm/Basics/basics_lulu.pdf"&gt;Basics of Compiler Design (pdf)&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Para estudiar:&lt;/p&gt;  &lt;p&gt;&lt;a title="Michael Feathers on Programming Languages" href="http://www.infoq.com/interviews/michael-feathers-programming-languages"&gt;Michael Feathers on Programming Languages&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a title="Synrc Io Language CLR" href="http://synrc.com/io-language.htm"&gt;Synrc Io Language CLR&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a title="Io (programming language) - Wikipedia, the free encyclopedia" href="http://en.wikipedia.org/wiki/Io_(programming_language)"&gt;Io (programming language) - Wikipedia, the free encyclopedia&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a title="InfoQ- The Ioke JVM Language- The power of Lisp and Ruby with an intuitive syntax" href="http://www.infoq.com/news/2008/11/ioke"&gt;InfoQ- The Ioke JVM Language- The power of Lisp and Ruby with an intuitive syntax&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a title="Ending the Era of Patronizing Language Design" href="http://blog.objectmentor.com/articles/2009/07/13/ending-the-era-of-patronizing-language-design"&gt;Ending the Era of Patronizing Language Design&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Un volver a vivir:&lt;/p&gt;  &lt;p&gt;&lt;a title="History of the BASIC family of languages" href="http://dotnetmasters.com/HistoryOfBasic.htm"&gt;History of the BASIC family of languages&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Otro para el canal “Volver”, entorno de desarrollo xBase:&lt;/p&gt;  &lt;p&gt;&lt;a title="Xailer - El entorno de desarrollo definitivo en xbase" href="http://www.xailer.com/"&gt;Xailer - El entorno de desarrollo definitivo en xbase&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a title="Free Pascal compilers and Pascal Programming - Freebyte&amp;#39;s Guide to" href="http://www.freebyte.com/programming/pascal/"&gt;Free Pascal compilers and Pascal Programming - Freebyte&amp;#39;s Guide to&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Se acuerdan de MUMPS? &lt;a title="MUMPS - Wikipedia, the free encyclopedia" href="http://en.wikipedia.org/wiki/MUMPS"&gt;MUMPS - Wikipedia, the free encyclopedia&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Para leer &lt;a title="APL, COBOL, &amp;amp; Dijkstra Paul Murphy ZDNet.com" href="http://blogs.zdnet.com/Murphy/?p=568"&gt;APL, COBOL, &amp;amp; Dijkstra Paul Murphy ZDNet.com&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Podría volver a estudiar: &lt;a title="COBOL Programming Course" href="http://www.csis.ul.ie/cobol/Course/Default.htm"&gt;COBOL Programming Course&lt;/a&gt;, &lt;a title="The COBOL Programming Language" href="http://www.engin.umd.umich.edu/CIS/course.des/cis400/cobol/cobol.html"&gt;The COBOL Programming Language&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Lista para buscar recursos &lt;a title="Free Programming Tools, free compilers, free software components and" href="http://www.freebyte.com/programming/"&gt;Free Programming Tools, free compilers, free software components and&lt;/a&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Excelente contenido &lt;a title="Google Code University Programming Languages" href="http://code.google.com/intl/it-IT/edu/languages/index.html"&gt;Google Code University Programming Languages&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Hay que ir viendo:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://clojure.org/" target="_blank"&gt;Clojure&lt;/a&gt; ver &lt;a title="InfoQ- Rich Hickey on Clojure&amp;#39;s Features and Implementation" href="http://www.infoq.com/interviews/hickey-clojure"&gt;InfoQ- Rich Hickey on Clojure&amp;#39;s Features and Implementation&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.scala-lang.org/" target="_blank"&gt;Scala&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Yo sigo trabajando en reimplementar las ideas de Clojure en C#, lo llamaba AjClojure, pero Rick Hickey (el creador de Clojure) me pidió que le cambiara el nombre (al fin tengo evidencia de que alguien lee &lt;a href="http://twitter.com/ajlopez" target="_blank"&gt;mi Twitter&lt;/a&gt;!!! :-) Así, que en un rapto de imaginación, se llama AjSharpure. Pueden ir viendo mis avances en:&lt;/p&gt;  &lt;p&gt;&lt;a title="http://code.google.com/p/ajlisp/source/browse#svn/trunk/AjSharpure" href="http://code.google.com/p/ajlisp/source/browse#svn/trunk/AjSharpure"&gt;http://code.google.com/p/ajlisp/source/browse#svn/trunk/AjSharpure&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Más para ver sobre los lenguajes que me interesan en:   &lt;br /&gt;&lt;a href="http://delicious.com/ajlopez/programminglanguages"&gt;http://delicious.com/ajlopez/programminglanguages&lt;/a&gt;    &lt;br /&gt;&lt;a href="http://delicious.com/ajlopez/smalltalk"&gt;http://delicious.com/ajlopez/smalltalk&lt;/a&gt;    &lt;br /&gt;&lt;a href="http://delicious.com/ajlopez/logo"&gt;http://delicious.com/ajlopez/logo&lt;/a&gt;    &lt;br /&gt;&lt;a href="http://delicious.com/ajlopez/scala"&gt;http://delicious.com/ajlopez/scala&lt;/a&gt;    &lt;br /&gt;&lt;a href="http://delicious.com/ajlopez/lisp"&gt;http://delicious.com/ajlopez/lisp&lt;/a&gt;    &lt;br /&gt;&lt;a href="http://delicious.com/ajlopez/forth"&gt;http://delicious.com/ajlopez/forth&lt;/a&gt;    &lt;br /&gt;&lt;a href="http://delicious.com/ajlopez/haskell"&gt;http://delicious.com/ajlopez/haskell&lt;/a&gt;    &lt;br /&gt;&lt;a href="http://delicious.com/ajlopez/python"&gt;http://delicious.com/ajlopez/python&lt;/a&gt;    &lt;br /&gt;&lt;a href="http://delicious.com/ajlopez/ruby"&gt;http://delicious.com/ajlopez/ruby&lt;/a&gt;    &lt;br /&gt;&lt;a href="http://delicious.com/ajlopez/functionalprogramming"&gt;http://delicious.com/ajlopez/functionalprogramming&lt;/a&gt;    &lt;br /&gt;&lt;a href="http://delicious.com/ajlopez/cobol"&gt;http://delicious.com/ajlopez/cobol&lt;/a&gt;    &lt;br /&gt;&lt;/p&gt;  &lt;h3&gt;MVPs&lt;/h3&gt;  &lt;p&gt;El bueno de &lt;a href="http://weblogs.shockbyte.com.ar/rodolfof" target="_blank"&gt;Rodolfo Finochietti&lt;/a&gt; fue nombrado Microsoft MVP por segundo año consecutivo. Felicitaciones @rodolfof! &lt;a href="http://weblogs.shockbyte.com.ar/rodolfof/archive/2009/07/01/mvp-for-another-year.aspx" target="_blank"&gt;MVP for another year&lt;/a&gt;. También felicitaciones para el pibe Woloski, que renovó el nombramiento.&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=1703061" 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/PHP/default.aspx">PHP</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/Generaci_26002300_243_3B00_n+de+C_26002300_243_3B00_digo/default.aspx">Generaci&amp;#243;n de C&amp;#243;digo</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/AjGenesis/default.aspx">AjGenesis</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/Enlaces+y+Noticias/default.aspx">Enlaces y Noticias</category></item><item><title>El mejor lenguaje, la mejor herramienta</title><link>http://msmvps.com/blogs/lopez/archive/2009/07/09/el-mejor-lenguaje-la-mejor-herramienta.aspx</link><pubDate>Thu, 09 Jul 2009 15:17:36 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1699015</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=1699015</wfw:commentRss><comments>http://msmvps.com/blogs/lopez/archive/2009/07/09/el-mejor-lenguaje-la-mejor-herramienta.aspx#comments</comments><description>&lt;p&gt;Ayer escribía sobre la popularidad de los lenguajes de programación:&lt;/p&gt;  &lt;p&gt;&lt;a title="Popularidad de Lenguajes de Programación" href="http://msmvps.com/blogs/lopez/archive/2009/07/08/popularidad-de-lenguajes-de-programaci-243-n.aspx"&gt;Popularidad de Lenguajes de Programación&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Justo ayer, también, &lt;a href="http://www.todocontenidos.com/images/articles/language01.png" target="_blank"&gt;@ebersys&lt;/a&gt; escribía en Twitter:&lt;/p&gt;  &lt;p&gt;&lt;img src="http://www.todocontenidos.com/images/articles/language01.png" alt="" /&gt; &lt;/p&gt;  &lt;p&gt;El bueno de Eber Irigoyen es miembro activo de Alt.NET hispano:&lt;/p&gt;  &lt;p&gt;&lt;img src="http://www.todocontenidos.com/images/articles/language02.png" alt="" /&gt; &lt;/p&gt;  &lt;p&gt;Vive en Salt Lake city, Utah, visiten su blog:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://ebersysesp.blogspot.com/" target="_blank"&gt;Que quieres desarrollar hoy?&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;Yo disiento con eso de “el mejor lenguaje es el que conoces mejor”. Mi contestación en Twitter fue:&lt;/p&gt;  &lt;p&gt;&lt;img src="http://www.todocontenidos.com/images/articles/language03.png" alt="" /&gt; &lt;/p&gt;  &lt;p&gt;Pero de donde puede venir eso de “el mejor lenguaje es el que conoces mejor”? Bueno, como comentaba ayer, hay grupos de lenguajes, y mucho de nosotros, estamos trabajando con .NET o Java o ambos. Son lenguajes de uso general, donde podemos hacer aplicaciones de consola, gráficas, o web. En los dos casos, más que lenguaje, tenemos un framework de clases, y entornos de desarrollo, desde Eclipse hasta Visual Studio. Creo que uno puede pensar que “el lenguaje que conoce es el mejor”, si está en uno de esos dos grupos: programando en Java o en .NET. Son más que lenguajes: son interminables clases y capacidades y plugins y wizards, que nos ayudan a hacer multitud de aplicaciones.&lt;/p&gt;  &lt;p&gt;Pero sigo pensando que, si limitamos la pregunta a lenguajes, el mejor lenguaje es el que mejor se adecua a lo que tengo entre manos. Claro que con .NET o con Java, vamos a poder hacer más tipos diferentes de aplicaciones. Pero siempre es importante, si podemos elegir, considerar que hay lenguajes de todo tipo, con énfasis en distintos aspectos de la programación. Por ejemplo, en mi caso, en mi proyecto de generación de código AjGenesis, he elegido desde el principio, adoptar un lenguaje dinámico, no tipado, porque me parece lo más adecuado, flexible, adaptable, a lo que quería hacer (leer &lt;a title="Generación de Código, AjGenesis y AjBasic" href="http://msmvps.com/blogs/lopez/archive/2009/06/15/generaci-243-n-de-c-243-digo-ajgenesis-y-ajbasic.aspx"&gt;Generación de Código, AjGenesis y AjBasic&lt;/a&gt;). Y estoy muy contento con la elección.&lt;/p&gt;  &lt;p&gt;Por otro lado, si vamos a hacer aplicaciones de empresa, nos baste .NET o Java, y en ese caso, elegiremos, si podemos, “el que conocemos mejor”.&lt;/p&gt;  &lt;p&gt;Pero insisto: si vamos a .NET o Java, no vamos a “un lenguaje”, vamos a una tecnología, un framework de clases, y alguna IDE, vamos más allá de elegir un lenguaje. En este caso, destacaría la experiencia de desarrollo que nos dé la IDE que elijamos. En estos casos, tengo que comentar que tanto Eclipse como Visual Studio, son una gran ayuda a la hora del desarrollo. En mi opinión, Eclipse es demasiado “todo es un plugin”, cosa que en Visual Studio todo viene más armado y coordinado desde el principio. (Hace un tiempo que no veo NetBeans: cuando lo veía, me parecía que era mucha “bajada de línea” de Sun, donde se soportaba sólo lo que a Sun le importaba. Si le importaba JSF, desaparecía del mapa JSP y así.)&lt;/p&gt;  &lt;p&gt;Entonces, uno podría pensar que la mejor herramienta es la IDE, el framework, la tecnología. Pero acá debo alzar la mano, y recordar una escena de Rambo II. Rambo sale de la cárcel, y vuelve a la selva, a rescatar a su antiguo jefe y entrenador, que ha sido capturado por el enemigo. En un campamento amigo, un agente especial le muestra un galpón, lleno de armas: orgulloso, le presenta a Rambo una tras otra arma, una más sofisticada y poderosa que la otra. Rambo no parece impresionarse, y pronuncia la frase, lapidaria: “La mejor arma es una mente despierta”.&lt;/p&gt;  &lt;p&gt;Lo mismo digo: parafraseando a Rambo, “la mejor herramienta es una mente despierta”. No hay IDE, lenguaje, tecnología, plataforma, framework, que sustituya lo que tenemos entre las orejas. Si como desarrolladores no pensamos, no meditamos en lo que hacemos, por qué lo hacemos, qué necesitamos lograr, y solamente programamos de tal forma, porque está de moda, o está en los libros, o usamos tal framework, sin entenderlo cabalmente, sin ver cuál es el problema que resuelve, y lo vemos como una panacea o “silver bullit”, si en vez de pensar, digo, nos embarcamos ciegamente en el desarrollo, no hay IDE que nos ayude. Lo que Salamanca non da, natura non presta. Lo que no pensemos, no lo va a solucionar la IDE, ni el lenguaje.&lt;/p&gt;  &lt;p&gt;Si uno piensa, puede llegar a ser productivo hasta en Assembler… :-)&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=1699015" 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/Java/default.aspx">Java</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></item><item><title>Popularidad de Lenguajes de Programación</title><link>http://msmvps.com/blogs/lopez/archive/2009/07/08/popularidad-de-lenguajes-de-programaci-243-n.aspx</link><pubDate>Wed, 08 Jul 2009 09:50:06 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1698705</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=1698705</wfw:commentRss><comments>http://msmvps.com/blogs/lopez/archive/2009/07/08/popularidad-de-lenguajes-de-programaci-243-n.aspx#comments</comments><description>&lt;p&gt;Me temo que &lt;a href="http://en.wordpress.com/tag/ajlisp/" target="_blank"&gt;AjLisp&lt;/a&gt; y &lt;a href="http://en.wordpress.com/tag/ajbasic" target="_blank"&gt;AjBasic&lt;/a&gt; lo usamos yo y nadie más… snif… :-). Pero hay lenguajes más populares que esos. Ya es clásica la lista de TIOBE Software:&lt;/p&gt;  &lt;p&gt;&lt;a title="http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html" href="http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html"&gt;http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;img src="http://www.todocontenidos.com/images/articles/langpop01.png" alt="" /&gt; &lt;/p&gt;  &lt;p&gt;donde aparece Java como el lenguaje más popular, lo que no me asombra. Pero sí me llama la atención la popularidad de C y C++, que deben tener su gran uso en el ambiente Unix, Linux, y otros. Como cuarto, encuentro hoy, Julio de 2009, a PHP, que lo entiendo: la mayor parte del código de sitios dinámicos está en PHP, lejos quedaron los años del predominio del venerable Perl. Y recién en sexto y séptimo lugar, está Visual Basic (parece que agrupan el de .NET y el clásico), y C#. Vean que al final de la lista, aparecen lenguajes con mínimos porcentajes, pero aparecen: RPG, Pascal, Abap, Lisp/Scheme. Más abajo, en la misma página encontraran la lista de posición 21 a 50, donde aparecen COBOL, Objective-C, Fortran, Logo, Prolog, Ada (todavía anda por ahí? :-), Scala, Erlang…. y esta es la lista de 51 a 100:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;ABC, AD, Algol, Alpha, Applescript, Beta, Boo, C shell, cg, Clean, Cobra, cT, Curl, Dylan, Eiffel, Euphoria, Factor, Fan, Icon, IDL, Inform, Io, Lingo, MAD, Magic, Maple, Mathematica, MAX/MSP, MOO, MUMPS, Natural, Oberon, Occam, Oz, PL/I, Postscript, PowerBuilder, Progress, Q, R, Revolution, REXX, S-lang, SIGNAL, SPSS, SuperCollider, VBScript, Verilog, VHDL, XSLT&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Notable lista, recomendaría tantos lenguajes de esa lista, simplemente para aprender nuevas formas de programar (notable que aparezca todavía MUMPS, REXX, tendría que ver con más detalle a Io). Esta lista de popularidad se basa en el examen de búsquedas en Google, hace un tiempo pasaron a agregar MSN y Yahoo.&lt;/p&gt;  &lt;p&gt;Pero en estos días, encontré otra página:&lt;/p&gt;  &lt;p&gt;&lt;a title="http://langpop.com/" href="http://langpop.com/"&gt;http://langpop.com/&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;img src="http://www.todocontenidos.com/images/articles/langpop02.png" alt="" /&gt; &lt;/p&gt;  &lt;p&gt;con información de ranking de popularidad, pero con agrupadas con distintas fuentes, como Yahoo Search, search en Google Code, Freshmeat, Craiglist, Amazon.&lt;/p&gt;  &lt;p&gt;En lo que veo hoy ahí, julio de 2009, según Yahoo Search C es más popular que Java. Pero para Craiglist, primero PHP, segundo SQL (!!!), en Amazon ganan C, C++ y C#, por encima de Java. Y así, noto dispersión de los resultados, dependiendo de la fuente.&lt;/p&gt;  &lt;p&gt;La popularidad de un lenguaje importa. No tanto para entender el lenguaje (muchos lenguajes “boutique” tienen interesantes conceptos, a estudiar con detalle), sino para tener una idea de qué tecnología ha sido adoptada por la comunidad, pero habría que ver más allá: por qué la eligieron, y en qué tipo de proyectos. Dudo que haya muchas aplicaciones desktop, en PHP.&lt;/p&gt;  &lt;p&gt;Resumen: gran cantidad de lenguajes, hay lenguajes viejos, desde COBOL y Smalltalk, y más “nuevos” como Boo, Ruby, Python. Y `cuatros grandes grupos: Java, C/C++, lenguajes .NET (VB.NET, C#), PHP, como claros grupos líderes.&lt;/p&gt;  &lt;p&gt;Pienso que, como desarrolladores de software, debemos tener contacto con esos cuatro grupos, y además, con alguno de los “otros”, para aprender otras ideas y formas de programar.&lt;/p&gt;  &lt;p&gt;No&amp;#160; me enojo si intentan ver &lt;a href="http://en.wordpress.com/tag/ajlisp" target="_blank"&gt;AjLisp&lt;/a&gt; o &lt;a href="http://en.wordpress.com/tag/ajbasic" target="_blank"&gt;AjBasic&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=1698705" 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/Java/default.aspx">Java</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/PHP/default.aspx">PHP</category><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/C+Sharp/default.aspx">C Sharp</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/AjLisp/default.aspx">AjLisp</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/AjBasic/default.aspx">AjBasic</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></item><item><title>Aguante el Logo</title><link>http://msmvps.com/blogs/lopez/archive/2009/06/23/aguante-el-logo.aspx</link><pubDate>Tue, 23 Jun 2009 14:15:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1696383</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=1696383</wfw:commentRss><comments>http://msmvps.com/blogs/lopez/archive/2009/06/23/aguante-el-logo.aspx#comments</comments><description>&lt;p&gt;Sandra, de la provincia de Tucum&amp;aacute;n, Argentina, produjo este video, usando el lenguaje Logo, parece que con el &lt;a target="_blank" href="http://fmslogo.sourceforge.net/"&gt;FMSLogo&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;(Please visit the site to view this media)&lt;/p&gt;
&lt;p&gt;Durante el video, visita el sitio del bueno de Daniel Ajoy:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://neoparaiso.com/" title="http://neoparaiso.com/"&gt;http://neoparaiso.com/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Donde tenemos informaci&amp;oacute;n sobre el lenguaje y trabajos relacionados de Logo:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://neoparaiso.com/logo/" title="http://neoparaiso.com/logo/"&gt;http://neoparaiso.com/logo/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Ya escrib&amp;iacute; sobre Logo, mostrando el trabajo del bueno de Marcelo Dushkin sobre ese lenguaje, en la variante XLogo, con rob&amp;oacute;tica:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://msmvps.com/blogs/lopez/archive/2008/01/01/mi-primer-robot-con-xlogo-y-rasti.aspx" title="Mi primer robot, con XLogo y Rasti"&gt;Mi primer robot, con XLogo y Rasti&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://msmvps.com/blogs/lopez/archive/2007/07/04/mi-primer-robot.aspx" title="Mi primer robot"&gt;Mi primer robot&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;No tengo m&amp;aacute;s informaci&amp;oacute;n sobre Sandra. Pueden visitar su usuario en Youtube&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.youtube.com/user/educainformatica" title="http://www.youtube.com/user/educainformatica"&gt;http://www.youtube.com/user/educainformatica&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;El foro que menciona en el video, al que estoy suscripto, es:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://groups.google.com/group/logoes" title="http://groups.google.com/group/logoes"&gt;http://groups.google.com/group/logoes&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;M&amp;aacute;s informaci&amp;oacute;n sobre versiones de Logo en:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://neoparaiso.com/logo/#sect3" title="http://neoparaiso.com/logo/#sect3"&gt;http://neoparaiso.com/logo/#sect3&lt;/a&gt; &lt;br /&gt;&lt;a href="http://neoparaiso.com/logo/logoes-mswlogo.html" title="http://neoparaiso.com/logo/logoes-mswlogo.html"&gt;http://neoparaiso.com/logo/logoes-mswlogo.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Mis enlaces sobre este lenguaje, desde:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://delicious.com/ajlopez/logo"&gt;http://delicious.com/ajlopez/logo&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Para los que les gusta m&amp;aacute;s la programaci&amp;oacute;n, recomendar&amp;iacute;a darle un visita al NetLogo:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://ccl.sesp.northwestern.edu/netlogo/" title="http://ccl.sesp.northwestern.edu/netlogo/"&gt;http://ccl.sesp.northwestern.edu/netlogo/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;NetLogo is a cross-platform multi-agent programmable modeling environment.&lt;/p&gt;
&lt;p&gt;Si, imaginaron bien, hay un pich&amp;oacute;n de AjLogo en:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://code.google.com/p/ajlogo/" title="http://code.google.com/p/ajlogo/"&gt;http://code.google.com/p/ajlogo/&lt;/a&gt;&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=1696383" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/lopez/archive/tags/Logo/default.aspx">Logo</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></item><item><title>PyCon 2009 Argentina</title><link>http://msmvps.com/blogs/lopez/archive/2009/06/05/pycon-2009-argentina.aspx</link><pubDate>Fri, 05 Jun 2009 09:57:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1694123</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=1694123</wfw:commentRss><comments>http://msmvps.com/blogs/lopez/archive/2009/06/05/pycon-2009-argentina.aspx#comments</comments><description>&lt;p&gt;La gente de PyCon Argentina http://ar.pycon.org/ est&amp;aacute; organizando la Primera Conferencia Argentina de Python, a realizarse en Buenos Aires, el 4 y 5 de Setiembre de 2009.&lt;/p&gt;
&lt;p&gt;&lt;a target="_blank" href="http://ar.pycon.org"&gt;&lt;img border="0" src="http://ar.pycon.org/common/2009/website/img/banners/PyConAR-2009-banner-grande.png" style="border-right:0px;border-top:0px;border-left:0px;border-bottom:0px;" alt="" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;Pueden encontrar m&amp;aacute;s informaci&amp;oacute;n en&lt;/p&gt;
&lt;p&gt;&lt;a href="http://ar.pycon.org/2009/about/" title="http://ar.pycon.org/2009/about/"&gt;http://ar.pycon.org/2009/about/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Hay &lt;a href="http://ar.pycon.org/2009/conference/keynotes/" title="Charlas Plenarias"&gt;Charlas Plenarias&lt;/a&gt;, &lt;a href="http://ar.pycon.org/2009/conference/talks/" title="Charlas Programadas"&gt;Charlas Programadas&lt;/a&gt;, &lt;a href="http://ar.pycon.org/2009/conference/lightning/" title="Charlas Rel&amp;aacute;mpago"&gt;Charlas Rel&amp;aacute;mpago&lt;/a&gt; (hay que ir preparado para hablar!) Todav&amp;iacute;a faltan definir varios puntos, creo que no est&amp;aacute; decidido el lugar de la reuni&amp;oacute;n.&lt;/p&gt;
&lt;p&gt;Pero ya hay un &amp;ldquo;Call for Papers&amp;rdquo;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://ar.pycon.org/2009/charlas/" title="http://ar.pycon.org/2009/charlas/"&gt;http://ar.pycon.org/2009/charlas/&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;PyCon Argentina - http://ar.pycon.org/&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Primera Conferencia Argentina de Python&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Buenos Aires - 4 y 5 de Septiembre de 2009&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://ar.pycon.org/2009/pyar"&gt;PyAr&lt;/a&gt;, el grupo de usuarios de Python de Argentina llama a la participaci&amp;oacute;n de la comunidad de usuarios de Python y Software Libre a la Primera Conferencia Argentina de Python.&lt;/p&gt;
&lt;p&gt;En este evento nos juntaremos desarrolladores avanzados y principiantes de Python para intercambiar informaci&amp;oacute;n, compartir experiencias, analizar nuevas tecnolog&amp;iacute;as, y en general aprender m&amp;aacute;s de este lenguaje a trav&amp;eacute;s de la comunidad de Python Argentina.&lt;/p&gt;
&lt;p&gt;El autor de cada charla seleccionada podr&amp;aacute; participar presencialmente, como orador en el evento. En los casos en que la charla sea realizada por varios autores, se permitir&amp;aacute; un m&amp;aacute;ximo de 3 oradores.&lt;/p&gt;
&lt;p&gt;Aclaraci&amp;oacute;n: Por cuestiones presupuestarias, s&amp;oacute;lo podr&amp;aacute; abonar algunos de los pasajes, total o parcialmente, a los autores seleccionados que residan fuera de Capital Federal o Gran Buenos Aires.&lt;/p&gt;
&lt;p&gt;Agradecemos la contribuci&amp;oacute;n de todos en la difusi&amp;oacute;n de este llamado y del evento en si mediante los banners dise&amp;ntilde;ados para tal fin y que se encuentran la secci&amp;oacute;n &lt;a href="http://ar.pycon.org/2009/helping/publicize/"&gt;Ayudanos - Difundir&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;D&amp;oacute;nde enviar las Charlas&lt;/h3&gt;
&lt;p&gt;Las charlas deben ser enviadas para su aprobaci&amp;oacute;n a trav&amp;eacute;s de este sitio, en &lt;a href="http://ar.pycon.org/2009/conference/proposals/submit/"&gt;Conferencia - Propuestas - Enviar&lt;/a&gt; La fecha l&amp;iacute;mite de env&amp;iacute;o de charlas es el 29 de Junio inclusive. En caso de consultas o inconvenientes, contactarse con &lt;a href="mailto:charlas%40ar.pycon.org"&gt;charlas@ar.pycon.org&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;C&amp;oacute;mo enviar las Charlas&lt;/h3&gt;
&lt;p&gt;El env&amp;iacute;o de la propuesta de charla debe tener los siguientes datos:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;T&amp;iacute;tulo: &lt;/li&gt;
&lt;li&gt;Autor(es): Nombre y apellido, breve descripci&amp;oacute;n de cada uno, foto, asociaci&amp;oacute;n, grupo de usuarios, organismo, o empresa a la que pertenece, si corresponde. &lt;/li&gt;
&lt;li&gt;Tiempo estimado de duraci&amp;oacute;n: Las charlas generalmente son de 45&amp;#39;. En caso de que sea mayor o menor el tiempo requerido solicitamos su justificaci&amp;oacute;n. &lt;/li&gt;
&lt;li&gt;Breve descripci&amp;oacute;n de la charla: Uno o dos p&amp;aacute;rrafo(s) que explique -no tan brevemente- el contenido de la presentaci&amp;oacute;n. &lt;/li&gt;
&lt;li&gt;Nivel objetivo de la charla: Clasificar dentro de: introductorio/intermedio/avanzado/experto &lt;/li&gt;
&lt;li&gt;Tipo de publico: Desarrolladores avanzados, desarrolladores principiantes, empresarios, docentes, p&amp;uacute;blico en general &lt;/li&gt;
&lt;li&gt;Conocimientos previos: Especificar que conocimientos previos deber&amp;aacute;n tener los asistentes. &lt;/li&gt;
&lt;li&gt;Tags: web, gui, databases, frameworks, orm, ide, ciencia, educaci&amp;oacute;n, juegos, comunidad, etc. &lt;/li&gt;
&lt;li&gt;Tel&amp;eacute;fono del/los autor/es: Para poder comunicarnos. &lt;/li&gt;
&lt;li&gt;Ciudad de residencia del/los autor/es. &lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Qu&amp;eacute; formato deben tener las Presentaciones&lt;/h3&gt;
&lt;p&gt;El env&amp;iacute;o de las diapositivas y/o presentaciones debe tener alguno de los siguientes formatos:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Openoffice.org presentation &lt;/li&gt;
&lt;li&gt;HTML standard &lt;/li&gt;
&lt;li&gt;Postscript &lt;/li&gt;
&lt;li&gt;PDF &lt;/li&gt;
&lt;li&gt;Texto plano &lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Licencia&lt;/h3&gt;
&lt;p&gt;Debe especificarse una licencia que permita que &lt;a href="http://ar.pycon.org/2009/pyar"&gt;PyAr&lt;/a&gt; distribuya el material en un CD-Live o de Documentaci&amp;oacute;n y que permita ser descargado del sitio web de &lt;a href="http://ar.pycon.org/2009/pyar"&gt;PyAr&lt;/a&gt;. Se recomienda Creative Commons o similares.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Es interesante que la comunidad de desarrolladores de Python vaya organizando este tipo de eventos. Espero que sea un &amp;eacute;xito.&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=1694123" 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></item><item><title>Presentando AjCat</title><link>http://msmvps.com/blogs/lopez/archive/2009/04/29/presenting_2D00_ajcat.aspx</link><pubDate>Wed, 29 Apr 2009 10:24:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1691539</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=1691539</wfw:commentRss><comments>http://msmvps.com/blogs/lopez/archive/2009/04/29/presenting_2D00_ajcat.aspx#comments</comments><description>&lt;p&gt;Hace algo m&amp;aacute;s de un mes, estuve trabajando en un int&amp;eacute;rprete del lenguaje Cat:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.cat-language.com/" title="The Cat Programming Language"&gt;The Cat Programming Language&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Cat is a functional stack-based programming language inspired by the &lt;/em&gt;&lt;a href="http://www.latrobe.edu.au/philosophy/phimvt/"&gt;&lt;em&gt;Joy programming language&lt;/em&gt;&lt;/a&gt;&lt;em&gt;. The primary differences is that Cat provides a static type system with type inferencing (like ML or Haskell), and a term rewriting macro language extension language called &lt;/em&gt;&lt;a href="https://ajlopez.wordpress.com/wp-admin/metacat.html"&gt;&lt;em&gt;MetaCat&lt;/em&gt;&lt;/a&gt;&lt;em&gt;. &lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Cat is a high-level intermediate language translation that can also be used as a stand alone language for simple application development. In this way it occupies a similar niche to PostScript. Cat is also an appropriate language for teaching of basic programming concepts. &lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="http://todocontenidos.com/images/articles/ajcat01.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;Si no conocen el lenguaje Cat, recomiendar&amp;iacute;a leer:&lt;/p&gt;
&lt;p&gt;&lt;a target="_blank" href="http://www.cat-language.com/tutorial.html"&gt;Cat Tutorial&lt;/a&gt; &lt;br /&gt;&lt;a target="_blank" href="http://www.cat-language.com/manual.html"&gt;Cat Specification&lt;/a&gt; &lt;br /&gt;&lt;a target="_blank" href="http://www.cat-language.com/primitives.html"&gt;Cat Primitives&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Publiqu&amp;eacute; el c&amp;oacute;digo como parte de mi proyecto Code Katas en Google Code. El nombre que us&amp;eacute; es AjCat:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://code.google.com/p/ajcodekatas/source/browse/#svn/trunk/AjCat" title="http://code.google.com/p/ajcodekatas/source/browse/#svn/trunk/AjCat"&gt;http://code.google.com/p/ajcodekatas/source/browse/#svn/trunk/AjCat&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;La soluci&amp;oacute;n tiene tres proyectos:&lt;/p&gt;
&lt;p&gt;&lt;img src="http://todocontenidos.com/images/articles/ajcat02.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;La actual implementaci&amp;oacute;n no es completa. Solo soporta enteros, todav&amp;iacute;a no soporta objetos .NET, y no hay primitivas de gr&amp;aacute;ficos. Pero est&amp;aacute; implementado gran parte de las primitivas y funciones definidas en Cat.&lt;/p&gt;
&lt;p&gt;Corriendo el programa de consola, pueden ingresar y evaluar expresiones:&lt;/p&gt;
&lt;p&gt;&lt;img src="http://todocontenidos.com/images/articles/ajcat05.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;Este c&amp;oacute;digo est&amp;aacute; dedicado a &lt;a href="http://weblogs.shockbyte.com.ar/"&gt;Rodolfo Finocchieti&lt;/a&gt; (&lt;a href="http://twitter.com/rodolfof"&gt;@rodolfof&lt;/a&gt; en Twitter) quien me dej&amp;oacute; un comentario ac&amp;aacute; en este blog, coment&amp;aacute;ndome de este lenguaje Cat, una idea fascinante.&lt;/p&gt;
&lt;p&gt;Los tests est&amp;aacute;n en verdes:&lt;/p&gt;
&lt;p&gt;&lt;img src="http://todocontenidos.com/images/articles/ajcat03.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;Y hay un buen code coverage&lt;/p&gt;
&lt;p&gt;&lt;img src="http://todocontenidos.com/images/articles/ajcat04.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;Como siempre, me divert&amp;iacute; escribiendo este c&amp;oacute;digo.&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;p&gt;Enjoying &lt;a href="http://ajlopez.zoomblog.com/archivo/2009/04/08/eric-Clapton-Everyday-I-Have-the-Blues.html" title="Eric Clapton Everyday I Have the Blues Live"&gt;Eric Clapton Everyday I Have the Blues Live&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1691539" 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/Desarrollo+de+Software/default.aspx">Desarrollo de Software</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/Programaci_26002300_243_3B00_n+Funcional/default.aspx">Programaci&amp;#243;n Funcional</category></item><item><title>TDD and Code Kata: Writing a Lexer for AjRuby</title><link>http://msmvps.com/blogs/lopez/archive/2009/03/12/tdd_2D00_and_2D00_code_2D00_kata_2D00_writing_2D00_a_2D00_lexer_2D00_for_2D00_ajruby.aspx</link><pubDate>Thu, 12 Mar 2009 05:11:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1677718</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=1677718</wfw:commentRss><comments>http://msmvps.com/blogs/lopez/archive/2009/03/12/tdd_2D00_and_2D00_code_2D00_kata_2D00_writing_2D00_a_2D00_lexer_2D00_for_2D00_ajruby.aspx#comments</comments><description>&lt;p&gt;Muchas veces, escribo programas tipo code kata, para entrenarme en algún tema de desarrollo de software. En estos últimos meses, escribí varios mini intérpretes, usando TDD, code coverage, y C#. La semana pasada, estuve trabajando en el lanzamiento de otro pet project, AjRuby. El punto de inicio: el analizador léxico, el lexer.&lt;/p&gt;  &lt;p&gt;Un lexer es un programa que analiza el código fuente de un programa, y retorna sus tokens, las “palabras” que componen el programa. En el caso de AjRuby, escribí un lexer que sigue la gramática de Ruby. No está completo aún, pero funciona.&lt;/p&gt;  &lt;p&gt;Pueden ver el progreso del proyecto, en el repositorio de Google Code:&lt;/p&gt;  &lt;p&gt;&lt;a title="http://code.google.com/p/ajcodekatas/source/browse#svn/trunk/AjRuby" href="http://code.google.com/p/ajcodekatas/source/browse#svn/trunk/AjRuby"&gt;http://code.google.com/p/ajcodekatas/source/browse#svn/trunk/AjRuby&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;La solución tiene un proyecto de librería de clases, y otro de tests:&lt;/p&gt;  &lt;p&gt;&lt;img src="http://www.todocontenidos.com/images/articles/ajruby02.png" alt="" /&gt; &lt;/p&gt;  &lt;p&gt;Hay una clase Token, que representa cada token:&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:3556dfda-95db-4216-8c88-ba67a9266e51" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;   &lt;pre style="background-color:white;"&gt;&lt;div&gt;&lt;span style="color:#000000;"&gt;    &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;class&lt;/span&gt;&lt;span style="color:#000000;"&gt; Token
    {
        &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;&lt;span style="color:#000000;"&gt; Value { &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;get&lt;/span&gt;&lt;span style="color:#000000;"&gt;; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;set&lt;/span&gt;&lt;span style="color:#000000;"&gt;; }

        &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; TokenType TokenType { &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;get&lt;/span&gt;&lt;span style="color:#000000;"&gt;; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;set&lt;/span&gt;&lt;span style="color:#000000;"&gt;; }
    }
&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;El TokenType es una enumeración:&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:b030a353-46ec-4f15-be42-fe729deaca08" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;
  &lt;pre style="background-color:white;"&gt;&lt;div&gt;&lt;span style="color:#000000;"&gt;    &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;enum&lt;/span&gt;&lt;span style="color:#000000;"&gt; TokenType
    {
        Name,
        Integer,
        Real,
        Boolean,
        String,
        Operator,
        Separator
    }
&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Hay una clase LexerTest.cs, conteniendo tests como:&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:3acb3099-f7eb-417e-b132-9927cd84a1f9" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;
  &lt;pre style="background-color:white;"&gt;&lt;div&gt;&lt;span style="color:#000000;"&gt;        [TestMethod]
        &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;void&lt;/span&gt;&lt;span style="color:#000000;"&gt; ShouldProcessName()
        {
            Lexer lexer &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;new&lt;/span&gt;&lt;span style="color:#000000;"&gt; Lexer(&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;name&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;);

            Token token;

            token &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; lexer.NextToken();

            Assert.IsNotNull(token);
            Assert.AreEqual(TokenType.Name, token.TokenType);
            Assert.AreEqual(&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;name&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;, token.Value);

            token &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; lexer.NextToken();

            Assert.IsNull(token);
        }
&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Hay un test para cada tipo de token a ser procesado. Otro ejemplo:&lt;/p&gt;

&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:9b11e40f-18a3-4bce-9d93-6d349df8b74d" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;
  &lt;pre style="background-color:white;"&gt;&lt;div&gt;&lt;span style="color:#000000;"&gt;        [TestMethod]
        &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;void&lt;/span&gt;&lt;span style="color:#000000;"&gt; ShouldProcessNameWithInitialUnderscore()
        {
            Lexer lexer &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;new&lt;/span&gt;&lt;span style="color:#000000;"&gt; Lexer(&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;_name&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;);

            Token token;

            token &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; lexer.NextToken();

            Assert.IsNotNull(token);
            Assert.AreEqual(TokenType.Name, token.TokenType);
            Assert.AreEqual(&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;_name&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;, token.Value);

            token &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; lexer.NextToken();

            Assert.IsNull(token);
        }
&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;Escribí los tests usando ideas TDD: escribir el test, compilar con error, arreglar los problemas de compilación, ejecutar los tests en rojo, arreglarlos, conseguir el verde para los tests. No estuve haciendo tanto refactoring. El código merece algún refactor, pero por ahora, estoy tratando de conseguir un lexer que trabaje. Los tests quedaron en verde:&lt;/p&gt;

&lt;p&gt;&lt;img src="http://www.todocontenidos.com/images/articles/ajruby01.png" alt="" /&gt; &lt;/p&gt;

&lt;p&gt;Mi objetivo es tener más del 80% de code coverage, en cualquier momento del desarrollo del proyecto:&lt;/p&gt;

&lt;p&gt;&lt;img src="http://www.todocontenidos.com/images/articles/ajruby03.png" alt="" /&gt; &lt;/p&gt;

&lt;p&gt;Es bueno escribir algo sólo por diversión y aprendizaje. Para mí, es parte de la mejora continua que todo desarrollador de software debe perseguir.&lt;/p&gt;

&lt;p&gt;Nos leemos!&lt;/p&gt;

&lt;p&gt;Angel &amp;quot;Java&amp;quot; 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=1677718" 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/Desarrollo+de+Software/default.aspx">Desarrollo de Software</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/C_26002300_243_3B00_digo+Abierto/default.aspx">C&amp;#243;digo Abierto</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></item><item><title>Presentando AjLambda: implementación de Cálculo Lambda en C#</title><link>http://msmvps.com/blogs/lopez/archive/2009/02/26/presentando-ajlambda-implementaci-243-n-de-c-225-lculo-lambda-en-c.aspx</link><pubDate>Thu, 26 Feb 2009 08:19:43 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1674015</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=1674015</wfw:commentRss><comments>http://msmvps.com/blogs/lopez/archive/2009/02/26/presentando-ajlambda-implementaci-243-n-de-c-225-lculo-lambda-en-c.aspx#comments</comments><description>&lt;p&gt;Estuve trabajando en my&amp;nbsp;&amp;quot;code kata&amp;quot; AjLambda, una implementación de Cálculo Lambda escrita en C#:&lt;/p&gt; &lt;p&gt;&lt;a title="http://code.google.com/p/ajcodekatas/source/browse/#svn/trunk/AjLambda" href="http://code.google.com/p/ajcodekatas/source/browse/#svn/trunk/AjLambda"&gt;http://code.google.com/p/ajcodekatas/source/browse/#svn/trunk/AjLambda&lt;/a&gt;&lt;/p&gt; &lt;p&gt;(Si no conoce el cálculo lambda, hay enlaces sobre el tema al final de este post)&lt;/p&gt; &lt;p&gt;La solución es simple, contiene tres proyectos:&lt;/p&gt; &lt;p&gt;&lt;img src="http://www.todocontenidos.com/images/articles/ajlambdasln.png" alt="" /&gt; &lt;/p&gt; &lt;p&gt;Es una librería núcleo, &lt;strong&gt;AjLambda&lt;/strong&gt;, un proyecto de test &lt;strong&gt;AjLambda.Tests&lt;/strong&gt; y un programa de consola &lt;strong&gt;AjLambda.Console&lt;/strong&gt; para ejecutar. El núcleo tiene unas pocas clases principales:&lt;/p&gt; &lt;p&gt;&lt;img src="http://www.todocontenidos.com/images/articles/ajlambdacd.png" alt="" /&gt; &lt;/p&gt; &lt;p&gt;&lt;strong&gt;Expression&lt;/strong&gt; es la clase base abstracta. &lt;strong&gt;.Reduce&lt;/strong&gt;&amp;nbsp;es el método que implementa la reducción de una expresión. &lt;strong&gt;.Replaces &lt;/strong&gt;se usa para cambiar una variable por otra. Algunas veces, es necesario elegir un nuevo nombre para una variable, que no colisione con otros nombres de variables libres. &lt;strong&gt;.FreeVariables &lt;/strong&gt;es el método para obtener la lista de variables libres en una expresión. Por ejemplo, en la expresión lambda:&lt;/p&gt; &lt;p&gt;&lt;font face="Consolas"&gt;\x.xy&lt;/font&gt;&lt;/p&gt; &lt;p&gt;x e y son variables, pero y es una variable libre, mientras que x es un parámetro ligado.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Variable&lt;/strong&gt; expresa una variable (una letra minúscula, en esta implementación). &lt;strong&gt;Lambda&lt;/strong&gt; es la lambda (parámetro más cuerpo). La lambda identidad se ingresa:&lt;/p&gt; &lt;p&gt;&lt;font face="Consolas"&gt;\x.x&lt;/font&gt;&lt;/p&gt; &lt;p&gt;La versión con múltiples parámetros está soportada:&lt;/p&gt; &lt;p&gt;&lt;font face="Consolas"&gt;\xy.yx&lt;/font&gt;&lt;/p&gt; &lt;p&gt;Como ejemplo, ésta es la implementación de &lt;strong&gt;.Reduce&lt;/strong&gt;&amp;nbsp;para Pair (un pare de expresiones, left and right):&amp;nbsp;&lt;/p&gt; &lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:057a7d15-908a-47c9-b27b-610b940ebae4" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;&lt;pre style="background-color:White;white-space:-moz-pre-wrap;white-space:-pre-wrap;white-space:-o-pre-wrap;white-space:pre-wrap;word-wrap:break-word;"&gt;&lt;div&gt;&lt;span style="color:#000000;"&gt;
        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;override&lt;/span&gt;&lt;span style="color:#000000;"&gt; Expression Reduce()
        {
            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;if&lt;/span&gt;&lt;span style="color:#000000;"&gt; (&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;&lt;span style="color:#000000;"&gt;.left &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;is&lt;/span&gt;&lt;span style="color:#000000;"&gt; Lambda)
                &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;return&lt;/span&gt;&lt;span style="color:#000000;"&gt; ((Lambda)&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;&lt;span style="color:#000000;"&gt;.left).Apply(&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;&lt;span style="color:#000000;"&gt;.right);

            Expression newLeft &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;&lt;span style="color:#000000;"&gt;.left.Reduce();

            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;if&lt;/span&gt;&lt;span style="color:#000000;"&gt; (newLeft &lt;/span&gt;&lt;span style="color:#000000;"&gt;!=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;&lt;span style="color:#000000;"&gt;.left)
                &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;return&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;new&lt;/span&gt;&lt;span style="color:#000000;"&gt; Pair(newLeft, &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;&lt;span style="color:#000000;"&gt;.right);

            Expression newRight &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;&lt;span style="color:#000000;"&gt;.right.Reduce();

            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;if&lt;/span&gt;&lt;span style="color:#000000;"&gt; (newRight &lt;/span&gt;&lt;span style="color:#000000;"&gt;==&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;&lt;span style="color:#000000;"&gt;.right)
                &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;return&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;&lt;span style="color:#000000;"&gt;;

            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;return&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;new&lt;/span&gt;&lt;span style="color:#000000;"&gt; Pair(newLeft, newRight);
        }

&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Ejecutando &lt;strong&gt;AjLamnda.Console&lt;/strong&gt; con un parámetro:&lt;/p&gt;
&lt;p&gt;&lt;font face="Consolas"&gt;AjLambda.Console Boot.l&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;lee y procesa el archivo auxiliar Boot.l, donde definí algunas funciones predefinidas:&lt;/p&gt;
&lt;p&gt;&lt;font face="Consolas"&gt;; True&lt;br /&gt;T = \xy.x&lt;br /&gt;; False&lt;br /&gt;F = \xy.y&lt;br /&gt;; And&lt;br /&gt;AND = \ab.abF&lt;br /&gt;; If Then Else&lt;br /&gt;IFTHENELSE = \x.x&lt;br /&gt;; Natural numbers&lt;br /&gt;0 = \fx.x&lt;br /&gt;1 = \fx.fx&lt;br /&gt;2 = \fx.f(fx)&lt;br /&gt;3 = \fx.f(f(fx))&lt;br /&gt;; Succesor&lt;br /&gt;SUCC = \nfx.f(nfx)&lt;br /&gt;; Add&lt;br /&gt;ADD = \nmfx.nf(mfx)&lt;br /&gt;; Multiply&lt;br /&gt;MULT = \nmf.n(mf)&lt;br /&gt;; Is Zero&lt;br /&gt;ISZERO = \nxy.n(\z.y)x&lt;br /&gt;; Predecessor&lt;br /&gt;PRED = \nfx.n(\gh.h(gf))(\u.x)(\u.u)&lt;br /&gt;; Pair Functions&lt;br /&gt;PAIR = \xyf.fxy&lt;br /&gt;FIRST = \p.pT&lt;br /&gt;SECOND = \p.pF&lt;br /&gt;NIL = \x.T&lt;br /&gt;NULL = \p.p(\xy.F)&lt;br /&gt;; Fixed Point&lt;br /&gt;A = \xy.y(xxy)&lt;br /&gt;Y = A A&lt;br /&gt;; Factorial&lt;br /&gt;FACT = Y (\f.\n.IFTHENELSE (ISZERO n) (1) (MULT n (f (PRED n)))))&lt;/font&gt; 
&lt;p&gt;Podemos preguntar por los nombre predefinidos. Están definidos los primeros números naturales, incluyendo el cero:&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.todocontenidos.com/images/articles/ajlambdacon01.png" alt="" /&gt; &lt;/p&gt;
&lt;p&gt;Los nombres son palabras que comienzan con una letra mayúscula (o números). Los nombres de variables son letras minúsculas (desde &amp;#39;a&amp;#39; a &amp;#39;z&amp;#39;, una sola letra).&lt;/p&gt;
&lt;p&gt;Como es usual, definí SUCC and PRED (funciones sucesor y predecesor):&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.todocontenidos.com/images/articles/ajlambdacon02.png" alt="" /&gt; &lt;/p&gt;
&lt;p&gt;Cada paso de reducción se imprime, hasta que no es posible más reducción.&lt;/p&gt;
&lt;p&gt;Podemos definir nuevas funciones usando Name = &amp;lt;expression&amp;gt;:&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.todocontenidos.com/images/articles/ajlambdacon03.png" alt="" /&gt; &lt;/p&gt;
&lt;p&gt;Más información sobre Cálculo Lambda en:&lt;/p&gt;
&lt;p&gt;&lt;a title="Lecture Notes on the Lambda Calculus (pdf)" href="http://www.mscs.dal.ca/~selinger/papers/lambdanotes.pdf"&gt;Lecture Notes on the Lambda Calculus (pdf)&lt;/a&gt;&amp;nbsp;(excelente paper para estudiar Lambda Calculus)&lt;/p&gt;
&lt;p&gt;&lt;a title="Peter Selinger- Papers" href="http://www.mscs.dal.ca/~selinger/papers.html"&gt;Peter Selinger- Papers&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a title="Lambda calculus - Wikipedia, the free encyclopedia" href="http://en.wikipedia.org/wiki/Lambda_calculus"&gt;Lambda calculus - Wikipedia, the free encyclopedia&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a title="A Tutorial Introduction to the Lambda Calculus" href="http://www.utdallas.edu/~gupta/courses/apl/lambda.pdf"&gt;A Tutorial Introduction to the Lambda Calculus&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://delicious.com/ajlopez/lambda"&gt;http://delicious.com/ajlopez/lambda&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://frmb.org/lambda.html" target="_blank"&gt;Lambda Calculus implementation from Fred&amp;#39;s Page&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Nos leemos!&lt;/p&gt;
&lt;p&gt;Angel &amp;quot;Java&amp;quot; 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=1674015" 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></item><item><title>Bertrand Meyer en Buenos Aires, Argentina</title><link>http://msmvps.com/blogs/lopez/archive/2009/02/07/bertrand-meyer-en-buenos-aires-argentina.aspx</link><pubDate>Sat, 07 Feb 2009 11:15:56 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1669813</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=1669813</wfw:commentRss><comments>http://msmvps.com/blogs/lopez/archive/2009/02/07/bertrand-meyer-en-buenos-aires-argentina.aspx#comments</comments><description>&lt;p&gt;Recibo en estos días, un email, avisando de una charla de Bertrand Meyer, aquí, en Buenos Aires. Meyer es&amp;nbsp;uno de los padres de la programación orientada a objetos con contratos, y creador del lenguaje Eiffel. Para ver en qué está trabajando, lo mejor es visitar su página en el sitio de Software Engineering del famoso ETH Zurich:&lt;/p&gt; &lt;p&gt;&lt;a title="http://se.ethz.ch/~meyer/" href="http://se.ethz.ch/~meyer/"&gt;http://se.ethz.ch/~meyer/&lt;/a&gt;&lt;/p&gt; &lt;p&gt;(en mis intereses, ETH Zurich es también conocido por su trabajo en física y ciencias naturales, vean algunos de los premios Nobel que pasaron por ahí &lt;a title="http://www.ethz.ch/about/bginfos/nobelprize/index_EN" href="http://www.ethz.ch/about/bginfos/nobelprize/index_EN"&gt;http://www.ethz.ch/about/bginfos/nobelprize/index_EN&lt;/a&gt;).&lt;/p&gt; &lt;p&gt;La charla es gratuita, no necesitan inscribirse, y es parte de los Seminarios Athena, de la gente de la Universidad Tecnológica Nacional, de Buenos Aires.&lt;/p&gt; &lt;p&gt;Para más información sobre los seminarios Athena (charlas anteriores,charlas futuras, comentarios, etc)&lt;br /&gt;ver: &lt;a href="http://www.seminariosathena.com.ar/"&gt;http://www.seminariosathena.com.ar/&lt;/a&gt;  &lt;p&gt;Como en esta seminario, en esas charlas no es necesaria inscripción previa ni conocimientos de alguna tecnología en particular.  &lt;p&gt;El titulo del seminario es &lt;strong&gt;Touch of Class: How we teach introductory programming&lt;/strong&gt;. Y será dado el próximo miércoles 11 de febrero. El lugar, el aula magna de Medrano 951, Buenos Aires, a las 19.00 hs. Está basado en el libro que publicó Meyer este año, &lt;a href="http://www.amazon.com/Touch-Class-Learning-Program-Contracts/dp/3540921443"&gt;con el mismo título&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;El abstract en inglés:&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.amazon.com/Touch-Class-Learning-Program-Contracts/dp/3540921443"&gt;&lt;img src="http://ecx.images-amazon.com/images/I/51JRadQcz3L._SL500_AA240_.jpg" align="left" border="0" alt="" /&gt; &lt;/a&gt;&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;Teaching programming faces a host of challenges, due in particular to the unprecedented variety of student backgrounds and to the demands of the IT industry. Techniques that worked well in the seventies do not scale up to today&amp;#39;s context. The &amp;quot;concepts or skills?&amp;quot; debate is more relevant than ever, especially in the ever more globalized world of software development.  &lt;p&gt;For the past 6 years, we have taught introductory programming at ETH, based on an &amp;quot;outside-in&amp;quot; approach that makes it possible to introduce the reality of large software while emphasizing the principles of sound software development. This approach has resulted in a forthcoming textbook (&amp;quot;Touch of Class: An Introduction to Programming Well With Objects and Contracts&amp;quot;, Springer-Verlag, May 2009).  &lt;p&gt;I will present the result of our experience, including metrics that we have systematically collected along the way, and draw conclusions regarding how to teach programming today. I will argue the task consists of teaching twenty-six seminal concepts, and will explore one of them in depth.&lt;/p&gt;&lt;/blockquote&gt; &lt;p class="MsoNormal"&gt;Hay otra charla el jueves, esta vez en la Facultad de Ciencias Exactas, de la Universidad de Buenos Aires. La charla sera en el aula 4 del Pabellon I de la Facultad de Ciencias Exactas y Naturales, en Ciudad Universitaria.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Programs that test themselves&lt;/strong&gt;&lt;br /&gt;Bertrand Meyer, ETH Zurich and Eiffel Software&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;&amp;quot;Automated&amp;quot; testing techniques as widely used today automate only part of the task, but leave aside the most difficult and time-consuming aspects: test case generation and test oracles. Using software with built-in contracts addresses both of these issues, leading to software that tests itself completely automatically, in a&lt;br /&gt;&amp;quot;push-button&amp;quot; &amp;nbsp;style.&lt;/p&gt; &lt;p&gt;The talk will present concepts and principles behind push-button contract-based testing and present experiences with two tools, AutoTest and CDD (Contract-Driven Development), which have already uncovered&lt;br /&gt;hundreds of bugs in released commercial software and have now been integrated as a standard component of the EiffelStudio IDE.&lt;/p&gt; &lt;p&gt;Bertrand Meyer is Professor of Software Engineering at ETH Zurich and Chief Architect of Eiffel Software. He is the author of a number of books including the best-seller &amp;quot;Object-Oriented Software Construction&amp;quot; (Prentice&lt;br /&gt;Hall, Jolt Award 1998). He has led the development of the Eiffel language and supporting tools and libraries. He is a fellow of the ACM and has received the ACM Software System Award as well as the Dahl-Nygaard prize for&lt;br /&gt;object technology and an honorary doctorate from the Technical University of Saint Petersburg. His latest book is &amp;quot;Touch of Class&amp;quot;, an introductory programming textbook to be published in May 2009 by Springer.&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;Recuerdo haber leído varias veces, el libro de Meyer: &amp;quot;&lt;a href="http://www.amazon.com/Object-Oriented-Software-Construction-Prentice-Hall-International/dp/0136291554/" target="_blank"&gt;Object-Oriented Software Construction&lt;/a&gt;&amp;quot;. Es un libro que merece ser releído cada tanto tiempo. Totalmente recomendable. Ahí encontré por primera vez al lenguaje Eiffel, y los contratos, muy interesante. Temo que Eiffel me chocó un poco, por el uso de mayúsculas, que en aquellos años me recordaban a Cobol y Ada. Recuerdo que en aquellos tiempos, Eiffel tenía renaming de clases, cuando había colisión de nombres. No había lenguajes con claros Namespaces, que aparecieron luego como extensión de C++. &lt;p&gt;Espero que Meyer disfrute de la visita a mi país. Aun en el mundo de Internet, es importante el contacto personal. Es muy bueno que gente de la industria y de la academia, venga a visitarnos. Muy bueno, también, que la UTN y la UBA hayan podido organizar estas charlas.  &lt;p&gt;Si conocen otras actividades de Meyer en mi país, dejen comentario! &lt;p&gt;Nos leemos!&lt;/p&gt; &lt;p&gt;Angel &amp;quot;Java&amp;quot; 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=1669813" 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></item><item><title>Un ejemplo de Dynamic Expressions</title><link>http://msmvps.com/blogs/lopez/archive/2009/01/31/un-ejemplo-de-dynamic-expressions.aspx</link><pubDate>Sat, 31 Jan 2009 09:01:50 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1667612</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=1667612</wfw:commentRss><comments>http://msmvps.com/blogs/lopez/archive/2009/01/31/un-ejemplo-de-dynamic-expressions.aspx#comments</comments><description>&lt;p&gt;El jueves, estaba preparando una presentación para ayer viernes, explicando cálculo lambda, su historia, su aplicación en lenguajes de programación. Al final de la presentación, mostré cómo las lambdas llegaron a .NET: delegados, notación lambda y expresiones lambda.&lt;/p&gt; &lt;p&gt;Haciendo una rápida búsqueda de enlaces para la charla, encontré esta implementación &amp;quot;cool&amp;quot; de un &amp;quot;parser&amp;quot; de expresiones dinámicas, en el ejemplo:&lt;/p&gt; &lt;p&gt;&lt;a title="DynamicLinq.cs" href="http://dblinq2007.googlecode.com/svn/trunk/lib/DynamicLinq.cs"&gt;DynamicLinq.cs&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Ese código menciona el post de Scott Guthrie:&lt;/p&gt; &lt;p&gt;&lt;a title="Dynamic LINQ (Part 1- Using the LINQ Dynamic Query Library)" href="http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx"&gt;Dynamic LINQ (Part 1- Using the LINQ Dynamic Query Library)&lt;/a&gt;&lt;/p&gt; &lt;p&gt;El código está incluido en el directorio DynamicQuery en:&lt;/p&gt; &lt;p&gt;&lt;a title="C# Dynamic Query Library (included in the -LinqSamples-DynamicQuery directory)" href="http://msdn2.microsoft.com/en-us/vcsharp/bb894665.aspx"&gt;C# Dynamic Query Library (included in the -LinqSamples-DynamicQuery directory)&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Mi idea inicial para la charla era describir una fórmula y compilarala, usando System.Linq.Expressions. Pero la implementación de arriba, tiene una característica notable: en lugar de construir un árbol de expresiones, paso a paso, creando cada nodo, toma un string y los analiza en el momento, convirtiéndolo a una versión compilada.&lt;/p&gt; &lt;p&gt;OK, este truco es usado por muchas implementaciones de query en Linq, pero no conocía que entre el código de ejemplo de Microsoft estuviera este código.&lt;/p&gt; &lt;p&gt;Usando el DynamicLinq.cs, pude crear una aplicación WinForm, donde la fórmula se ingresa y se compila en el momento:&lt;/p&gt; &lt;p&gt;&lt;img src="http://www.todocontenidos.com/images/articles/dynexp01.png" alt="" /&gt; &lt;/p&gt; &lt;p&gt;Vean que podemos usar clases de .NET. &amp;quot;x&amp;quot; es el parámetro que uso como variable en el cálculo de la fórmula.&lt;/p&gt; &lt;p&gt;Este es el código clave en el archivo Calculator.cs:&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:9c327bca-5e16-412b-9ebf-a0739240eb02" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;&lt;pre style="background-color:White;white-space:-moz-pre-wrap;white-space:-pre-wrap;white-space:-o-pre-wrap;white-space:pre-wrap;word-wrap:break-word;"&gt;&lt;div&gt;&lt;span style="color:#000000;"&gt;        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; Delegate CompileFormula(&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt;&lt;span style="color:#000000;"&gt; formula)
        {
            ParameterExpression x &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; Expression.Parameter(&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;typeof&lt;/span&gt;&lt;span style="color:#000000;"&gt;(&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;double&lt;/span&gt;&lt;span style="color:#000000;"&gt;), &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;x&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;);
            LambdaExpression e &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; DynamicExpression.ParseLambda(&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;new&lt;/span&gt;&lt;span style="color:#000000;"&gt; ParameterExpression[] { x }, &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;null&lt;/span&gt;&lt;span style="color:#000000;"&gt;, formula);
            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;return&lt;/span&gt;&lt;span style="color:#000000;"&gt; e.Compile();
        }
&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;El delegado compilado puede ser invocado, proveyendo el valor del parámetro &amp;quot;x&amp;quot;:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:1b63708d-9111-44d5-8f21-8df55a320125" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;&lt;pre style="background-color:White;white-space:-moz-pre-wrap;white-space:-pre-wrap;white-space:-o-pre-wrap;white-space:pre-wrap;word-wrap:break-word;"&gt;&lt;div&gt;&lt;span style="color:#000000;"&gt;        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;double&lt;/span&gt;&lt;span style="color:#000000;"&gt;[] Calculate(Delegate formula, &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;double&lt;/span&gt;&lt;span style="color:#000000;"&gt; from, &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;double&lt;/span&gt;&lt;span style="color:#000000;"&gt; to, &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;double&lt;/span&gt;&lt;span style="color:#000000;"&gt; step)
        {
            List&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;double&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt; values &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;new&lt;/span&gt;&lt;span style="color:#000000;"&gt; List&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;double&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;();

            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;for&lt;/span&gt;&lt;span style="color:#000000;"&gt; (&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;double&lt;/span&gt;&lt;span style="color:#000000;"&gt; x &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; from; x &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; to; x &lt;/span&gt;&lt;span style="color:#000000;"&gt;+=&lt;/span&gt;&lt;span style="color:#000000;"&gt; step)
                values.Add((&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;double&lt;/span&gt;&lt;span style="color:#000000;"&gt;) formula.DynamicInvoke(x));

            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;return&lt;/span&gt;&lt;span style="color:#000000;"&gt; values.ToArray();
        }&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Pueden descargar este ejemplo de:&lt;/p&gt;
&lt;p&gt;&lt;a title="http://code.google.com/p/ajcodekatas/source/browse#svn/trunk/DynamicExpressionsExample" href="http://code.google.com/p/ajcodekatas/source/browse#svn/trunk/DynamicExpressionsExample"&gt;http://code.google.com/p/ajcodekatas/source/browse#svn/trunk/DynamicExpressionsExample&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Otra implementación de expresiones dinámicas compiladas:&lt;/p&gt;
&lt;p&gt;&lt;a title="To Bind or Not To Bind &amp;ndash; Dynamic Expression Trees &amp;ndash; Part 3 - B# .NET Blog" href="http://community.bartdesmet.net/blogs/bart/archive/2008/08/28/to-bind-or-not-to-bind-dynamic-expression-trees-part-3.aspx"&gt;To Bind or Not To Bind – Dynamic Expression Trees – Part 3 - B# .NET Blog&lt;/a&gt;&lt;br /&gt;&lt;a title="To Bind or Not To Bind &amp;ndash; Dynamic Expression Trees &amp;ndash; Part 2 - B# .NET Blog" href="http://community.bartdesmet.net/blogs/bart/archive/2008/08/27/to-bind-or-not-to-bind-dynamic-expression-trees-part-2.aspx"&gt;To Bind or Not To Bind – Dynamic Expression Trees – Part 2 - B# .NET Blog&lt;/a&gt;&lt;br /&gt;&lt;a title="To Bind or Not To Bind &amp;ndash; Dynamic Expression Trees &amp;ndash; Part 1 - B# .NET Blog" href="http://community.bartdesmet.net/blogs/bart/archive/2008/08/26/to-bind-or-not-to-bind-dynamic-expression-trees-part-1.aspx"&gt;To Bind or Not To Bind – Dynamic Expression Trees – Part 1 - B# .NET Blog&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Algunas ideas a explorar:&lt;/p&gt;
&lt;p&gt;- Extender el ejemplo a tres dimensiones (podría usar un ejemplo que viene en F# con DirectX como base)&lt;/p&gt;
&lt;p&gt;- Enviar una fórmula como texto, para ser procesada en una aplicación distribuida, grilla, o cluster de HPC. Por ejemplo, la fórmula del fractal&amp;nbsp;a calcular en forma distribuida.&lt;/p&gt;
&lt;p&gt;- Code kata escribiendo mi propio&amp;nbsp;.Parse y .Compile para alguno de mis lenguajes de scripting&lt;/p&gt;
&lt;p&gt;Si necesitan más poder, el próximo nivel de lenguajes dinámicos y su compilación a .NET, ese el namespace&amp;nbsp; Microsoft.Scripting dentro del código fuente de IronPython:&lt;/p&gt;
&lt;p&gt;&lt;a title="http://www.codeplex.com/IronPython/SourceControl" href="http://www.codeplex.com/IronPython/SourceControl"&gt;http://www.codeplex.com/IronPython/SourceControl&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Introducciones a IronPython y la iniciativa DLR:&lt;/p&gt;
&lt;p&gt;&lt;a title="CLR Inside Out- IronPython and the Dynamic Language Runtime" href="http://msdn.microsoft.com/en-us/magazine/cc163344.aspx"&gt;CLR Inside Out- IronPython and the Dynamic Language Runtime&lt;/a&gt;&lt;br /&gt;&lt;a title="CLR Inside Out- Dynamic Languages and Silverlight" href="http://msdn.microsoft.com/en-us/magazine/cc163284.aspx"&gt;CLR Inside Out- Dynamic Languages and Silverlight&lt;/a&gt;&lt;br /&gt;&lt;a title="InfoQ- Microsoft Surpasses Java&amp;#39;s Dynamic Language Support-" href="http://www.infoq.com/news/2007/05/java-dlr"&gt;InfoQ- Microsoft Surpasses Java&amp;#39;s Dynamic Language Support-&lt;/a&gt;&lt;br /&gt;&lt;a href="http://msdn.microsoft.com/es-ar/magazine/cc300810(en-us).aspx" target="_blank"&gt;CLR Inside Out - IronPython&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Enlaces relacionados sobre lambda, Dynamic Language Runtime, y lenguajes dinámicas en general:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://delicious.com/ajlopez/lambda"&gt;http://delicious.com/ajlopez/lambda&lt;/a&gt;&lt;br /&gt;&lt;a href="http://delicious.com/ajlopez/dlr"&gt;http://delicious.com/ajlopez/dlr&lt;/a&gt;&lt;br /&gt;&lt;a href="http://delicious.com/ajlopez/dynamiclanguages"&gt;http://delicious.com/ajlopez/dynamiclanguages&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Nos leemos!&lt;/p&gt;
&lt;p&gt;Angel &amp;quot;Java&amp;quot; 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=1667612" 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></item><item><title>Presentando AjSoda</title><link>http://msmvps.com/blogs/lopez/archive/2009/01/26/presentando-ajsoda.aspx</link><pubDate>Mon, 26 Jan 2009 08:46:29 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1665967</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=1665967</wfw:commentRss><comments>http://msmvps.com/blogs/lopez/archive/2009/01/26/presentando-ajsoda.aspx#comments</comments><description>&lt;p&gt;Hace un año, escribí un post, comentando el trabajo de &lt;a href="http://piumarta.com/" target="_blank"&gt;Ian Piumarta&lt;/a&gt; work:&lt;/p&gt; &lt;p&gt;&lt;a href="http://msmvps.com/blogs/lopez/archive/2008/01/14/self-sustaining-systems-cola-pepsi-coke-y-mate.aspx" target="_blank"&gt;Self-sustaining sysmtes, Cola, Pepsi y Mate&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Proponía que una implementación de las ideas Ian Piumarta y Warth, era posible en .NET o en Java. En vez de usar C como lenguaje base, se podría implementar todo sobre un lenguaje con máquina virtual, con un framework rico de clases de base, y con un garbage collector automático. Para mí, era una interesante idea, que merecía algo de atención.&lt;/p&gt; &lt;p&gt;Para entender las ideas ideas de Piumarta y Warth, lean lo que describieron sobre una implementación mínima en:&lt;/p&gt; &lt;p&gt;&lt;a href="http://piumarta.com/pepsi/objmodel2.pdf"&gt;http://piumarta.com/pepsi/objmodel2.pdf&lt;/a&gt;&lt;br /&gt;&lt;a href="http://piumarta.com/pepsi/objmodel.pdf"&gt;http://piumarta.com/pepsi/objmodel.pdf&lt;/a&gt;  &lt;p&gt;Encontrarán el código de una implementación en C, en esos papers. Un diagrama aclaratorio:  &lt;p&gt;(tomado de&lt;a href="http://www.swa.hpi.uni-potsdam.de/dls/dls06/presentations/IanPiumarta_2006_OpenExtensibleDynamicProgrammingSystems_Dls.pdf" target="_blank"&gt;Open Extensible Dynamic Programming Systems Dls&lt;/a&gt; )  &lt;p&gt;&lt;img src="http://www.todocontenidos.com/images/articles/ajsodaobj.png" alt="" /&gt;  &lt;p&gt;Esta semana pasada, puse manos a la obra, y estuve trabajando en una implementación en C# de esas ideas. Publiqué mi código en my&amp;nbsp; &lt;a href="http://code.google.com/p/ajcodekatas/" target="_blank"&gt;Proyecto Google Code AjCodeKatas&lt;/a&gt;,&amp;nbsp;dentro de:  &lt;p&gt;&lt;a title="http://code.google.com/p/ajcodekatas/source/browse#svn/trunk/AjSoda" href="http://code.google.com/p/ajcodekatas/source/browse#svn/trunk/AjSoda"&gt;http://code.google.com/p/ajcodekatas/source/browse#svn/trunk/AjSoda&lt;/a&gt;  &lt;p&gt;La solución tiene cuatro proyectos (dos librerías de clases, y otros dos que son sus respectivos tests). El proyecto principal es el &lt;strong&gt;AjSoda&lt;/strong&gt;:  &lt;p&gt;&amp;nbsp;&lt;img src="http://www.todocontenidos.com/images/articles/ajsodaprj.png" alt="" /&gt;  &lt;p&gt;Un diagrama de las interfaces principales:  &lt;p&gt;&lt;img src="http://www.todocontenidos.com/images/articles/ajsodadiagint.png" alt="" /&gt;  &lt;p&gt;&lt;strong&gt;IObject&lt;/strong&gt; es la interfaz que escribí para representar un objeto genérico. Tiene un &amp;quot;payload&amp;quot;, que es un arreglo de referencias a objectos .NET arbitrarios.  &lt;p&gt;Una alternativa que consideré, era apuntar solamente a IObjects. Pero quiero tener la capacidad de apuntar y manipular directamente objetos .NET (u objetos Java, si lo reimplemento en ese lenguaje). La alternativa hubiera sido apuntar solo a &lt;strong&gt;IObjects&lt;/strong&gt;, e implementar un digamos &lt;strong&gt;DotNetWrapper : IObject&lt;/strong&gt; que encapsulara los accesos a un objeto .NET (algo así está armado en el AjBasic).  &lt;p&gt;El método más importante en&amp;nbsp; &lt;strong&gt;IObject&lt;/strong&gt; es &lt;strong&gt;Send&lt;/strong&gt;. Usando este método, podemos enviar un mensaje (selector y argumentos) a cualquier instancia de &lt;strong&gt;IObject&lt;/strong&gt;.  &lt;p&gt;&lt;strong&gt;IBehavior&lt;/strong&gt; es mi implementación de lo que Piumarta y Warth llaman una vtable (me recuerda a las tablas de métodos en viejas implementaciones de C++).&amp;nbsp;Es un objeto que contiene una lista por nombre de métodos que pueden atender los mensajes que se envía a un&amp;nbsp; &lt;strong&gt;IObject&lt;/strong&gt;.  &lt;p&gt;Cada &lt;strong&gt;IObject &lt;/strong&gt;tiene una propiedad &lt;strong&gt;Behavior&lt;/strong&gt; que apunta a un &lt;strong&gt;IObject&lt;/strong&gt;. Podría haber elegido apuntar a un &lt;strong&gt;IBehavior&lt;/strong&gt;, pero de esta manera, el &lt;strong&gt;Behavior&lt;/strong&gt; de un objeto puede ser reemplazado por cualquier otro objeto que entienda un mensaje con selector #lookup:.  &lt;p&gt;No necesité hasta ahora, implementar el concepto de Closure, como lo describen Piumarta y Warth en su paper. Usando closures, ellos implementan slots a la Javascript o Self. Pero en los experimentos que hice, no necesité aún implementar eso.  &lt;p&gt;Las clases principales de implementación son:  &lt;p&gt;&lt;img src="http://www.todocontenidos.com/images/articles/ajsodadiagcls.png" alt="" /&gt;  &lt;p&gt;Cada &lt;strong&gt;BaseObject&lt;/strong&gt;&amp;nbsp;implementa un&amp;nbsp;&lt;strong&gt;IObject, &lt;/strong&gt;manteniendo un arreglo interno de objetos como &amp;quot;payload&amp;quot; del objeto:  &lt;p&gt;&lt;/p&gt; &lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:0f523c81-5670-4fbd-893e-db8425f511d1" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;&lt;pre style="background-color:White;"&gt;&lt;div&gt;&lt;span style="color:#000000;"&gt;    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;class&lt;/span&gt;&lt;span style="color:#000000;"&gt; BaseObject : IObject
    {
        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;private&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;object&lt;/span&gt;&lt;span style="color:#000000;"&gt;[] values;

        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; BaseObject()
        {
        }

        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; BaseObject(&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;int&lt;/span&gt;&lt;span style="color:#000000;"&gt; size)
        {
            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;&lt;span style="color:#000000;"&gt;.values &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;new&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;object&lt;/span&gt;&lt;span style="color:#000000;"&gt;[size];
        }

        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;int&lt;/span&gt;&lt;span style="color:#000000;"&gt; Size
        {
            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;get&lt;/span&gt;&lt;span style="color:#000000;"&gt;
            {
                &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;if&lt;/span&gt;&lt;span style="color:#000000;"&gt; (&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;&lt;span style="color:#000000;"&gt;.values &lt;/span&gt;&lt;span style="color:#000000;"&gt;==&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;null&lt;/span&gt;&lt;span style="color:#000000;"&gt;)
                {
                    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;return&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;0&lt;/span&gt;&lt;span style="color:#000000;"&gt;;
                }

                &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;return&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;&lt;span style="color:#000000;"&gt;.values.Length;
            }
        }

        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; IObject Behavior { &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;get&lt;/span&gt;&lt;span style="color:#000000;"&gt;; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;set&lt;/span&gt;&lt;span style="color:#000000;"&gt;; }
&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;(Noten que la propiedad &lt;strong&gt;Behavior&amp;nbsp;&lt;/strong&gt;es un &lt;strong&gt;IObject&lt;/strong&gt;, por las razones que expliqué antes).&lt;/p&gt;
&lt;p&gt;El método más interesante es el &lt;strong&gt;Send&lt;/strong&gt;:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:f042ec00-d5d2-48d2-9ad4-3aea97343c75" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;&lt;pre style="background-color:White;white-space:-moz-pre-wrap;white-space:-pre-wrap;white-space:-o-pre-wrap;white-space:pre-wrap;word-wrap:break-word;"&gt;&lt;div&gt;&lt;span style="color:#000000;"&gt;        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;virtual&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;object&lt;/span&gt;&lt;span style="color:#000000;"&gt; Send(&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt;&lt;span style="color:#000000;"&gt; selector, &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;params&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;object&lt;/span&gt;&lt;span style="color:#000000;"&gt;[] arguments)
        {
            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;if&lt;/span&gt;&lt;span style="color:#000000;"&gt; (selector &lt;/span&gt;&lt;span style="color:#000000;"&gt;==&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;null&lt;/span&gt;&lt;span style="color:#000000;"&gt;)
            {
                &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;throw&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;new&lt;/span&gt;&lt;span style="color:#000000;"&gt; ArgumentNullException(&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;selector&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;);
            }

            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;if&lt;/span&gt;&lt;span style="color:#000000;"&gt; (&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;&lt;span style="color:#000000;"&gt;.Behavior &lt;/span&gt;&lt;span style="color:#000000;"&gt;==&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;null&lt;/span&gt;&lt;span style="color:#000000;"&gt;)
            {
                &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;throw&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;new&lt;/span&gt;&lt;span style="color:#000000;"&gt; InvalidOperationException(&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;No behavior in object&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;);
            }

            IMethod method &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; (IMethod) &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;&lt;span style="color:#000000;"&gt;.Behavior.Send(&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;lookup:&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;, selector);

            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;if&lt;/span&gt;&lt;span style="color:#000000;"&gt; (method &lt;/span&gt;&lt;span style="color:#000000;"&gt;==&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;null&lt;/span&gt;&lt;span style="color:#000000;"&gt;)
            {
                &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;throw&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;new&lt;/span&gt;&lt;span style="color:#000000;"&gt; InvalidOperationException(&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt;&lt;span style="color:#000000;"&gt;.Format(CultureInfo.InvariantCulture, &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;Unknown message &amp;#39;{0}&amp;#39;&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;, selector));
            }

            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;return&lt;/span&gt;&lt;span style="color:#000000;"&gt; method.Execute(&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;&lt;span style="color:#000000;"&gt;, arguments);
        }
&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;No uso directamente &lt;strong&gt;this.Behavior.Lookup&amp;nbsp;&lt;/strong&gt;para obtener el &lt;strong&gt;IMethod&lt;/strong&gt; asociado a un selector. En cambio, uso directamente el método &lt;strong&gt;Send&lt;/strong&gt; para enviar un mensaje al object apuntado por &lt;strong&gt;Behavior&lt;/strong&gt;. De esta forma, &lt;strong&gt;obj.Behavior&lt;/strong&gt; puede ser dirigido a cualquier objeto &lt;strong&gt;IObject &lt;/strong&gt;que quiera implementar la lógica de lookup de un método por selector. Esta decisión tiene impacto en el rendimiento, pero permite explorar nuevas estrategias de obtención de métodos. Pueden leer en los papers mencionados, cómo implementan herencia múltiple y Traits, usando esta capacidad de redefición de lookup.&lt;/p&gt;
&lt;h3&gt;AjPepsi&lt;/h3&gt;
&lt;p&gt;En el código encontraran un proyecto adicional, &lt;strong&gt;AjPepsi&lt;/strong&gt;, donde implementé un parser, y intérprete de bytecodes,&amp;nbsp;de un lenguaje parecido al que usaron language Piumarta/Warth como prueba de concepto en sus escritos. Acepta código como: 
&lt;p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:d7e113e0-b500-419a-8b88-01fd0c4840b1" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;&lt;pre style="background-color:White;"&gt;&lt;div&gt;&lt;span style="color:#000000;"&gt;
Object &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;new&lt;/span&gt;&lt;span style="color:#000000;"&gt; [&lt;/span&gt;&lt;span style="color:#000000;"&gt;^&lt;/span&gt;&lt;span style="color:#000000;"&gt;self &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;class&lt;/span&gt;&lt;span style="color:#000000;"&gt; basicNew initialize]
Object initialize []

List : Object(head tail)

List head [&lt;/span&gt;&lt;span style="color:#000000;"&gt;^&lt;/span&gt;&lt;span style="color:#000000;"&gt;head]
List tail [&lt;/span&gt;&lt;span style="color:#000000;"&gt;^&lt;/span&gt;&lt;span style="color:#000000;"&gt;tail]
List head: newHead [head :&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; newHead]
List tail: newTail [tail :&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; newTail]

list1 :&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; [&lt;/span&gt;&lt;span style="color:#000000;"&gt;^&lt;/span&gt;&lt;span style="color:#000000;"&gt;List &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;new&lt;/span&gt;&lt;span style="color:#000000;"&gt;]
list2 :&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; [&lt;/span&gt;&lt;span style="color:#000000;"&gt;^&lt;/span&gt;&lt;span style="color:#000000;"&gt;List &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;new&lt;/span&gt;&lt;span style="color:#000000;"&gt;]

[list1 head: &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;#39;&lt;/span&gt;&lt;span style="color:#000000;"&gt;Hello&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;#39;&lt;/span&gt;&lt;span style="color:#000000;"&gt;]
[list2 head: &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;#39;&lt;/span&gt;&lt;span style="color:#000000;"&gt;World&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;#39;&lt;/span&gt;&lt;span style="color:#000000;"&gt;]
[list1 tail: list2]

&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Object&lt;/strong&gt; y &lt;strong&gt;List&lt;/strong&gt; son prototipos. Dejaré una explicación más detallada de este lenguaje y su implementación para un futuro post. &lt;strong&gt;AjPepsi&lt;/strong&gt;&amp;nbsp;aún está en desarrollo; probablemente, refactorearé gran parte del núcleo de la implementación. Tomé el código de &lt;a href="http://code.google.com/p/ajtalk" target="_blank"&gt;AjTalk&lt;/a&gt; como base, pero no estoy seguro de haber tomado la decisión correcta: &lt;strong&gt;AjPepsi&lt;/strong&gt;&amp;nbsp;es muy orientado a prototipos, y basado en &lt;strong&gt;AjSoda&lt;/strong&gt;, así que tuve que trabajar bastante para llevarlo a estas ideas.&lt;/p&gt;
&lt;p&gt;Una gran &amp;quot;feature&amp;quot; pendiente: generar código C# a partir del estado de la máquina virtual (clases, métodos&amp;nbsp; e instancias). Vean en el sitio de Piumarta cómo implementó un compilador de su propio lenguaje en C, y que genera en ese lenguaje el código de su propio intérprete. De ahí la idea de &amp;quot;lenguajes auto sustentables&amp;quot;.&lt;/p&gt;
&lt;p&gt;Los tests están en verde:&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.todocontenidos.com/images/articles/ajsodatests.png" alt="" /&gt; &lt;/p&gt;
&lt;p&gt;El &amp;quot;code coverage&amp;quot; es bueno:&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.todocontenidos.com/images/articles/ajsodacc.png" alt="" /&gt; &lt;/p&gt;
&lt;p&gt;Hay algún &amp;quot;code smell&amp;quot; para refactorear. Un ejemplo clásico: el gran switch con toneladas de código en el intérprete de byte code. Pero la mayoría de ese código oloroso está en el proyecto AjPepsi. AjSoda está tomando forma,&amp;nbsp;yendo&amp;nbsp;hacia una versión estable. Me tomó sólo 4 horas escribir el código de AjSoda, pero estoy gastando muchas horas escribiendo AjPepsi&amp;nbsp;(10 horas hasta ahora).&lt;/p&gt;
&lt;p&gt;Como de costumbre, ¡me divertí escribiendo este código!&lt;/p&gt;
&lt;p&gt;Más enlaces sobre las ideas de Piumarta/Warth:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://lambda-the-ultimate.org/node/2483"&gt;http://lambda-the-ultimate.org/node/2483&lt;/a&gt;&lt;br /&gt;&lt;a href="http://piumarta.com/"&gt;http://piumarta.com/&lt;/a&gt;&lt;br /&gt;&lt;a href="http://piumarta.com/pepsi/pepsi.html"&gt;http://piumarta.com/pepsi/pepsi.html&lt;/a&gt;&lt;br /&gt;&lt;a href="http://piumarta.com/software/cola/"&gt;http://piumarta.com/software/cola/&lt;/a&gt; 
&lt;p&gt;Comentarios, sugerencias, bienvenidos.&lt;/p&gt;
&lt;p&gt;Nos leemos!&lt;/p&gt;
&lt;p&gt;Angel &amp;quot;Java&amp;quot; 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=1665967" 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></item><item><title>Clean Code Talks -- Herencia, Polimorfismo y Tests</title><link>http://msmvps.com/blogs/lopez/archive/2009/01/13/clean-code-talks-herencia-polimorfismo-y-tests.aspx</link><pubDate>Tue, 13 Jan 2009 09:15:54 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1661311</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=1661311</wfw:commentRss><comments>http://msmvps.com/blogs/lopez/archive/2009/01/13/clean-code-talks-herencia-polimorfismo-y-tests.aspx#comments</comments><description>&lt;p&gt;Son un usuario fanático de &lt;a href="http://twitter.com" target="_blank"&gt;Twitter&lt;/a&gt;. Una cuenta a la que sigo es &lt;a href="http://twitter.com/delicious_prog" target="_blank"&gt;@delicious_prog&lt;/a&gt;, que envía varios mensajes por día, relacionados con programación, desarrollo de software en general. En uno de esos tweets, encontré el post&lt;/p&gt; &lt;p&gt;&lt;a title="The Clean Code Talks -- Inheritance, Polymorphism, &amp;amp; Testing" href="http://danielwildt.blogspot.com/2008/12/clean-code-talks-inheritance.html"&gt;The Clean Code Talks -- Inheritance, Polymorphism, &amp;amp; Testing&lt;/a&gt;&lt;/p&gt; &lt;p&gt;de &lt;a href="http://danielwildt.blogspot.com/" target="_blank"&gt;Daniel Wild&lt;/a&gt;, donde incluye el vidio de una&amp;nbsp; Google Talk:&lt;/p&gt; &lt;p&gt;(Please visit the site to view this media)&lt;/p&gt; &lt;p&gt;de &lt;a title="Misko Hevery" href="http://misko.hevery.com/"&gt;Misko Hevery&lt;/a&gt;&amp;nbsp;en &lt;a title="Google Tech Talks" href="http://www.youtube.com/user/googletechtalks"&gt;Google Tech Talks&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;Es claro e interesante. Es una charla explicando los usos del polimorfismo, y también, las formas de realizar test sobre métodos polimórficos. Me gusta encontrara en este vido varios argumentos similares a los que uso en mis charlas de desarrollo. Hace unos días, estuve usando polimorfirsmo en mi intérprete AjCat (un intérprete del lenguaje cat que me hizo conocer el bueno de &lt;a href="http://twitter.com/rodolfof" target="_blank"&gt;@rodolfof&lt;/a&gt;):&lt;/p&gt; &lt;p&gt;&lt;a title="http://code.google.com/p/ajcodekatas/source/browse/#svn/trunk/AjCat" href="http://code.google.com/p/ajcodekatas/source/browse/#svn/trunk/AjCat"&gt;http://code.google.com/p/ajcodekatas/source/browse/#svn/trunk/AjCat&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Esta es mi implmentación de Integer Binary Operation:&amp;nbsp;&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:cdb4759a-0b2e-4dd0-baba-262fca4716a3" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;&lt;pre style="background-color:White;white-space:-moz-pre-wrap;white-space:-pre-wrap;white-space:-o-pre-wrap;white-space:pre-wrap;word-wrap:break-word;"&gt;&lt;div&gt;&lt;span style="color:#000000;"&gt;    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;abstract&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;class&lt;/span&gt;&lt;span style="color:#000000;"&gt; IntegerBinaryOperation : Expression
    {
        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;abstract&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;int&lt;/span&gt;&lt;span style="color:#000000;"&gt; Apply(&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;int&lt;/span&gt;&lt;span style="color:#000000;"&gt; op1, &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;int&lt;/span&gt;&lt;span style="color:#000000;"&gt; op2);

        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;override&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;void&lt;/span&gt;&lt;span style="color:#000000;"&gt; Evaluate(Machine machine)
        {
            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;int&lt;/span&gt;&lt;span style="color:#000000;"&gt; op2 &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; (&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;int&lt;/span&gt;&lt;span style="color:#000000;"&gt;) machine.Pop();
            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;int&lt;/span&gt;&lt;span style="color:#000000;"&gt; op1 &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; (&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;int&lt;/span&gt;&lt;span style="color:#000000;"&gt;) machine.Pop();

            machine.Push(&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;&lt;span style="color:#000000;"&gt;.Apply(op1, op2));
        }
    }
&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Las operaciones Add y Subtract sobreescriben el método Apply:&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:b267ea20-7c62-4901-aa2d-613a963a5602" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;&lt;pre style="background-color:White;white-space:-moz-pre-wrap;white-space:-pre-wrap;white-space:-o-pre-wrap;white-space:pre-wrap;word-wrap:break-word;"&gt;&lt;div&gt;&lt;span style="color:#000000;"&gt;    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;class&lt;/span&gt;&lt;span style="color:#000000;"&gt; IntegerAddOperation : IntegerBinaryOperation
    {
        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;private&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;static&lt;/span&gt;&lt;span style="color:#000000;"&gt; IntegerAddOperation instance &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;new&lt;/span&gt;&lt;span style="color:#000000;"&gt; IntegerAddOperation();

        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;private&lt;/span&gt;&lt;span style="color:#000000;"&gt; IntegerAddOperation()
        {
        }

        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;static&lt;/span&gt;&lt;span style="color:#000000;"&gt; IntegerAddOperation Instance
        {
            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;get&lt;/span&gt;&lt;span style="color:#000000;"&gt;
            {
                &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;return&lt;/span&gt;&lt;span style="color:#000000;"&gt; instance;
            }
        }

        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;override&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;int&lt;/span&gt;&lt;span style="color:#000000;"&gt; Apply(&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;int&lt;/span&gt;&lt;span style="color:#000000;"&gt; op1, &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;int&lt;/span&gt;&lt;span style="color:#000000;"&gt; op2)
        {
            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;return&lt;/span&gt;&lt;span style="color:#000000;"&gt; op1 &lt;/span&gt;&lt;span style="color:#000000;"&gt;+&lt;/span&gt;&lt;span style="color:#000000;"&gt; op2;
        }

        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;override&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt;&lt;span style="color:#000000;"&gt; ToString()
        {
            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;return&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;add_int&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;;
        }
    }
&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:5019eb84-44e9-4e8c-b22c-d7d28428c75e" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;&lt;pre style="background-color:White;white-space:-moz-pre-wrap;white-space:-pre-wrap;white-space:-o-pre-wrap;white-space:pre-wrap;word-wrap:break-word;"&gt;&lt;div&gt;&lt;span style="color:#000000;"&gt;    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;class&lt;/span&gt;&lt;span style="color:#000000;"&gt; IntegerSubtractOperation : IntegerBinaryOperation
    {
        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;private&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;static&lt;/span&gt;&lt;span style="color:#000000;"&gt; IntegerSubtractOperation instance &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;new&lt;/span&gt;&lt;span style="color:#000000;"&gt; IntegerSubtractOperation();

        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;private&lt;/span&gt;&lt;span style="color:#000000;"&gt; IntegerSubtractOperation()
        {
        }

        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;static&lt;/span&gt;&lt;span style="color:#000000;"&gt; IntegerSubtractOperation Instance
        {
            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;get&lt;/span&gt;&lt;span style="color:#000000;"&gt;
            {
                &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;return&lt;/span&gt;&lt;span style="color:#000000;"&gt; instance;
            }
        }

        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;override&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;int&lt;/span&gt;&lt;span style="color:#000000;"&gt; Apply(&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;int&lt;/span&gt;&lt;span style="color:#000000;"&gt; op1, &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;int&lt;/span&gt;&lt;span style="color:#000000;"&gt; op2)
        {
            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;return&lt;/span&gt;&lt;span style="color:#000000;"&gt; op1 &lt;/span&gt;&lt;span style="color:#000000;"&gt;-&lt;/span&gt;&lt;span style="color:#000000;"&gt; op2;
        }

        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;override&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt;&lt;span style="color:#000000;"&gt; ToString()
        {
            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;return&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;sub_int&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;;
        }
    }
&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Es muy similar al ejemplo presentado en el video. Estuve algo más perezoso en mi implementación de operadores en&amp;nbsp; AjPython (otro intérprete, de nuevo en&amp;nbsp;C#, trabajo en progreso):&lt;/p&gt;
&lt;p&gt;&lt;a title="http://code.google.com/p/ajcodekatas/source/browse/#svn/trunk/AjPython" href="http://code.google.com/p/ajcodekatas/source/browse/#svn/trunk/AjPython"&gt;http://code.google.com/p/ajcodekatas/source/browse/#svn/trunk/AjPython&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:c1ceebe0-dcbd-4655-b75c-cab5830acc73" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;&lt;pre style="background-color:White;white-space:-moz-pre-wrap;white-space:-pre-wrap;white-space:-o-pre-wrap;white-space:pre-wrap;word-wrap:break-word;"&gt;&lt;div&gt;&lt;span style="color:#000000;"&gt;    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;class&lt;/span&gt;&lt;span style="color:#000000;"&gt; BinaryOperatorExpression : BinaryExpression
    {
        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;private&lt;/span&gt;&lt;span style="color:#000000;"&gt; Operator @operator;

        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; BinaryOperatorBLOCKED EXPRESSION;
        }
    }
&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Pero confío en refactorearlo, tengo espaldas para hacerlo, gracias una buena base de test ya escritos.&lt;/p&gt;
&lt;p&gt;Es bueno encontrar este tipo de material, como esta charla, la recomiendo, gracias a&amp;nbsp; @delicious_prog y a Daniel Wild!&lt;/p&gt;
&lt;p&gt;Nos leemos!&lt;/p&gt;
&lt;p&gt;Angel &amp;quot;Java&amp;quot; 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=1661311" 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/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></item><item><title>Resultados de la Semana Sabática</title><link>http://msmvps.com/blogs/lopez/archive/2008/10/25/resultados-de-la-semana-sab-225-tica.aspx</link><pubDate>Sat, 25 Oct 2008 08:58:04 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1651954</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=1651954</wfw:commentRss><comments>http://msmvps.com/blogs/lopez/archive/2008/10/25/resultados-de-la-semana-sab-225-tica.aspx#comments</comments><description>&lt;p&gt;Desde el 19 al 29 de septiembre pasado, tuve mi segunda semana sabática del año, sin cursos, sin entrevistas, sin charlas, dedicadas a desarrollo y estudio. Había publicado lo que quería hacer y producir en esa semana. &lt;/p&gt; &lt;p&gt;&lt;a title="Segunda Semana Sab&amp;aacute;tica del a&amp;ntilde;o" href="http://msmvps.com/blogs/lopez/archive/2008/09/21/segunda-semana-sab-225-tica-del-a-241-o.aspx"&gt;Segunda Semana Sabática del año&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Ya pasó el tiempo, es hora de escribir los resultados. Creo que&amp;nbsp;nos sirve escribir lo que uno quiere hacer, y también publicar los resultados. Así que estos post, el anterior y el actual, son algo necesario para el proceso: son parte de los &amp;quot;deliverables&amp;quot; del proyecto.&lt;/p&gt; &lt;p&gt;La lista a producir y lo producido:&lt;/p&gt; &lt;p&gt;- Terminar una primera versión ejecutable de mi intérpreta AjSharp, similar en sintaxis a C#, ahora en desarrollo dentro de mi proyecto &lt;a href="http://code.google.com/p/ajbasic" target="_blank"&gt;AjBasic&lt;/a&gt;. &lt;font color="#008000"&gt;COMPLETO&lt;/font&gt; Pueden ver el resultado en el &lt;a href="http://code.google.com/p/ajbasic"&gt;código del proyecto&lt;/a&gt;, donde quedaron dos nuevas solucíones que definen el nuevo lenguaje. Escribí un post explicando algo de la implementación en&lt;/p&gt; &lt;p&gt;&lt;a title="AjSharp- un int&amp;eacute;rprete a la C Sharp, trabajo en progreso" href="http://msmvps.com/blogs/lopez/archive/2008/09/26/ajsharp-un-int-233-rprete-a-la-c-sharp-trabajo-en-progreso.aspx"&gt;AjSharp- un intérprete a la C Sharp, trabajo en progreso&lt;/a&gt;&lt;/p&gt; &lt;p&gt;- Escribir el código para soportar un modelo textual en&amp;nbsp;&lt;a href="http://www.ajlopez.com/ajgenesis" target="_blank"&gt;AjGenesis&lt;/a&gt;, en lugar de sólo usar archivos XML (que seguirán siendo soportados). Pueden ver algún progreso en el&amp;nbsp; &lt;a href="http://www.codeplex.com/ajgenesis/SourceControl/ListDownloadableCommits.aspx" target="_blank"&gt;repositorio de código del proyecto&lt;/a&gt;. &lt;font color="#008000"&gt;COMPLETO&lt;/font&gt; Finalmente quedó implementado. Escribí sobre el tema en&lt;/p&gt; &lt;p&gt;&lt;a title="Modelo textual para generaci&amp;oacute;n de c&amp;oacute;digo con AjGenesis" href="http://msmvps.com/blogs/lopez/archive/2008/09/29/modelo-textual-para-generaci-243-n-de-c-243-digo-con-ajgenesis.aspx"&gt;Modelo textual para generación de código con AjGenesis&lt;/a&gt;&lt;/p&gt; &lt;p&gt;También hay ideas nuevas para implementar:&lt;/p&gt; &lt;p&gt;&lt;a title="Otro modelo para AjGenesis" href="http://msmvps.com/blogs/lopez/archive/2008/10/03/otro-modelo-para-ajgenesis.aspx"&gt;Otro modelo para AjGenesis&lt;/a&gt;&lt;/p&gt; &lt;p&gt;- Publicar algunos ejemplos de AjGenesis generando archivos para usar LINQ y soluciones, proyectos de Visual Studio 2008. &lt;font color="#008000"&gt;COMPLETO&lt;/font&gt; Finalmente&lt;/p&gt; &lt;p&gt;- Poner algo de amor en el código del &lt;a href="http://ajlopez.wordpress.com/2008/07/14/ajtalk-a-smalltalk-like-interpreter/" target="_blank"&gt;proyecto AjTalk&lt;/a&gt;, para soportar la lectura y proceso de definiciones de clases desde archivos tipo .st. &lt;font color="#008000"&gt;COMPLETO&lt;/font&gt; Ahora se puede cargar código desde archivos .st, pueden ver algunos tests en el código publicado.&amp;nbsp;Faltan varios detalles de lenguaje y parseo mismo, como el soporte de bloques entre [ y ] y la invocación de primitivas desde ese texto a cargar, y el manejo de variables indexadas. Luego de la semana sabática, seguí probando el nuevo Loader, y está interesante: es cuestión de completar esos puntos y comenzar a implementar la librería base. Estoy estudiando la implementación que viene con Smalltalk/X.&lt;/p&gt; &lt;p&gt;- Escribir dos posts sobre AjGenesis. &lt;font color="#008000"&gt;COMPLETO&lt;/font&gt; Fueron los post&lt;/p&gt; &lt;p&gt;&lt;a title="Generaci&amp;oacute;n de c&amp;oacute;digo para LINQ y C# 3.0 con AjGenesis" href="http://msmvps.com/blogs/lopez/archive/2008/10/01/generaci-243-n-de-c-243-digo-para-linq-y-c-3-0-con-ajgenesis.aspx"&gt;Generación de código para LINQ y C# 3.0 con AjGenesis&lt;/a&gt;&lt;/p&gt; &lt;p&gt;y el ya mencionado&lt;/p&gt; &lt;p&gt;&lt;a title="Modelo textual para generaci&amp;oacute;n de c&amp;oacute;digo con AjGenesis" href="http://msmvps.com/blogs/lopez/archive/2008/09/29/modelo-textual-para-generaci-243-n-de-c-243-digo-con-ajgenesis.aspx"&gt;Modelo textual para generación de código con AjGenesis&lt;/a&gt;&lt;/p&gt; &lt;p&gt;- Escribir dos posts sobre F#, para ir adelantando temas para &lt;a href="http://msmvps.com/blogs/lopez/archive/2008/09/17/papa-fritas-cervezas-y-una-babel-de-esos-raros-lenguajes-nuevos.aspx" target="_blank"&gt;el próximo TechNight&lt;/a&gt;. &lt;font color="#ff8000"&gt;PARCIAL&lt;/font&gt; Escribí un post sobre &lt;/p&gt; &lt;p&gt;&lt;a title="Recursos de F# y Programaci&amp;oacute;n Funcional" href="http://msmvps.com/blogs/lopez/archive/2008/10/11/recursos-de-f-y-programaci-243-n-funcional.aspx"&gt;Recursos de F# y Programación Funcional&lt;/a&gt;&lt;/p&gt; &lt;p&gt;pero no el segundo. Como compensación, escribí en detalle sobre la charla del TechNight en&lt;/p&gt; &lt;p&gt;&lt;a title="Babel de lenguajes en .NET" href="http://msmvps.com/blogs/lopez/archive/2008/10/16/babel-de-lenguajes-en-net.aspx"&gt;Babel de lenguajes en .NET&lt;/a&gt;&lt;/p&gt; &lt;p&gt;- Escribir dos posts que traten sobre CCR (&lt;a href="http://msdn.microsoft.com/en-us/library/bb648752.aspx" target="_blank"&gt;Concurrent and Coordination Runtime&lt;/a&gt;) de &lt;a href="http://www.microsoft.com/robotics"&gt;Microsoft Robotics&lt;/a&gt;. &lt;font color="#ff0000"&gt;PENDIENTE&lt;/font&gt; Tengo escrito un ejemplo corto introductorio, pero falta pulirlo.&lt;/p&gt; &lt;p&gt;No hubo &amp;quot;overdeliveries&amp;quot; en el producto de la semana, pero con el impulso de lo hecho y estudiado en la semana sabática, luego aparecieron:&lt;/p&gt; &lt;p&gt;&lt;a href="http://code.google.com/p/ajfunc"&gt;http://code.google.com/p/ajfunc&lt;/a&gt;&amp;nbsp;Implementación de un lenguaje funcional, AjFunc, siguiendo la sintaxis y semántica de F#. Falta el soporte de inferencia de tipos, y mil detalles más. Pero ya va tomando forma el núcleo.&lt;/p&gt; &lt;p&gt;&lt;a href="http://code.google.com/p/ajlogo"&gt;http://code.google.com/p/ajlogo&lt;/a&gt; Una implementación del lenguaje Logo. Dando los primeros pasos.&lt;/p&gt; &lt;p&gt;&lt;a title="http://www.codeplex.com/ajmessages" href="http://www.codeplex.com/ajmessages"&gt;http://www.codeplex.com/ajmessages&lt;/a&gt;&amp;nbsp;La publicación de un AjMessages sobre DSS/CCR. Lo había escrito el año pasado, pero ahora lo actualicé, lo pulí un poco. El año pasado también hubo un ejemplo sobre WCF. Próximos pasos: unificar los ejemplos, mejorar la serialización de los objetos, mejorar la configuración. Un post describiendo algo de la nueva implementación en:&lt;/p&gt; &lt;p&gt;&lt;a href="http://msmvps.com/blogs/lopez/archive/2008/10/10/aplicaciones-distribuidas-con-ajmessages-usando-dss-ccr.aspx" target="_blank"&gt;Aplicaciones distribuidas con AjMessages usando DSS/CCR&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Como en otras semanas sabáticas, me divertí muchísimo, y aparte me entrené y aprendí cosas nuevas.&lt;/p&gt; &lt;p&gt;Nos leemos!&lt;/p&gt; &lt;p&gt;Angel &amp;quot;Java&amp;quot; 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=1651954" 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></item><item><title>Babel de lenguajes en .NET</title><link>http://msmvps.com/blogs/lopez/archive/2008/10/16/babel-de-lenguajes-en-net.aspx</link><pubDate>Thu, 16 Oct 2008 12:03:30 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1650994</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=1650994</wfw:commentRss><comments>http://msmvps.com/blogs/lopez/archive/2008/10/16/babel-de-lenguajes-en-net.aspx#comments</comments><description>&lt;p&gt;&lt;img style="margin:0px 20px 20px 0px;" src="http://www.ajlopez.com/images/articles/babel.jpg" align="left" alt="" /&gt; El viernes pasado tuve el gran gusto de compartir un TechNight con los buenos de &lt;a href="http://blog.salias.com.ar/" target="_blank"&gt;Martín Salías&lt;/a&gt; y &lt;a href="http://weblogs.shockbyte.com.ar/rodolfof/Default.aspx" target="_blank"&gt;Rodolfo Finocchieti&lt;/a&gt;, en temas que nos gustan a los tres: lenguajes de programación, en este caso, implementados sobre .NET. Ya habíamos preanunciado el evento en:&lt;/p&gt; &lt;p&gt;&lt;a title="Technight en proceso" href="http://blog.salias.com.ar/2008/09/technight-en-proceso.html"&gt;Technight en proceso&lt;/a&gt;&lt;br /&gt;&lt;a title="Papa fritas, cervezas y una babel de esos raros lenguajes nuevos" href="http://msmvps.com/blogs/lopez/archive/2008/09/17/papa-fritas-cervezas-y-una-babel-de-esos-raros-lenguajes-nuevos.aspx"&gt;Papa fritas, cervezas y una babel de esos raros lenguajes nuevos&lt;/a&gt;&lt;/p&gt; &lt;p&gt;(bueno, me gustó la imagen que usé entonces para ilustrar&amp;nbsp;mi post, así que la repito acá... ;-).&lt;/p&gt; &lt;p&gt;Desde que tengo memoria, ha habido lenguajes de programación y más lenguajes de programación. En mi tierna infancia ya había varios lenguajes (sí, algunos mal intencionados van divulgando por ahí que cuando yo era un infante, había una sola masa continental, pero son rumores infundados... ;-).&lt;/p&gt; &lt;p&gt;Recuerdo un artículo de los 60 del Scientific American, donde se mostraba un lenguaje propuesto, no totalmente desarrollado, el CPL (Combined Programming Language). Recordaba vagamente que era parte de un trabajo de &lt;a href="http://en.wikipedia.org/wiki/Christopher_Strachey" target="_blank"&gt;Christopher Strachey&lt;/a&gt;, hoy lo pueden comprobar en el corto artículo de la Wikipedia &lt;a href="http://en.wikipedia.org/wiki/Combined_Programming_Language" target="_blank"&gt;sobre CPL&lt;/a&gt;. (Bien! la neurona todavía me trae recuerdos más o menos &amp;quot;accurate&amp;quot;...;-).&lt;/p&gt; &lt;p&gt;Se vió que era un lenguaje algo ambicioso. Yo llegué a programar con una versión simplificada, el &lt;a href="http://en.wikipedia.org/wiki/BCPL" target="_blank"&gt;BCPL&lt;/a&gt;, de &lt;a href="http://en.wikipedia.org/wiki/Martin_Richards" target="_blank"&gt;Martin Richards&lt;/a&gt;&amp;nbsp;que tenía algo que me sigue fascinando: su compilador estaba escrito en BCPL, así que bastaba usar una máquina que tuviera implementando BCPL para poder ir armando otros compiladores BCPL en otras&amp;nbsp;máquinas. También se podía generar un O-Code para una máquina virtual, y reimplementar esa máquina virtual en otras computadoras. Desde ideas de BCPL partieron el &lt;a href="http://en.wikipedia.org/wiki/B_(programming_language)" target="_blank"&gt;B&lt;/a&gt; y nuestro conocido &lt;a href="http://en.wikipedia.org/wiki/C_(programming_language)" target="_blank"&gt;lenguaje C&lt;/a&gt;. Otros intentos de máquinas virtuales fueron el P-Code de Pascal BSD, creo recordar, y también las Smalltalk machine que siempre se pensaron armar sobre&amp;nbsp;ideas de Smalltalk. Siempre es interesante encontrar la idea de un lenguaje que implementa su propio compilador o intérprete. Recuerdo el mítico &lt;a href="http://en.wikipedia.org/wiki/Small-C" target="_blank"&gt;Small C&lt;/a&gt; de Cain y luego Hendrix, que aparecía a principio de los ochenta en Dr. Dobb&amp;#39;s. Este año reencuentro esa idea de &amp;quot;lenguajes auto sustentables&amp;quot; en &lt;a title="Self-sustaining Systems, Cola, Pepsi, Coke y Mate" href="http://msmvps.com/blogs/lopez/archive/2008/01/14/self-sustaining-systems-cola-pepsi-coke-y-mate.aspx"&gt;Self-sustaining Systems, Cola, Pepsi, Coke y Mate&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;Hoy no podemos hablar, como antes (algunas décadas), de &amp;quot;yo programo en X (un solo lenguaje)&amp;quot;. Cada vez más, tenemos más opciones. Habrá que ver que no todas son potables para todos los trabajos. Pero pienso que debemos de vez en cuando, sumergirnos en el estudio de otros lenguajes, para tener una visión más amplia, ejercitar la neurona, y tener una nueva&amp;nbsp;&amp;quot;tool&amp;quot; en nuestra caja de herramientas.&lt;/p&gt; &lt;p&gt;En los noventa, nos encontramos de nuevo con el auge de las máquinas virtuales, con la aparición de Java. Con el nacimiento de .NET, tenemos una máquina virtual (aunque alguien de Microsoft se atragantaría con su lengua antes de denominar al CLR, Common Language Runtime, como máquina virtual).&lt;/p&gt; &lt;p&gt;Es sobre .NET y su máquina virtual, donde aparecieron múltiples implementaciones de lenguajes. Pero basta de historia, y pasemos a la charla en sí.&lt;/p&gt; &lt;h3&gt;La charla&lt;/h3&gt; &lt;p&gt;Excelente lo que mostraron Martín y Rodolfo. Yo comenté algunos temas de programación funcional, orientados a F#, basado en ejemplos que vienen con el lenguaje, y de libros. Los recursos que utilicé y nombré estan en mi anterior post:&lt;/p&gt; &lt;p&gt;&lt;a title="Recursos de F# y Programaci&amp;oacute;n Funcional" href="http://msmvps.com/blogs/lopez/archive/2008/10/11/recursos-de-f-y-programaci-243-n-funcional.aspx"&gt;Recursos de F# y Programación Funcional&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Quisiera poner acá un resumen de lo que mostraron Martín y Rodolfo.&lt;/p&gt; &lt;p&gt;Rodo se dedicó a&amp;nbsp;comentar en particular dos lenguajes, Boo y Cat, además de seguir comentando sobre las ideas de funcional. También mostró un Toy language, implementado usando las capacidades de Dynamic Language Runtime (Rodolfo, no encontré si está disponible ese ejemplo). Pueden bajarse su presentación desde&lt;/p&gt; &lt;p&gt;&lt;a href="http://weblogs.shockbyte.com.ar/rodolfof/archive/2008/10/14/technight-programming-in-babel.aspx" target="_blank"&gt;TechNight: programming in Babel&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;img style="margin:0px 20px 20px 0px;" src="http://www.ajlopez.com/images/articles/boo.png" align="left" alt="" /&gt;&amp;nbsp;&lt;a href="http://boo.codehaus.org/" target="_blank"&gt;Boo&lt;/a&gt; lenguaje de programación creado por Rodrigo Barreto de Oliveira. Pueden leer el Boo Manifesto para conocer más sobre la historia del lenguaje. Rodrigo necesitaba un lenguaje que se adaptara a lo que necesitaba programar, y como no encontraba ninguno que diera la talla, se lanzó a crear su propio lenguaje. El estaba entusiasmado con &lt;a href="http://www.python.org/" target="_blank"&gt;Python&lt;/a&gt;, pero en esos momentos no lo podía usar en el proyecto que tenía que desarrollar. Boo tiene una sintaxis inspirada en Python, declaración automática de variables, inferencia automática de tipos, casteo de tipos automático, funciones como objetos y ciudadanos de primera clase en el lenguaje, &lt;a href="http://en.wikipedia.org/wiki/Duck_typing" target="_blank"&gt;duck typing&lt;/a&gt; (la gente de Smalltalk reconocerá el concepto, y se asombrará de que exista como tal, para ellos es parte de la naturaleza misma). Rodolfo nos fue mostrando todos estos conceptos, pueden ver más detalles en la presentación que dejó disponible.&lt;/p&gt; &lt;p&gt;&lt;img style="margin:0px 20px 20px 0px;" src="http://www.ajlopez.com/images/articles/cat.jpg" align="left" alt="" /&gt;Otro&amp;nbsp;lenguaje que mostró fue&amp;nbsp; &lt;a href="http://www.cat-language.com/" target="_blank"&gt;Cat Programming Language&lt;/a&gt;. Conocí este lenguaje gracias al bueno de Rodolfo, que me dejó un comentario en este blog (eso es cumplir con &lt;a href="http://msmvps.com/blogs/lopez/archive/2008/01/15/don-t-be-a-canuto.aspx" target="_blank"&gt;Don&amp;#39;t be a Canuto&lt;/a&gt;, bravo!). Es un lenguaje funcional, orientado a pila, que nació de otro trabajo en Java, el &lt;a href="http://www.latrobe.edu.au/philosophy/phimvt/" target="_blank"&gt;Joy Programming Language&lt;/a&gt;. La primera vez que lo ví, me recordó a mi querido &lt;a href="http://en.wikipedia.org/wiki/Forth_%28programming_language%29" target="_blank"&gt;Forth&lt;/a&gt; (aún debo tener en algún cubil mío, la Dr. Dobb&amp;#39;s dedicada a ese lenguaje). Lo que me comentó Rodolfo el viernes, es lo simple que es la solución de código: podemos recorrerla y entenderla. Es un caso de estudio abordable de generación de código compilado en .NET, con instrucciones de Intermediate Language. Vean también cómo un lenguaje definido se puede reimplementar en otros. Lo tienen en JavaScript &lt;a title="Online Cat interpreter" href="http://www.cat-language.com/interpreter.html"&gt;Online Cat interpreter&lt;/a&gt;&amp;nbsp;, en &lt;a title="Cat in Scheme" href="http://code.google.com/p/scheme-cat"&gt;Cat in Scheme&lt;/a&gt;, &lt;a title="Cat in Python" href="http://www.triv.org.uk/~nelis/"&gt;Cat in Python&lt;/a&gt;, &lt;a title="Cat in Haskell" href="http://groups.google.com/group/catlanguage/browse_thread/thread/1cd20cee5a087509"&gt;Cat in Haskell&lt;/a&gt;, &lt;a title="Cat in Haskell using monads" href="http://pied.mine.nu/index.php?page=Lambda&amp;amp;id=22"&gt;Cat in Haskell using monads&lt;/a&gt;, y en &lt;a title="Cat in Omega" href="http://svn.berlios.de/viewcvs/al4nin/trunk/purgatory/Thrist.omg?rev=351"&gt;Cat in Omega&lt;/a&gt;. ¿Tendré que pasarlo a &lt;a href="http://code.google.com/p/ajlisp" target="_blank"&gt;ajlisp&lt;/a&gt; o &lt;a href="http://code.google.com/p/ajbasic"&gt;ajbasic&lt;/a&gt;? ;-)&lt;/p&gt; &lt;p&gt;En su turno, Martín Salías siguió comentando sobre implementaciones de lenguajes en Dynamic Language Runtime, en especial la historia de &lt;a href="http://en.wikipedia.org/wiki/IronPython" target="_blank"&gt;IronPython&lt;/a&gt;, creado por &lt;a href="http://blogs.msdn.com/hugunin/" target="_blank"&gt;Jim Hugunin&lt;/a&gt;. Jim es el creador de Jython, la implementación de Python sobre Java, y quería demostrar que la máquina virtual de .NET no era adecuada para implementar un lenguaje dinámico como Python. Y se lleva la sorpresa de poder hacerlo mejor que en Java. Así va naciendo lo que ahora conocemos como Dynamic Language Runtime, un nuevo namespace de código abierto, que crea Jim dentro de la implementación de IronPython, y que podemos usar para implementar otros lenguajes. Nos da clases de soporte para armar un árbol de expresiones en memoria, y luego generar código para .NET. No hay un lugar separado para bajarse esas clases, pero pueden obtenerlas desde:&lt;/p&gt; &lt;p&gt;&lt;a title="http://www.codeplex.com/IronPython" href="http://www.codeplex.com/IronPython"&gt;http://www.codeplex.com/IronPython&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Es interesantísimo ver la implementación en detalle, en especial los conceptos aplicados sobre DynamicSite, basta como botón de muestra&lt;/p&gt; &lt;p&gt;&lt;a title="Martin Maly - Building a DLR Language - Dynamic Behaviors 2" href="http://blogs.msdn.com/mmaly/archive/2008/01/19/building-a-dlr-language-dynamic-behaviors-2.aspx"&gt;Martin Maly - Building a DLR Language - Dynamic Behaviors 2&lt;/a&gt;&lt;/p&gt; &lt;p&gt;y visitar el blog de &lt;a href="http://blogs.msdn.com/hugunin/" target="_blank"&gt;Hugunin en MSDN&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;Puede ver lo que se está gestando para &lt;a href="http://www.ironruby.net/" target="_blank"&gt;IronRuby&lt;/a&gt; también.&lt;/p&gt; &lt;p&gt;Y comentó sobre todo lo que se está haciendo en JavaScript. Lean su post:&lt;/p&gt; &lt;p&gt;&lt;a title="Javascript - La programaci&amp;oacute;n del futuro" href="http://blog.salias.com.ar/2008/09/javascript-la-programacin-del-futuro.html"&gt;Javascript - La programación del futuro&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Mencionó el trabajo del&amp;nbsp;&amp;quot;monstro&amp;quot; de JavaScript,&amp;nbsp;John Ressig:&lt;/p&gt; &lt;p&gt;&lt;img style="margin:0px 20px 20px 0px;" src="http://ejohn.org/files/jeresig-wordpress-sm.jpg" align="left" alt="" /&gt;&amp;nbsp;&lt;a title="http://ejohn.org/" href="http://ejohn.org/"&gt;http://ejohn.org/&lt;/a&gt;&amp;nbsp;en Twitter &lt;a href="http://twitter.com/jeresig" target="_blank"&gt;@jeresig&lt;/a&gt;&lt;/p&gt; &lt;p&gt;sobre JavaScript, principal creador del &lt;a href="http://jquery.com/" target="_blank"&gt;JQuery&lt;/a&gt;&amp;nbsp;(agregaría que en estos días, Microsoft ha decidido agregar JQuery a &lt;a href="http://weblogs.asp.net/scottgu/archive/2008/09/28/jquery-and-microsoft.aspx" target="_blank"&gt;su implementación de ASP.NET Ajax&lt;/a&gt;). Martín dejó encantada a la audiencia, mostrando lo que hizo Resig: implementar en JavaScript un &lt;a href="http://ejohn.org/blog/overview-of-processing/" target="_blank"&gt;lenguaje gráfico Processing&lt;/a&gt;&amp;nbsp;pasen, lean y vean:&lt;/p&gt; &lt;p&gt;&lt;a href="http://ejohn.org/blog/processingjs/" target="_blank"&gt;Processing.js&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;img src="http://ejohn.org/files/molten2.png" alt="" /&gt;&lt;/p&gt; &lt;p&gt;(imagen tomada de ese post)&amp;nbsp;&lt;/p&gt; &lt;p&gt;Martín comentó que JavaScript corre en el cliente, con lo que se puede poner trabajo no trivial en esa máquina, haciendo más liviano el trabajo del servidor, que tal vez se encargue de darnos datos sin embellecer, el proceso de agrupación, mostrado, gráfico, puede ser derivado al cliente. Igualmente, hay JavaScript en el servidor, leer:&lt;/p&gt; &lt;p&gt;&lt;a title="Permanent link to Bringing the Browser to the Server" href="http://ejohn.org/blog/bringing-the-browser-to-the-server/"&gt;Permanent link to Bringing the Browser to the Server&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Ahora que en los browsers está el elemento Canvas, podemos usarlo desde JavaScript, leer&lt;/p&gt; &lt;p&gt;&lt;a title="Permanent link to Javascript Sparklines Library" href="http://ejohn.org/projects/jspark/"&gt;Permanent link to Javascript Sparklines Library&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Pero vean hasta donde puede llegar JavaScript, viendo el proyecto del bueno de Dan Ingalls:&lt;/p&gt; &lt;p&gt;&lt;a title="Sun Labs Lively Kernel" href="http://research.sun.com/projects/lively/"&gt;Sun Labs Lively Kernel&lt;/a&gt;&lt;/p&gt; &lt;h3&gt;Más enlaces&lt;/h3&gt; &lt;p&gt;Para todos los que les gusta explorar los lenguajes de programación, sus paradigmas, ideas y futuro, algunos enalces recolectados en estos días:&lt;/p&gt; &lt;p&gt;&lt;a title="JAOO 2007- Gilad Bracha - Computational Theology, Functional versus Imperative, Language History" href="http://channel9.msdn.com/posts/Charles/JAOO-2007-Gilad-Bracha-Computational-Theology-Functional-versus-Imperative-Language-History-and/"&gt;JAOO 2007- Gilad Bracha - Computational Theology, Functional versus Imperative, Language History&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;a title="Ted Neward- On Java and .NET, Software Academics versus Practioners, General Purpose Programming" href="http://channel9.msdn.com/posts/Charles/Ted-Neward-On-Java-and-NET-Software-Academics-versus-Practioners-General-Purpose-Programming-Lan/"&gt;Ted Neward- On Java and .NET, Software Academics versus Practioners, General Purpose Programming&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;a title="Prolog just blew my mind!" href="http://metacircular.wordpress.com/2008/09/23/prolog-just-blew-my-mind/"&gt;Prolog just blew my mind!&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;a title="Dynamic programming futures InfoWorld Analysis 2008-10-13 By Peter Wayner" href="http://www.infoworld.com/article/08/10/13/42TC-dynamic-futures_1.html"&gt;Dynamic programming futures InfoWorld Analysis 2008-10-13 By Peter Wayner&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;a title="Erik Meijer, Gilad Bracha, Mads Torgersen- Perspectives on Programming Language Design and Evolu" href="http://channel9.msdn.com/shows/Going+Deep/Erik-Meijer-Gilad-Bracha-Mads-Torgersen-Perspectives-on-Programming-Language-Design-and-Evolution/"&gt;Erik Meijer, Gilad Bracha, Mads Torgersen- Perspectives on Programming Language Design and Evolu&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;a title="Dynamic Languages vs Static Verification - Greg Young [MVP]" href="http://codebetter.com/blogs/gregyoung/archive/2008/05/23/dynamic-languages-vs-static-verification.aspx"&gt;Dynamic Languages vs Static Verification - Greg Young [MVP]&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;a title="Joe Gregorio BitWorking JavaScript is the new Smalltalk" href="http://bitworking.org/news/290/JavaScript-is-the-new-Smalltalk"&gt;Joe Gregorio BitWorking JavaScript is the new Smalltalk&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;a title="ST2JS - Smalltalk to Javascript translator" href="http://map.squeak.org/package/11637941-682d-4ce3-bd4c-ba67afef47b5"&gt;ST2JS - Smalltalk to Javascript translator&lt;/a&gt;&amp;nbsp;(el trabajo de nuestro argentino Diego Gomez Deck)&lt;/p&gt; &lt;p&gt;&lt;a href="http://astares.blogspot.com/2008/09/google-chrome-javascript-and-smalltalk.html" target="_blank"&gt;Google Chrome, JavaScript and Smalltalk&lt;/a&gt;&lt;/p&gt; &lt;p&gt;La preparación de esta charla, me movió a escribir y actualizar algo de código de mini intérpretes que estoy armando. Pueden ver el estado actual en:&lt;/p&gt; &lt;p&gt;&lt;a href="http://code.google.com/p/ajbasic"&gt;http://code.google.com/p/ajbasic&lt;/a&gt; Intérprete, con sintaxis AjBasic y ahora también AjSharp&lt;br /&gt;&lt;a href="http://code.google.com/p/ajlisp"&gt;http://code.google.com/p/ajlisp&lt;/a&gt;&amp;nbsp;Intérprete Lisp, bastante terminado&lt;br /&gt;&lt;a href="http://code.google.com/p/ajtalk"&gt;http://code.google.com/p/ajtalk&lt;/a&gt;&amp;nbsp;Intérprete bytecodes a la Smalltalk, más adelante podría compilarse&lt;br /&gt;&lt;a href="http://code.google.com/p/ajfunc"&gt;http://code.google.com/p/ajfunc&lt;/a&gt;&amp;nbsp;Idem, pero orientado a la F#&lt;br /&gt;&lt;a href="http://code.googe.com/p/ajlogo"&gt;http://code.googe.com/p/ajlogo&lt;/a&gt; &amp;nbsp;El lenguaje Logo siempre es interesante de investigar&lt;/p&gt; &lt;p&gt;Bueno, como siempre, los enlaces de estos temas, que colecciono, desde:&lt;/p&gt; &lt;p&gt;&lt;a href="http://delicious.com/ajlopez/dlr"&gt;http://delicious.com/ajlopez/dlr&lt;/a&gt;&lt;br /&gt;&lt;a href="http://delicious.com/ajlopez/javascript"&gt;http://delicious.com/ajlopez/javascript&lt;/a&gt;&lt;br /&gt;&lt;a href="http://delicious.com/ajlopez/programminglanguages"&gt;http://delicious.com/ajlopez/programminglanguages&lt;/a&gt;&lt;br /&gt;&lt;a href="http://delicious.com/ajlopez/functionalprogramming"&gt;http://delicious.com/ajlopez/functionalprogramming&lt;/a&gt;&lt;br /&gt;&lt;a title="http://delicious.com/ajlopez/ruby" href="http://delicious.com/ajlopez/ruby"&gt;http://delicious.com/ajlopez/ruby&lt;/a&gt;&lt;br /&gt;&lt;a href="http://delicious.com/ajlopez/prolog"&gt;http://delicious.com/ajlopez/prolog&lt;/a&gt;&lt;br /&gt;&lt;a href="http://delicious.com/ajlopez/lisp"&gt;http://delicious.com/ajlopez/lisp&lt;/a&gt;&lt;br /&gt;&lt;a href="http://delicious.com/ajlopez/smalltalk"&gt;http://delicious.com/ajlopez/smalltalk&lt;/a&gt;&lt;br /&gt;&lt;a href="http://delicious.com/ajlopez/logo"&gt;http://delicious.com/ajlopez/logo&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Nos leemos!&lt;/p&gt; &lt;p&gt;Angel &amp;quot;Java&amp;quot; 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=1650994" 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/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_26002300_243_3B00_n+Funcional/default.aspx">Programaci&amp;#243;n Funcional</category></item><item><title>Recursos de F# y Programación Funcional</title><link>http://msmvps.com/blogs/lopez/archive/2008/10/11/recursos-de-f-y-programaci-243-n-funcional.aspx</link><pubDate>Sat, 11 Oct 2008 15:53:45 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1650569</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=1650569</wfw:commentRss><comments>http://msmvps.com/blogs/lopez/archive/2008/10/11/recursos-de-f-y-programaci-243-n-funcional.aspx#comments</comments><description>&lt;p&gt;&lt;img style="margin:0px 20px 20px 0px;" src="http://www.ajlopez.com/images/articles/surfaceplot.png" align="left" alt="" /&gt; F# es un lenguaje funcional, creado por Microsoft. Implementado bajo el soporte de .NET CLR, es un lenguaje tipado, con acceso completo al framework de .NET. Hereda características de los lenguajes ML/OCaml, notablemente de este último, el soporte de clases y objetos. &lt;/p&gt; &lt;p&gt;F# nació dentro de Microsoft Research, siendo su principal creador Don Syme. Aunque es un lenguaje funciona, soporta programación de objetos, y no vive en solitario: puede llamarse desde otros lenguajes .NET y puede invocar a librerías escritas en otros lenguajes, lo cual le da una flexibilidad que otros lenguajes más &amp;quot;puros&amp;quot; no tiene. Despues de años de desarrollo, es un lenguaje maduro, que está ganando momento en la comunidad científica, y en otras, como la financiera, que necesitan manipular monedos y operar con fórmulas. Como puede acceder a todo .NET, puede aprovechar otras librerías, como muestra esta imagen, de un programa de demostración que viene en el paquete, donde F# accesde a DirectX desde .NET.&lt;/p&gt; &lt;p&gt;Cito algo de la promoción de Apress sobre el libro Expert F#:&lt;/p&gt; &lt;p&gt;&lt;em&gt;While inspired by OCaml, F# isn&amp;#39;t just another functional programming language. Drawing on many of the strengths of both OCaml and .NET, it&amp;#39;s a general–purpose language ideal for real–world development. F# integrates functional, imperative, and object–oriented programming styles so you can flexibly and elegantly solve programming problems, and brings .NET development alive with interactive execution. Whatever your background, you&amp;#39;ll find that F# is easy to learn, fun to use, and extraordinarily powerful. F# will help change the way you think about and go about programming.&lt;/em&gt;&lt;/p&gt; &lt;p&gt;Hay abundante información sobre el lenguaje. Este posts es una actualización de uno anterior, con enlaces, blogs, posts, recursos, libros, sobre este interesante lenguaje. Ya había publicado a fines del año pasado:&lt;/p&gt; &lt;p&gt;&lt;a title="Recursos de F#" href="http://msmvps.com/blogs/lopez/archive/2007/12/07/recursos-de-f.aspx"&gt;Recursos de F#&lt;/a&gt;&lt;/p&gt; &lt;h3&gt;Enlaces&lt;/h3&gt; &lt;p&gt;La primera página a visitar es la página madre de F# en Microsoft:&lt;/p&gt; &lt;p&gt;&lt;a title="Microsoft Research&amp;#39;s website for F#" href="http://research.microsoft.com/fsharp/fsharp.aspx"&gt;Microsoft Research&amp;#39;s website for F#&lt;/a&gt;&lt;br /&gt;&lt;a title="F# Manual" href="http://research.microsoft.com/fsharp/manual"&gt;F# Manual&lt;/a&gt;&lt;br /&gt;&lt;a title="F# Documentation" href="http://research.microsoft.com/projects/fsharp/manual/library.aspx"&gt;F# Documentation&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Hay blogs y foros en&lt;br /&gt;&lt;a title="hubFS- The place for F# - F# news, forums and blogs" href="http://cs.hubfs.net/"&gt;hubFS- The place for F# - F# news, forums and blogs&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Blogs personales de gente dedicada a F#:&lt;br /&gt;&lt;a title="Don Syme&amp;#39;s web log, a key source of information on F#" href="http://blogs.msdn.com/dsyme"&gt;Don Syme&amp;#39;s web log, a key source of information on F#&lt;/a&gt;&lt;br /&gt;&lt;a title="Robert Pickering&amp;#39;s blog" href="http://www.strangelights.com/blog/"&gt;Robert Pickering&amp;#39;s blog&lt;/a&gt;&lt;br /&gt;&lt;a title="Tomas Petricek" href="http://tomasp.net/blog/"&gt;Tomas Petricek&lt;/a&gt;&lt;br /&gt;&lt;a title="Granville Barnett&amp;#39;s blog" href="http://weblogs.asp.net/gbarnett"&gt;Granville Barnett&amp;#39;s blog&lt;/a&gt;&lt;br /&gt;&lt;a title="Luke Hoban&amp;#39;s blog" href="http://blogs.msdn.com/lukeh/"&gt;Luke Hoban&amp;#39;s blog&lt;/a&gt;&lt;br /&gt;&lt;a href="http://blogs.msdn.com/chrsmith/default.aspx" target="_blank"&gt;Chris Smith (F# Tester)&lt;/a&gt;&lt;br /&gt;&lt;a href="http://lorgonblog.spaces.live.com/" target="_blank"&gt;Brian McNamara (F# Dev)&lt;/a&gt;&lt;br /&gt;&lt;a href="http://blogs.msdn.com/jomo_fisher/default.aspx" target="_blank"&gt;Jomo Fisher (F# Dev)&lt;/a&gt;&lt;br /&gt;&lt;a href="http://blogs.msdn.com/andrewkennedy/default.aspx" target="_blank"&gt;Andrew Kennedy (MSR)&lt;/a&gt;&lt;br /&gt;&lt;a href="http://blogs.msdn.com/lucabol/default.aspx" target="_blank"&gt;Luca Bolognese (Managed Languages Principal PM)&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Harry Pierson ha escrito varios posts sobre programación funcional, no solo para F#, abarca también F#:&lt;br /&gt;&lt;a href="http://devhawk.net/CategoryView,category,Functional%2BProgramming.aspx" target="_blank"&gt;DevHawk Functional Programming category&lt;/a&gt;&lt;/p&gt; &lt;h3&gt;Posts y podcasts&lt;/h3&gt; &lt;p&gt;Algunos enlaces a posts (hay cientos en los enlaces de arriba), sólo para que tengan un primer encuentro con el lenguaje y su poder expresivo:&lt;/p&gt; &lt;p&gt;&lt;a title="Episode 18- Matt Podwysocki on F# and Functional Programming Herding Code" href="http://herdingcode.com/?p=45"&gt;Episode 18- Matt Podwysocki on F# and Functional Programming Herding Code&lt;/a&gt;&lt;br /&gt;Matt Podwysocki pone &amp;quot;fun&amp;quot; en programación &amp;quot;fun&amp;quot;cional, con F#.&lt;/p&gt; &lt;p&gt;&lt;a title="Concurrency on a single thread" href="http://cs.hubfs.net/blogs/hell_is_other_languages/archive/2008/08/03/6506.aspx"&gt;Concurrency on a single thread&lt;/a&gt;&lt;br /&gt;Usando expresiones F# asincrónicamente para escribir programas paralelos.&lt;/p&gt; &lt;p&gt;&lt;a title="F# September 2008 CTP Released" href="http://cs.hubfs.net/blogs/f_releases/archive/2008/09/05/6911.aspx"&gt;F# September 2008 CTP Released&lt;/a&gt;&lt;br /&gt;El último &amp;quot;release&amp;quot; CTP de septiembre.&amp;nbsp;&lt;/p&gt; &lt;p&gt;&lt;a title="F# Overview (I.) - Introduction Articles TomasP.Net" href="http://tomasp.net/articles/fsharp-i-introduction.aspx"&gt;F# Overview (I.) - Introduction Articles TomasP.Net&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;a title="Functional Understanding" href="http://devhawk.net/2007/12/05/Functional+Understanding.aspx"&gt;Functional Understanding&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;a title="Practical F# Parsing- The Parse Buffer" href="http://devhawk.net/2007/12/11/Practical+F+Parsing+The+Parse+Buffer.aspx"&gt;Practical F# Parsing- The Parse Buffer&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;a title="Play Ball Script in F#" href="http://devhawk.net/2008/03/04/Play+Ball+Script+In+F.aspx"&gt;Play Ball Script in F#&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;a title="Units of Measure in F#- Part Three, Generic Units" href="http://blogs.msdn.com/andrewkennedy/archive/2008/09/04/units-of-measure-in-f-part-three-generic-units.aspx"&gt;&lt;a title="Units of Measure in F#- Part One, Introducing Units" href="http://blogs.msdn.com/andrewkennedy/archive/2008/08/29/units-of-measure-in-f-part-one-introducing-units.aspx"&gt;Units of Measure in F#- Part One, Introducing Units&lt;/a&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;a title="The Weekly Source Code 34 - The Rise of F#" href="http://www.hanselman.com/blog/TheWeeklySourceCode34TheRiseOfF.aspx"&gt;The Weekly Source Code 34 - The Rise of F#&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Para escuchar&lt;/p&gt; &lt;p&gt;&lt;a title="Herding Code 18- Matthew Podwysocki on F# and Functional Programming" href="http://herdingcode.com/wp-content/uploads/HerdingCode-0018-Matthew-Podwysocki-on-F-Sharp-and-Functional-Programming.mp3"&gt;Herding Code 18- Matthew Podwysocki on F# and Functional Programming&lt;/a&gt;&lt;br /&gt;&lt;a title="Software Engineering Radio Episode 108 - Simon Peyton Jones on Functional Programming and Haskel" href="http://se-radio.net/podcast/2008-08/episode-108-simon-peyton-jones-functional-programming-and-haskell"&gt;Software Engineering Radio Episode 108 - Simon Peyton Jones on Functional Programming and Haskel&lt;/a&gt;&lt;br /&gt;&lt;a title=".NET Rocks Episode 310 - Simon Peyton Jones on Functional Programming and Haskell" href="http://www.dotnetrocks.com/default.aspx?showNum=310"&gt;.NET Rocks Episode 310 - Simon Peyton Jones on Functional Programming and Haskell&lt;/a&gt;&lt;/p&gt; &lt;h3&gt;Ejemplos&lt;/h3&gt; &lt;p&gt;Además de los ejemplos que vienen con el paquete de distribución, encontraran código para bajarse y probar en lás páginas de los libros mencionados más abajo. Además, tenemos:&lt;/p&gt; &lt;p&gt;&lt;a title="F# Samples - Home" href="http://www.codeplex.com/fsharpsamples"&gt;F# Samples - Home&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.strangelights.com/blog/archive/2008/05/04/1613.aspx" target="_blank"&gt;Ant Colony Simulation&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.codeplex.com/FsTest" target="_blank"&gt;FsTest&lt;/a&gt;&lt;br /&gt;&lt;a title="FsUnit" href="http://code.google.com/p/fsunit/"&gt;FsUnit&lt;/a&gt;&lt;/p&gt; &lt;h3&gt;Libros de F#&lt;/h3&gt; &lt;p&gt;Estoy leyendo los dos primeros, publico acá algo del resumen publicado por las editoriales para promocionarlos:&lt;/p&gt; &lt;p&gt;&lt;img src="http://www.apress.com/resource/bookcover/9781590597576?size=medium" align="left" alt="" /&gt; &amp;nbsp;&amp;nbsp;&lt;a title="Foundations of F#" href="http://www.apress.com/book/view/1590597575"&gt;Foundations of F#&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;em&gt;Every professional .NET programmer needs to learn about FP, and there&amp;#39;s no better way to do it than by learning F#--and no easier way to learn F# than from Foundations of F#. Written by F# evangelist Rob Pickering, this is an elegant, comprehensive introduction to all aspects of the language and an incisive guide to using F# for real-world professional development.&lt;/em&gt;  &lt;p&gt;&lt;em&gt;by Robert Pickering | ISBN-13: 978-1-59059-757-6 | Published May 2007 | 360pp.&lt;/em&gt;  &lt;p&gt;&lt;em&gt;&lt;/em&gt;&amp;nbsp;  &lt;p&gt;&lt;img src="http://www.apress.com/resource/bookcover/9781590598504?size=medium" align="left" alt="" /&gt; &amp;nbsp;&lt;a title="Expert F#" href="http://www.apress.com/book/view/1590598504"&gt;Expert F#&lt;/a&gt;  &lt;p&gt;&lt;em&gt;Written by F#&amp;#39;s inventor and two major contributors to its development, Expert F# is the authoritative, comprehensive, and in–depth guide to the language and its use. Designed to help others become experts, the first part of the book quickly yet carefully describes the F# language. The second part then carefully shows how to use F# elegantly for a wide variety of practical programming tasks.&lt;/em&gt;  &lt;p&gt;&lt;em&gt;by Don Syme, Adam Granicz, Antonio Cisternino | ISBN-13: 978-1-59059-850-4 | Published Dec 2007 | 609pp.&lt;/em&gt;  &lt;p&gt;Otro libro, de Jon Harrop:&amp;nbsp;  &lt;p&gt;&lt;a href="http://www.amazon.com/F-Scientists-Jon-Harrop/dp/0470242116/" target="_blank"&gt;F# for Scientists&lt;/a&gt;  &lt;p&gt;&lt;em&gt;F# for Scientists will bring you up to speed with basic syntax and programming language concepts. Written in a clear and concise style with practical and enlightening examples, this book is accessible and easy to understand. By reviewing the Visual Studio screen shots that illustrate compilation, debugging and interactive use, you will understand both the functional aspects of F# and the object-oriented task-based features that make F# so useful in practice.&lt;/em&gt;  &lt;h3&gt;Programación Funcional&lt;/h3&gt; &lt;p&gt;Si estamos interesados en la programación funcional en general, podemos visitar:&lt;/p&gt; &lt;p&gt;&lt;a title="Functional Programming for the Rest of Us" href="http://www.defmacro.org/ramblings/fp.html"&gt;Functional Programming for the Rest of Us&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;a title="Why Functional Programming Matters" href="http://www.math.chalmers.se/~rjmh/Papers/whyfp.html"&gt;Why Functional Programming Matters&lt;/a&gt;&amp;nbsp;un clásico de &lt;a title="John Hughes" href="http://en.wikipedia.org/wiki/John_Hughes_%28computer_scientist%29"&gt;John Hughes&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;a title="Why Haskell Matters" href="http://www.haskell.org/haskellwiki/Why_Haskell_matters"&gt;Why Haskell Matters&lt;/a&gt;&lt;/p&gt; &lt;p&gt;El &amp;quot;paper&amp;quot; clásico de Backus &lt;a title="backus.pdf" href="http://www.stanford.edu/class/cs242/readings/backus.pdf"&gt;backus.pdf&lt;/a&gt;. Backus fue el que puso de nuevo en el tapete a la programación funcional. Recuerdo mis tiempos de &amp;quot;jugar&amp;quot; con APL (A Programming Language).&lt;/p&gt; &lt;p&gt;Un &amp;quot;popurri&amp;quot; de enlaces:&lt;/p&gt; &lt;p&gt;&lt;a title="Are FP and OO Incompatible Syntactic Styles-" href="http://michaelfeathers.typepad.com/michael_feathers_blog/2008/05/are-fp-and-oo-i.html"&gt;Are FP and OO Incompatible Syntactic Styles-&lt;/a&gt;&lt;br /&gt;&lt;a title="A Gentle Introduction to Haskell, Version 98" href="http://www.haskell.org/tutorial/index.html"&gt;A Gentle Introduction to Haskell, Version 98&lt;/a&gt;&lt;br /&gt;&lt;a title="About Erlang" href="http://www.erlang.org/about.html"&gt;About Erlang&lt;/a&gt;&lt;br /&gt;&lt;a title="APL (programming language)" href="http://en.wikipedia.org/wiki/APL_(programming_language)"&gt;APL (programming language)&lt;/a&gt;&amp;nbsp;(uno de los primeros lenguajes con los que me topé)&lt;br /&gt;&lt;a title="An APL Compiler" href="http://web.engr.oregonstate.edu/~budd/Books/aplc/"&gt;An APL Compiler&lt;/a&gt;&amp;nbsp;(Timothy Budd no deja de escribir libros sobre implementación de lenguajes)&lt;br /&gt;&lt;a title="The Cat Programming Language" href="http://www.cat-language.com/"&gt;The Cat Programming Language&lt;/a&gt;&amp;nbsp;(Gracias a &lt;a href="http://weblogs.shockbyte.com.ar/rodolfof/Default.aspx" target="_blank"&gt;Rodolfo Finochietti&lt;/a&gt; por comentarme este lenguaje)&lt;br /&gt;&lt;a title="YouTube - Tangible Functional Programming" href="http://www.youtube.com/watch?v=faJ8N0giqzw&amp;amp;feature=related"&gt;YouTube - Tangible Functional Programming&lt;/a&gt;&lt;br /&gt;&lt;a title="Functional Programming Notables #1" href="http://codebetter.com/blogs/matthew.podwysocki/archive/2008/09/02/functional-programming-notables-1.aspx"&gt;Functional Programming Notables #1&lt;/a&gt;&amp;nbsp;(más enlaces a programación funcional)&lt;br /&gt;&lt;a title="The Little MLer" href="http://www.ccs.neu.edu/home/matthias/BTML/"&gt;The Little MLer&lt;/a&gt;&lt;br /&gt;&lt;a title="functional objects Felleisen" href="http://www.ccs.neu.edu/home/matthias/Presentations/ecoop2004.pdf"&gt;functional objects Felleisen&lt;/a&gt;&lt;br /&gt;&lt;a title="Erlang in Lisp" href="http://weblog.thatmattbone.com/search/label/erlang-in-lisp"&gt;Erlang in Lisp&lt;/a&gt;&lt;br /&gt;&lt;a title="Free Online Functional Programming Books -- FreeTechBooks.com" href="http://www.freetechbooks.com/functional-programming-f34.html"&gt;Free Online Functional Programming Books -- FreeTechBooks.com&lt;/a&gt;&lt;br /&gt;&lt;a title="The Expression Lemma" href="http://www.uni-koblenz.de/~laemmel/expression/long.pdf"&gt;The Expression Lemma&lt;/a&gt;&amp;nbsp;(muy math geek, teoría de categorías, programación funcional y LINQ!! Ideal para internarse una semana)&lt;br /&gt;&lt;a title="Chaitin&amp;#39;s construction" href="http://www.haskell.org/haskellwiki/Chaitin&amp;#39;s_construction"&gt;Chaitin&amp;#39;s construction&lt;/a&gt;&amp;nbsp;(también math-geeky, más teoría de categorías, Chaitin es argentino, como el mate)&lt;br /&gt;&lt;a title="On being stateful" href="http://www.bluebytesoftware.com/blog/2008/09/13/OnBeingStateful.aspx"&gt;On being stateful&lt;/a&gt;&lt;br /&gt;&lt;a title="The Glasgow Haskell Compiler" href="http://www.haskell.org/ghc/"&gt;The Glasgow Haskell Compiler&lt;/a&gt;&lt;br /&gt;&lt;a title="A Neighborhood of Infinity- You Could Have Invented Monads! (And Maybe" href="http://sigfpe.blogspot.com/2006/08/you-could-have-invented-monads-and.html"&gt;A Neighborhood of Infinity- You Could Have Invented Monads! (And Maybe&lt;/a&gt;&lt;br /&gt;&lt;a title="InfoQ- Domain Specific Languages in Erlang" href="http://www.infoq.com/articles/erlang-dsl"&gt;InfoQ- Domain Specific Languages in Erlang&lt;/a&gt;&lt;/p&gt; &lt;h3&gt;C# Funcional&lt;/h3&gt; &lt;p&gt;.NET y C# van adoptando con el tiempo algunos estilos funcionales. Todo lo que siempre quiso saber sobre programación funcional con C#, desde el post del bueno de Mattew Podwysocki:&lt;/p&gt; &lt;p&gt;&lt;a href="http://codebetter.com/blogs/matthew.podwysocki/archive/2008/10/07/richmond-code-camp-2008-2-recap.aspx" target="_blank"&gt;Richmond Code Camp 2008.2 - Functional C# Recap&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Otros enlaces:&lt;/p&gt; &lt;p&gt;&lt;a title="Functional C# Project" href="http://code.msdn.microsoft.com/FunctionalCSharp"&gt;Functional C# Project&lt;/a&gt;&lt;br /&gt;&lt;a title="Is C# Becoming a Functional Language- - Mads Torgersen" href="http://blogs.msdn.com/madst/archive/2007/01/23/is-c-becoming-a-functional-language.aspx"&gt;Is C# Becoming a Functional Language- - Mads Torgersen&lt;/a&gt;&lt;br /&gt;&lt;a title="Functional C# - Learn from F# and LINQ" href="http://codebetter.com/blogs/matthew.podwysocki/archive/2008/06/16/functional-c-learn-from-f-and-linq.aspx"&gt;Functional C# - Learn from F# and LINQ&lt;/a&gt;&lt;/p&gt; &lt;h3&gt;Mi Delicious&lt;/h3&gt; &lt;p&gt;Soy un adicto a Delicious, acá están&amp;nbsp;los tags que uso para estos temas:&lt;/p&gt;&lt;a title="http://delicious.com/ajlopez/fsharp" href="http://delicious.com/ajlopez/fsharp"&gt;http://delicious.com/ajlopez/fsharp&lt;/a&gt;&lt;br /&gt;&lt;a title="http://delicious.com/ajlopez/f%23" href="http://delicious.com/ajlopez/f%23"&gt;http://delicious.com/ajlopez/f%23&lt;/a&gt;&lt;br /&gt;&lt;a title="http://delicious.com/ajlopez/functionalprogramming" href="http://delicious.com/ajlopez/functionalprogramming"&gt;http://delicious.com/ajlopez/functionalprogramming&lt;/a&gt;&lt;br /&gt;&lt;a title="http://delicious.com/ajlopez/haskell" href="http://delicious.com/ajlopez/haskell"&gt;http://delicious.com/ajlopez/haskell&lt;/a&gt;&lt;br /&gt;&lt;a title="http://delicious.com/ajlopez/erlang" href="http://delicious.com/ajlopez/erlang"&gt;http://delicious.com/ajlopez/erlang&lt;/a&gt;  &lt;p&gt;Angel &amp;quot;Java&amp;quot; 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;br /&gt;&lt;a href="http://delicious.com/ajlopez"&gt;http://delicious.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=1650569" 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/F_2300_/default.aspx">F#</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/F+Sharp/default.aspx">F 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/Programaci_26002300_243_3B00_n+Funcional/default.aspx">Programaci&amp;#243;n Funcional</category></item></channel></rss>