<?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 : AjBasic</title><link>http://msmvps.com/blogs/lopez/archive/tags/AjBasic/default.aspx</link><description>Tags: AjBasic</description><dc:language>en</dc:language><generator>CommunityServer 2008.5 SP2 (Build: 40407.4157)</generator><item><title>CodeCamp en Buenos Aires: Intérpretes y Compiladores en .NET</title><link>http://msmvps.com/blogs/lopez/archive/2010/08/31/codecamp-en-buenos-aires-int-233-rpretes-y-compiladores-en-net.aspx</link><pubDate>Tue, 31 Aug 2010 09:21:16 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1776938</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=1776938</wfw:commentRss><comments>http://msmvps.com/blogs/lopez/archive/2010/08/31/codecamp-en-buenos-aires-int-233-rpretes-y-compiladores-en-net.aspx#comments</comments><description>&lt;p&gt;El próximo sábado tendremos CodeCamp en Buenos Aires:&lt;/p&gt;  &lt;p&gt;&lt;a title="http://www.codecamp.com.ar" href="http://www.codecamp.com.ar"&gt;http://www.codecamp.com.ar&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;img src="http://www.ajlopez.com/images/articles2/codecamp.jpg" alt="" /&gt; &lt;/p&gt;  &lt;p&gt;Les recomiendo una visita al blog (en la página principal) y a la agenda:&lt;/p&gt;  &lt;p&gt;&lt;a title="http://www.codecamp.com.ar/agenda.aspx" href="http://www.codecamp.com.ar/agenda.aspx"&gt;http://www.codecamp.com.ar/agenda.aspx&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;donde hay actividades y charlas desde la mañana hasta la tarde, sobre Azure, Entity Framework 4, .NET 4, Arquitectura de Software (por &lt;a href="http://twitter.com/MartinSalias" target="_blank"&gt;@MartinSalias&lt;/a&gt;), WPF, IronRuby, DynamicDataCenter, SQL Server, Silverlight, ASP.NET MVC, HyperV, WCF, SQL Azure, HTML5, Windows 7, y demos de las Células (vean por ejemplo el video de &lt;a href="http://www.codecamp.com.ar/sinerg%c3%ada-una-c%c3%a9lula-microsoft-con-todas-las-letras.aspx" target="_blank"&gt;Sinergia en una Célula Microsoft&lt;/a&gt;)&lt;/p&gt;  &lt;p&gt;Gracias a &lt;a href="http://twitter.com/masaez" target="_blank"&gt;@masaez&lt;/a&gt;, que me invitó al evento, en el Track 4 (16:35), Sala Arquitectura, daré una charla sobre Intérpretes y Compiladores en .NET. Los que me leen por aquí, saben que es uno de mis temas preferidos: construir lenguajes con distintos paradigmas de programación, y para usarlos en proyectos (como AjBasic en &lt;a href="http://msmvps.com/blogs/lopez/archive/tags/AjGenesis/default.aspx" target="_blank"&gt;AjGenesis&lt;/a&gt;). La charla es de 75 minutos, con preguntas y respuestas.&lt;/p&gt;  &lt;p&gt;Mi idea es visitar temas como:&lt;/p&gt;  &lt;p&gt;- Cómo construir un Intérprete, con pasos en detalle, usando TDD.   &lt;br /&gt;- Tokens, Lexer, Parser, Expresiones, Comandos    &lt;br /&gt;- Ejemplos de intérpretes, de distintos tipos de lenguajes, como &lt;a href="http://msmvps.com/blogs/lopez/archive/tags/AjSharp/default.aspx" target="_blank"&gt;AjSharp&lt;/a&gt;, &lt;a href="http://msmvps.com/blogs/lopez/archive/tags/AjTalk/default.aspx" target="_blank"&gt;AjTalk&lt;/a&gt; (bytecodes a la Smalltalk), &lt;a href="http://msmvps.com/blogs/lopez/archive/tags/AjLisp/default.aspx" target="_blank"&gt;AjLisp&lt;/a&gt; (más funcional), o &lt;a href="http://msmvps.com/blogs/lopez/archive/tags/AjIo/default.aspx" target="_blank"&gt;AjIo&lt;/a&gt;, tendré que elegir algunos.    &lt;br /&gt;- Comentar los lenguajes que han sido portados a .NET    &lt;br /&gt;- Descubrir IL (Intermediate Language) y generar código desde nuestros programas    &lt;br /&gt;- Ejemplo de AST (Abstract Syntax Tree)    &lt;br /&gt;- La aparición de los lambda. Compilación de Expressions    &lt;br /&gt;- Compilación dinámica de expressions    &lt;br /&gt;- Dynamic Runtime Library, ejemplos de lenguajes implementados    &lt;br /&gt;- Y espero transmitir algo de ¿por qué más lenguajes?&lt;/p&gt;  &lt;p&gt;Como siempre, el código, enlace, presentación que prepare, quedaran aquí publicados en próximo post.&lt;/p&gt;  &lt;p&gt;Nos leemos!&lt;/p&gt;  &lt;p&gt;Angel “Java” Lopez   &lt;br /&gt;&lt;a href="http://www.ajlopez.com"&gt;http://www.ajlopez.com&lt;/a&gt;    &lt;br /&gt;&lt;a href="http://twitter.com/ajlopez"&gt;http://twitter.com/ajlopez&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1776938" 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/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><category domain="http://msmvps.com/blogs/lopez/archive/tags/Programaci_26002300_243_3B00_n+Funcional/default.aspx">Programaci&amp;#243;n Funcional</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/AjSharp/default.aspx">AjSharp</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/Lisp/default.aspx">Lisp</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/TDD/default.aspx">TDD</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/AjTalk/default.aspx">AjTalk</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/Dynamic+Language+Runtime/default.aspx">Dynamic Language Runtime</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/AjIo/default.aspx">AjIo</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>Generación de Código, AjGenesis y AjBasic</title><link>http://msmvps.com/blogs/lopez/archive/2009/06/15/generaci-243-n-de-c-243-digo-ajgenesis-y-ajbasic.aspx</link><pubDate>Mon, 15 Jun 2009 16:09:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1695470</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=1695470</wfw:commentRss><comments>http://msmvps.com/blogs/lopez/archive/2009/06/15/generaci-243-n-de-c-243-digo-ajgenesis-y-ajbasic.aspx#comments</comments><description>&lt;p&gt;En el post que coment&amp;eacute; ayer&lt;/p&gt;
&lt;p&gt;&lt;a href="http://msmvps.com/blogs/lopez/archive/2007/08/02/sobre-la-generaci-243-n-de-c-243-digo.aspx"&gt;Sobre la generaci&amp;oacute;n de c&amp;oacute;digo&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;el comentador &lt;a href="http://emmanueloga.blogspot.com"&gt;Emmanuel&lt;/a&gt; escrib&amp;iacute;a:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Pregunta: Ya que tu apodo es &amp;quot;java&amp;quot; :), porque no utilizar StringTemplate en vez de crear tu propio generador?&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.stringtemplate.org/"&gt;http://www.stringtemplate.org/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://antlr.org/about.html"&gt;http://antlr.org/about.html&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;La respuesta es corta y es larga. Si vieron los ejemplos que he publicado, y c&amp;oacute;mo funciona AjGenesis:&lt;/p&gt;
&lt;li&gt;&lt;a href="http://msmvps.com/blogs/lopez/archive/tags/AjGenesis/default.aspx"&gt;AjGenesis&lt;/a&gt; (posts en espa&amp;ntilde;ol con ejemplos)&lt;/li&gt;
&lt;p&gt;sabr&amp;aacute;n que he implementado mi propio lenguaje interpretado AjBasic (con una implementaci&amp;oacute;n ahora separada en &lt;a href="http://code.google.com/p/ajbasic/"&gt;http://code.google.com/p/ajbasic/&lt;/a&gt;), que ahora est&amp;aacute; evolucionando a ser un lenguaje, con el mismo n&amp;uacute;cleo que el AjSharp:&lt;/p&gt;
&lt;p&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"&gt;AjSharp: un int&amp;eacute;rprete a la C Sharp, trabajo en progreso&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Tambi&amp;eacute;n est&amp;aacute; pensado que se pueda utilizar otro lenguaje para los templates:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://msmvps.com/blogs/lopez/archive/2006/10/02/Escribiendo-templates-de-AjGenesis-en-otros-lenguajes.aspx"&gt;Escribiendo templates de AjGenesis en otros lenguajes&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Pero hoy por hoy, se puede usar s&amp;oacute;lo AjBasic en la generaci&amp;oacute;n de c&amp;oacute;digo de AjGenesis. Lo adopt&amp;eacute;, porque pienso que el lenguaje de templates Y DE TAREAS (porque eso tiene AjGenesis, no s&amp;oacute;lo es templates, sino tambi&amp;eacute;n contiene c&amp;oacute;digo que organiza la generaci&amp;oacute;n de artefactos de textos), es tan fundamental en lo que quer&amp;iacute;a construir, que no pens&amp;eacute; en montarme sobre otro proyecto. Creo que, pasado el tiempo, ha sido una sabia decisi&amp;oacute;n. Veo que el proyecto actual, tengo un dominio total sobre algo que es parte del n&amp;uacute;cleo de AjGenesis.&lt;/p&gt;
&lt;p&gt;Recordemos que AjBasic se usa en las tareas. Y permite el uso de objetos din&amp;aacute;micos. Por ejemplo:&lt;/p&gt;
&lt;div id="codeSnippetWrapper"&gt;
&lt;div style="font-size:8pt;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;background-color:#f4f4f4;text-align:left;border-style:none;padding:0px;" id="codeSnippet"&gt;
&lt;pre style="font-size:8pt;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;background-color:white;text-align:left;border-style:none;padding:0px;"&gt;&lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;not&lt;/span&gt; Project.Title &lt;span style="color:#0000ff;"&gt;then&lt;/span&gt;&lt;/pre&gt;

&lt;pre style="font-size:8pt;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;background-color:#f4f4f4;text-align:left;border-style:none;padding:0px;"&gt;    Project.Title = Project.Name&lt;/pre&gt;

&lt;pre style="font-size:8pt;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;background-color:white;text-align:left;border-style:none;padding:0px;"&gt;&lt;span style="color:#0000ff;"&gt;end&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt;&lt;/pre&gt;

&lt;pre style="font-size:8pt;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;background-color:#f4f4f4;text-align:left;border-style:none;padding:0px;"&gt;&amp;nbsp;&lt;/pre&gt;

&lt;pre style="font-size:8pt;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;background-color:white;text-align:left;border-style:none;padding:0px;"&gt;&lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;not&lt;/span&gt; Project.Version &lt;span style="color:#0000ff;"&gt;then&lt;/span&gt;&lt;/pre&gt;

&lt;pre style="font-size:8pt;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;background-color:#f4f4f4;text-align:left;border-style:none;padding:0px;"&gt;    Project.Version = &lt;span style="color:#006080;"&gt;&amp;quot;1.0.*&amp;quot;&lt;/span&gt;&lt;/pre&gt;

&lt;pre style="font-size:8pt;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;background-color:white;text-align:left;border-style:none;padding:0px;"&gt;&lt;span style="color:#0000ff;"&gt;end&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Este ejemplo, tomado de una tarea t&amp;iacute;pica de los ejemplos que vienen incluidos con el sistema, muestra dos caracter&amp;iacute;sticas muy usadas: una, preguntar por Project.Title y si Project o Project.Title no est&amp;aacute;n definidos, eso vale falso para el if (una extensi&amp;oacute;n de ideas de lenguajes anteriores como PHP). Me evito preguntar por Nothing o cosas as&amp;iacute;. Y otra caracter&amp;iacute;stica: como Project es un objeto din&amp;aacute;mico, le puedo agregar propiedades en cualquier momento.&lt;/p&gt;
&lt;p&gt;Tambi&amp;eacute;n se le pueden sembrar, en el environment (entorno de valores definidos en el sistema en ejecuci&amp;oacute;n), objetos .NET &amp;ldquo;duros&amp;rdquo;, y el lenguaje los maneja por reflection.&lt;/p&gt;
&lt;p&gt;Esto es algo que todo lenguaje interpretado de hoy en d&amp;iacute;a deber&amp;iacute;a tener: explotaci&amp;oacute;n f&amp;aacute;cil y directa de cualquier framework de clases que lo sostenga. He programado AjBasic de tal forma que podr&amp;iacute;a reimplementarlo f&amp;aacute;cilmente en Java, usando entonces la librer&amp;iacute;a de clases de Java. Y tiene una estructura (int&amp;eacute;rprete que ejecuta un &amp;aacute;rbol abstracto), que puede reimplementarse en cualquier lenguaje en que sea necesario. Por ahora, no he visto la necesidad de hacerlo. Estas razones hacen que no me haya preocupado por compilarlo a bytecodes de la m&amp;aacute;quina virtual, usando CodeDom, o Emit, porque no es el n&amp;uacute;cleo de lo que estoy persiguiendo: no necesito velocidad, necesito flexibilidad.&lt;/p&gt;
&lt;p&gt;Otro peque&amp;ntilde;o e importante detalle:&lt;/p&gt;
&lt;div id="codeSnippetWrapper"&gt;
&lt;div style="font-size:8pt;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;background-color:#f4f4f4;text-align:left;border-style:none;padding:0px;" id="codeSnippet"&gt;
&lt;pre style="font-size:8pt;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;background-color:white;text-align:left;border-style:none;padding:0px;"&gt;&amp;nbsp;&lt;/pre&gt;

&lt;pre style="font-size:8pt;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;background-color:#f4f4f4;text-align:left;border-style:none;padding:0px;"&gt;include &lt;span style="color:#006080;"&gt;&amp;quot;Tasks/Build${Technology.Programming.Dialect}.ajg&amp;quot;&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Este tipo de instrucci&amp;oacute;n, de nuevo inspirado en PHP, permite la inclusi&amp;oacute;n din&amp;aacute;mica de c&amp;oacute;digo. Dependiendo de lo que diga el modelo de tecnolog&amp;iacute;a, puedo incluir en la ejecuci&amp;oacute;n a Tasks/BuildCSharp2.ajg o a Tasks/BuildJava.ajg o lo que sea, din&amp;aacute;micamente.&lt;/p&gt;
&lt;p&gt;Y en un proyecto actual, del que espero postear en breve, hasta puedo incluir en la expansi&amp;oacute;n de un archivo de template, a otro, din&amp;aacute;micamente:&lt;/p&gt;
&lt;div id="codeSnippetWrapper"&gt;
&lt;div style="font-size:8pt;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;background-color:#f4f4f4;text-align:left;border-style:none;padding:0px;" id="codeSnippet"&gt;
&lt;pre style="font-size:8pt;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;background-color:white;text-align:left;border-style:none;padding:0px;"&gt;&lt;span style="color:#0000ff;"&gt;Imports&lt;/span&gt; System&lt;/pre&gt;

&lt;pre style="font-size:8pt;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;background-color:#f4f4f4;text-align:left;border-style:none;padding:0px;"&gt;&lt;span style="color:#0000ff;"&gt;Imports&lt;/span&gt; System.Collections.Generic&lt;/pre&gt;

&lt;pre style="font-size:8pt;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;background-color:white;text-align:left;border-style:none;padding:0px;"&gt;&lt;span style="color:#0000ff;"&gt;Imports&lt;/span&gt; System.Text&lt;/pre&gt;

&lt;pre style="font-size:8pt;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;background-color:#f4f4f4;text-align:left;border-style:none;padding:0px;"&gt;&amp;nbsp;&lt;/pre&gt;

&lt;pre style="font-size:8pt;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;background-color:white;text-align:left;border-style:none;padding:0px;"&gt;&lt;span style="color:#0000ff;"&gt;Imports&lt;/span&gt; OakLeaf.MM.Main.Business&lt;/pre&gt;

&lt;pre style="font-size:8pt;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;background-color:#f4f4f4;text-align:left;border-style:none;padding:0px;"&gt;&lt;span style="color:#0000ff;"&gt;Imports&lt;/span&gt; OakLeaf.MM.Main.Collections&lt;/pre&gt;

&lt;pre style="font-size:8pt;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;background-color:white;text-align:left;border-style:none;padding:0px;"&gt;&lt;span style="color:#0000ff;"&gt;Imports&lt;/span&gt; OakLeaf.MM.Main.Data&lt;/pre&gt;

&lt;pre style="font-size:8pt;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;background-color:#f4f4f4;text-align:left;border-style:none;padding:0px;"&gt;&amp;nbsp;&lt;/pre&gt;

&lt;pre style="font-size:8pt;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;background-color:white;text-align:left;border-style:none;padding:0px;"&gt;Partial &lt;span style="color:#0000ff;"&gt;Public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;Class&lt;/span&gt; ${Table.SqlName}&lt;/pre&gt;

&lt;pre style="font-size:8pt;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;background-color:#f4f4f4;text-align:left;border-style:none;padding:0px;"&gt;    &lt;span style="color:#008000;"&gt;&amp;#39;&amp;#39;&amp;#39; &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;

&lt;pre style="font-size:8pt;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;background-color:white;text-align:left;border-style:none;padding:0px;"&gt;    &lt;span style="color:#008000;"&gt;&amp;#39;&amp;#39;&amp;#39; Hook method automatically executed from the mmBusinessObject constructor&lt;/span&gt;&lt;/pre&gt;

&lt;pre style="font-size:8pt;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;background-color:#f4f4f4;text-align:left;border-style:none;padding:0px;"&gt;    &lt;span style="color:#008000;"&gt;&amp;#39;&amp;#39;&amp;#39; &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;

&lt;pre style="font-size:8pt;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;background-color:white;text-align:left;border-style:none;padding:0px;"&gt;    &lt;span style="color:#008000;"&gt;&amp;#39;&amp;#39;&amp;#39; &amp;lt;remarks&amp;gt;&amp;lt;/remarks&amp;gt;&lt;/span&gt;&lt;/pre&gt;

&lt;pre style="font-size:8pt;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;background-color:#f4f4f4;text-align:left;border-style:none;padding:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;Protected&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;Overridable&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;Sub&lt;/span&gt; HookPartialConstructor()&lt;/pre&gt;

&lt;pre style="font-size:8pt;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;background-color:white;text-align:left;border-style:none;padding:0px;"&gt;        &lt;span style="color:#008000;"&gt;&amp;#39;&amp;#39; Place code here to be executed when the business object instantiates&lt;/span&gt;&lt;/pre&gt;

&lt;pre style="font-size:8pt;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;background-color:#f4f4f4;text-align:left;border-style:none;padding:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;End&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;Sub&lt;/span&gt;&lt;/pre&gt;

&lt;pre style="font-size:8pt;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;background-color:white;text-align:left;border-style:none;padding:0px;"&gt;&amp;nbsp;&lt;/pre&gt;

&lt;pre style="font-size:8pt;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;background-color:#f4f4f4;text-align:left;border-style:none;padding:0px;"&gt;&amp;lt;#&lt;/pre&gt;

&lt;pre style="font-size:8pt;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;background-color:white;text-align:left;border-style:none;padding:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; System.IO.File.Exists(&lt;span style="color:#006080;"&gt;&amp;quot;Templates/${Table.Name}PartialVb.tpl&amp;quot;&lt;/span&gt;) &lt;span style="color:#0000ff;"&gt;then&lt;/span&gt;&lt;/pre&gt;

&lt;pre style="font-size:8pt;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;background-color:#f4f4f4;text-align:left;border-style:none;padding:0px;"&gt;        include(&lt;span style="color:#006080;"&gt;&amp;quot;Templates/${Table.Name}PartialVb.tpl&amp;quot;&lt;/span&gt;)&lt;/pre&gt;

&lt;pre style="font-size:8pt;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;background-color:white;text-align:left;border-style:none;padding:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;end&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt;&lt;/pre&gt;

&lt;pre style="font-size:8pt;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;background-color:#f4f4f4;text-align:left;border-style:none;padding:0px;"&gt;#&amp;gt;        &lt;/pre&gt;

&lt;pre style="font-size:8pt;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;background-color:white;text-align:left;border-style:none;padding:0px;"&gt;&lt;span style="color:#0000ff;"&gt;End&lt;/span&gt; Class&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Y tengo m&amp;aacute;s usos para un lenguaje flexible, dentro de AjGenesis. La idea final, es usarlo para tomar decisiones, para convertir el proceso de generaci&amp;oacute;n, en un sistema experto. Algunas decisiones ya toma. Por ejemplo, dada un entidad X, que tiene relaciones con otras, puede decidir incluir una p&amp;aacute;gina de &amp;ldquo;ver entidad X&amp;rdquo; que tenga enlaces o directamente los datos de las entidades con las que se relaciona. O al ver que en el modelo hay entidades, y una de las entidades modela una persona, saber que para mostrar en algun lado (una lista desplegable, una grilla&amp;hellip;.) a qu&amp;eacute; persona estamos refiriendo, deber&amp;aacute; mostrar nombre, apellido, y tal vez alg&amp;uacute;n de legajo. O que si estoy armando una aplicaci&amp;oacute;n distribuida en Java, sepa deducir qu&amp;eacute; servicios web debo implementar, que DTOs hay que definir, seg&amp;uacute;n los casos de usos que est&amp;eacute;n descriptos en el modelo, y que escriba los ensambladores de esos DTOs.&lt;/p&gt;
&lt;p&gt;Esos sos ejemplos peque&amp;ntilde;os y grandes de decisiones. Pero la idea es ir avanzando en tener m&amp;aacute;s decisiones, y m&amp;aacute;s reglas, implementadas no con un r&amp;iacute;gido sistema de reglas forward chaining o backward chaining (que no lo descarto, de ah&amp;iacute; mi implementaci&amp;oacute;n de AjProlog en curso y de otras ideas), sino ir viendo de explorar la inserci&amp;oacute;n de decisiones en cualquier momento del proceso de generaci&amp;oacute;n de c&amp;oacute;digo.&lt;/p&gt;
&lt;p&gt;Otro ejemplo: en el proyecto en curso, un sistema real, se implement&amp;oacute; con AjBasic/AjGenesis una serie de reglas que examinan la base de datos de desarrollo, y detectan inconsistencias en los nombres de las columnas o relaciones de uno a muchos mal definidas. Y podemos seguir implementando m&amp;aacute;s reglas, que nos avisen de otros problemas.&lt;/p&gt;
&lt;p&gt;Por todo esto, es que no adopt&amp;eacute; un lenguaje de templates existente: AjGenesis necesitaba, desde su concepci&amp;oacute;n, un lenguaje que fuera m&amp;aacute;s que un lenguaje de templates. Esto me lo hizo ver mis primeros trabajos en el tema, en los 80, cuando implement&amp;eacute; algo parecido en C, pero con limitaciones. Y cuando le&amp;iacute; en estos a&amp;ntilde;os, el libro de &lt;a target="_blank" href="http://gendotnet.com/"&gt;Kathleen Dollard&lt;/a&gt;&amp;nbsp;&lt;a target="_blank" href="http://www.amazon.com/exec/obidos/ASIN/1590591372/qid%3D1103643269/sr%3D11-1/ref%3Dsr_11_1/104-5797382-2343919"&gt;Code Generation in Microsoft .NET&lt;/a&gt; donde ella no se animaba a implementar un lenguaje, y adoptaba uno existente, como XSLT sobre XML (mala elecci&amp;oacute;n), y luego en cada cap&amp;iacute;tulo, ten&amp;iacute;a que hacer malabares con el modelo, para poder conseguir alg&amp;uacute;n resultado, al leer eso, me decid&amp;iacute; por un lenguaje flexible.&lt;/p&gt;
&lt;p&gt;Y no tard&amp;eacute; mucho en construir el prototipo. Result&amp;oacute;, como muchas otras veces, divertido! :-)&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;br /&gt;&lt;a href="http://www.facebook.com/ajlopez"&gt;http://www.facebook.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=1695470" 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/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/Desarrollo+de+Software/default.aspx">Desarrollo de Software</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/AjGenesis/default.aspx">AjGenesis</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/AjBasic/default.aspx">AjBasic</category></item><item><title>AjSharp: un intérprete a la C Sharp, trabajo en progreso</title><link>http://msmvps.com/blogs/lopez/archive/2008/09/26/ajsharp-un-int-233-rprete-a-la-c-sharp-trabajo-en-progreso.aspx</link><pubDate>Fri, 26 Sep 2008 11:57:17 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1648960</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=1648960</wfw:commentRss><comments>http://msmvps.com/blogs/lopez/archive/2008/09/26/ajsharp-un-int-233-rprete-a-la-c-sharp-trabajo-en-progreso.aspx#comments</comments><description>&lt;p&gt;El pasado mes publiqué un proyecto en Google code:&lt;/p&gt; &lt;p&gt;&lt;a title="http://code.google.com/p/ajbasic/" href="http://code.google.com/p/ajbasic/"&gt;http://code.google.com/p/ajbasic/&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Es un intérprete AjBasic, escritbo en VB.NET. El código es la evolución de mi trabajo previo, para mi proyecto de generación de código &lt;a href="http://www.ajlopez.com/ajgenesis" target="_blank"&gt;AjGenesis&lt;/a&gt;. En esta nueva versión, el intérprete fue separado en un proyecto aparte, y la gramática de AjBasic y su compilador residen en otro proyecto.&lt;/p&gt; &lt;p&gt;Esa forma de trabajo permite escribir otra gramática y compilador, usando como salida el mismo intérprete núcleo. Así nace AjSharp: pueden bajarlo del mismo repositorio de código de AjBasic.&lt;/p&gt; &lt;h3&gt;La solución&lt;/h3&gt; &lt;p&gt;&lt;img style="margin:0px 20px 20px 0px;" src="http://www.ajlopez.com/images/articles/ajsharpsln01.png" align="left" alt="" /&gt;Tiene varios proyectos. El proyecto &lt;strong&gt;AjInterpreter&lt;/strong&gt; es exactamente el mismo que en la solución AjBasic. Así, ambas soluciones comparten la misma implementación núcleo de sus primitivas. &lt;/p&gt; &lt;p&gt;El proyecto &lt;strong&gt;AjSharp&lt;/strong&gt; contiene el nuevo compilador, que reconoc código AjSharp, como:&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:30be392c-fcc3-420e-9390-b6784200b558" 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;printline &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;Hello World&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;p&gt;Hay algunos verbos, tomados de AjBasic, como&amp;nbsp; &lt;strong&gt;print&lt;/strong&gt; y &lt;strong&gt;printline&lt;/strong&gt;. Pero el resto de los verbos son más tipo C#. Mi plan es incluir estas nuevas versiones de AjBasic y AjSharp en el próximo release de AjGeesis, así los que escriban plantillas (templates) para AjGenesis puedan usar cualquiera de los dos lenguajes (está planeado usar un lenguaje .NET directamente, pero esa capacidad quedará para incluir en otra versión futura de AjGenesis).&lt;/p&gt;
&lt;p&gt;Como mencionaba en mis anteriores posts: 
&lt;p&gt;&lt;a title="AjBasic- un int&amp;eacute;rprete Basic de c&amp;oacute;digo abierto" href="http://msmvps.com/blogs/lopez/archive/2008/08/20/ajbasic-un-int-233-rprete-basic-de-c-243-digo-abierto.aspx"&gt;AjBasic- un intérprete Basic de código abierto&lt;/a&gt;&lt;br /&gt;&lt;a title="AjBasic- an open source Basic-like interpreter" href="http://ajlopez.wordpress.com/2008/08/19/ajbasic-an-open-source-basic-like-interpreter/"&gt;AjBasic- an open source Basic-like interpreter&lt;/a&gt; 
&lt;p&gt;AjBasic nació para soportar la generación de código en AjGenesis. Lo diseñé para manejar objetos .NET nativos, y también objetos dinámicos. Ahora, eso también está soportado en AjSharp. Un objeto dinámico es un objeto que no tiene una clase, pero que puede soportar nuevas propiedades, definidas en el momento (el ejemplo más cercano que puedo pensar como parecido, son los objetos Javascript). 
&lt;p&gt;Podemos escribir código en AjSharp como: 
&lt;p&gt;&lt;font face="Consolas"&gt;a.FirstName = “Adam“;&amp;nbsp;&lt;/font&gt; 
&lt;p&gt;&lt;font face="Consolas"&gt;a.LastName = “Doe“;&lt;/font&gt; 
&lt;p&gt;&lt;font face="Consolas"&gt;a.Age = 800;&lt;/font&gt; 
&lt;p&gt;No hace falta declarar la variable. El objeto se crea y se agrega la propiedad FirstName, en un solo comando (esta creación automática de objetos no está soportada en AjGenesis, todavía). 
&lt;p&gt;Podemos preguntar por la existencia de una propiedad: 
&lt;p&gt;&lt;font face="Consolas"&gt;if (a.LastName)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; printline &amp;quot;a&amp;nbsp;has last name&amp;quot;;&lt;br /&gt;else&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; printline &amp;quot;a hasn&amp;#39;t last name&amp;quot;;&lt;br /&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;Si la variable&amp;nbsp;&lt;strong&gt;a&lt;/strong&gt; no tiene un valor asignado (no existe), o si existe pero no tiene&amp;nbsp;propiedad&amp;nbsp;&lt;strong&gt;LastName&lt;/strong&gt;, la condición de arriba se evalúa a falso. Podemos preguntar por algo como &lt;strong&gt;foo.bar.anything&lt;/strong&gt; y si &lt;strong&gt;foo&lt;/strong&gt; no existe, no aparece ninguna excepción de referencia a null. El resultado completo de esa expresión será, no error, sino null, y en estos lenguajes, null es falso para una condición. 
&lt;p&gt;Podemos acceder a objetos .NET, también. Un ejemplo: 
&lt;p&gt;&lt;font face="Consolas"&gt;di = new System.IO.DirectoryInfo(&amp;quot;.&amp;quot;); &lt;/font&gt;
&lt;p&gt;&lt;font face="Consolas"&gt;foreach (fi in di.GetFiles()) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; printline System.String.Format(&amp;quot;File {0}&amp;quot;,fi.Name);&lt;br /&gt;} &lt;/font&gt;
&lt;h3&gt;El intérprete&lt;/h3&gt;
&lt;p&gt;El núcelo de AjBasic y AjSharp, es el proyecto AjInterpreter, una vista parcial: 
&lt;p align="center"&gt;&lt;img src="http://www.ajlopez.com/images/articles/ajsharpint01.png" alt="" /&gt;&lt;/p&gt;
&lt;p align="left"&gt;Tiene varios nodos definidos, que se usan para formar un árbol de evaluación. Ambos compiladores analizan texto, y lo conviernte a una representación de árbol de nodos AjInterpreter. Hay dos clases principales de esos objetos: Expressions y Commands. Un nodo expression puede ser evaluado, retornando un objeto arbitrario. Un nodo command es ejecutado. Ambas operaciones trabajan sobre un environment, que contiene las variables y sus valores asociados.&lt;/p&gt;
&lt;h3&gt;Los tests&lt;/h3&gt;
&lt;p&gt;El compilador, scanner y otros objetos auxiliares, fueron escritos con tests. En la versión publicada, los tests estan en verde: 
&lt;p align="center"&gt;&lt;img src="http://www.ajlopez.com/images/articles/ajsharptest01.png" alt="" /&gt; &lt;/p&gt;
&lt;h3&gt;Consola y GUI&lt;/h3&gt;
&lt;p align="left"&gt;&lt;strong&gt;AjSharp.Console&lt;/strong&gt; es un pequeño programa para probar código AjSharp. Podemos ejecutar archivos .ajs si los colocamos como argumentos, o ingresar comandos por la consola:&lt;/p&gt;
&lt;p align="left"&gt;&lt;img src="http://www.ajlopez.com/images/articles/ajsharpcon01.png" alt="" /&gt; &lt;/p&gt;
&lt;p align="left"&gt;&lt;strong&gt;AjSharp.GUI&lt;/strong&gt; is un &amp;quot;feo&amp;quot; programa, que sólo&amp;nbsp;muestra que podemos invocar al intérprete desde un programa WinForm:&lt;/p&gt;
&lt;p align="left"&gt;&lt;img src="http://www.ajlopez.com/images/articles/ajsharpgui01.png" alt="" /&gt; &lt;/p&gt;
&lt;h3&gt;Trabajo en progreso&lt;/h3&gt;
&lt;p align="left"&gt;El código actual de AjSharp (y de AjBasic) contiene nuevas características, como el soporte de try/catch/finally en los lenguajes.&lt;/p&gt;
&lt;p align="left"&gt;Todo este trabajo es trabajo en progreso. Próximos pasos:&lt;/p&gt;
&lt;p align="left"&gt;- Integrar AjBasic y AjSharp en la próxima versión de AjGenesis&lt;/p&gt;
&lt;p align="left"&gt;- Soporte para&amp;nbsp;System.Array en ambos intérpretes&lt;/p&gt;
&lt;p align="left"&gt;- Agregado de un comando for en AjBasic (hay un for each en ambos, y un for tipo C# en AjSharp)&lt;/p&gt;
&lt;p align="left"&gt;- Operadores de incremento y decremento&lt;/p&gt;
&lt;p align="left"&gt;- Y mil ideas más... ;-)&lt;/p&gt;
&lt;p align="left"&gt;Hay dos caminos en el futuro: portar este trabajo a Java, y/o integrar esto con el nuevo soporte de Dynamic Language de .NET. Pero por ahora, integración con AjGenesis es la prioridad. Y, debo confesarlo, este trabajo me divierte mucho.. ;-)&lt;/p&gt;
&lt;p align="left"&gt;Nos leemos!&lt;/p&gt;
&lt;p align="left"&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;p align="left"&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1648960" 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/AjBasic/default.aspx">AjBasic</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/AjSharp/default.aspx">AjSharp</category></item><item><title>AjBasic: un intérprete Basic de código abierto</title><link>http://msmvps.com/blogs/lopez/archive/2008/08/20/ajbasic-un-int-233-rprete-basic-de-c-243-digo-abierto.aspx</link><pubDate>Wed, 20 Aug 2008 10:59:50 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1645185</guid><dc:creator>lopez</dc:creator><slash:comments>8</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/lopez/rsscomments.aspx?PostID=1645185</wfw:commentRss><comments>http://msmvps.com/blogs/lopez/archive/2008/08/20/ajbasic-un-int-233-rprete-basic-de-c-243-digo-abierto.aspx#comments</comments><description>&lt;p&gt;Mi proyecto de generación de código &lt;a href="http://www.ajlopez.com/ajgenesis" target="_blank"&gt;AjGenesis&lt;/a&gt; usa un lenguaje interpretado para ejecutar tareas y expandir plantillas. El lenguaje fue bautizado AjBasic. Lo puede ver usado en todos los ejemplos que escribí para AjGenesis (más información en los &lt;a href="http://msmvps.com/blogs/lopez/archive/tags/AjGenesis/default.aspx" target="_blank"&gt;posts de AjGenesis&lt;/a&gt;). Hace unos años, había separado el códgio del intérprete del proyecto madre, pero nunca lo había publicado. Este fin de semana, estuve refactorizando el código, y ahora, el resultado de ese trabajo está publicado en:&lt;/p&gt; &lt;p&gt;&lt;a title="http://code.google.com/p/ajbasic/" href="http://code.google.com/p/ajbasic/"&gt;http://code.google.com/p/ajbasic/&lt;/a&gt;&lt;/p&gt; &lt;p align="center"&gt;&lt;img src="http://www.ajlopez.com/images/articles/ajbasic00.png" alt="" /&gt; &lt;/p&gt; &lt;p align="left"&gt;En mi opinión, Google Code es fácil de manejar. Al contrario de SourceForge y CodePlex, usa Subversion como repositorio de código. Uso el cliente Tortoise SVN para enviar los cambios. La gente de Google es gentil: pude crear varios proyectos, por ahora esta es la lista:&lt;/p&gt; &lt;p align="left"&gt;&lt;a href="http://code.google.com/p/ajlisp"&gt;http://code.google.com/p/ajlisp&lt;/a&gt;&amp;nbsp;(en buena forma, se pude comenzar a investigar)&lt;br /&gt;&lt;a href="http://code.google.com/p/ajtalk"&gt;http://code.google.com/p/ajtalk&lt;/a&gt;&amp;nbsp;(todavía en su infancia)&lt;/p&gt; &lt;p align="left"&gt;Más información en:&lt;/p&gt; &lt;p align="left"&gt;&lt;a title="AjLisp- un int&amp;eacute;rprete Lisp en .NET" href="http://msmvps.com/blogs/lopez/archive/2008/07/31/ajlisp-un-int-233-rprete-lisp-en-net.aspx"&gt;AjLisp- un intérprete Lisp en .NET&lt;/a&gt;&lt;br /&gt;&lt;a title="AjTalk- un int&amp;eacute;rprete tipo Smalltalk" href="http://msmvps.com/blogs/lopez/archive/2008/07/15/ajtalk-un-int-233-rprete-tipo-smalltalk.aspx"&gt;AjTalk- un intérprete tipo Smalltalk&lt;/a&gt;&lt;/p&gt; &lt;h3&gt;La Solución&lt;/h3&gt; &lt;p&gt;&lt;img style="margin:0px 20px 20px 0px;" src="http://www.ajlopez.com/images/articles/ajbasic04.png" align="left" alt="" /&gt;&amp;nbsp;La solución &lt;strong&gt;AjBasicWithTests&lt;/strong&gt; se compone de los proyectos:&lt;/p&gt; &lt;p&gt;&lt;strong&gt;AjBasic&lt;/strong&gt;: implementa el compilador y el tokenizador. El tokenizer separa el texto entrante en tokens. El compilador arma árboles abstractos a evaluar, desde esa entrada.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;AjInterpreter&lt;/strong&gt;: Un nuevo proyecto, no presente en el AjGenesis original. Contiene toto el soporte del árbol abstracto, sus nodos, el ambiente (environment) donde se almaceman los valores, y un evaluador de los programas. El manejo de objetos .NET, y de objetos dinámicos, están en este proyecto. Mi intención es continuar usando este proyecto para soportar otros lenguajes interpretados.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;AjBasic.Console&lt;/strong&gt;: Una simple consola para probar el intérprete.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;AjBasic.GUI&lt;/strong&gt;: Un simple (y feo) WinForm para probar el intérprete.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;AjBasic.Test&lt;/strong&gt;: Algunos tests, usando NUnit (hay otra solución &lt;strong&gt;AjBasic&lt;/strong&gt; que no incluye el proyecto de tests)&lt;/p&gt; &lt;p&gt;Todos los proyectos están escritos usando Visual Basic .NET. La solución fue compilada usando Visual Studio 2005. La consola y el proyecto GUI podrían ser usados como base, explican cómo usar el intérprete desde nuestra propia aplicación.&lt;/p&gt; &lt;p&gt;Hay varios puntos para discutir sobre la implemetación: merecerian otros posts. Por ahora,&amp;nbsp; exploremos algunas de las principales características del proyecto, en su estado actual. Luego,&amp;nbsp;escribiré una lista de ideas a explorar en futuras versiones.&lt;/p&gt; &lt;p&gt;Como mencioné, el lenguaje nació para soportar la generación de código desde AjGenesis. Yo lo diseñé para manejar objetos .NET nativos, así como objetos dinámicos. Pero ¿qué es un objeto dinámico? Es un objeto que no tiene clase asociada, pero que puede ser expandido con nuevas propiedades (el ejemplo más cercano que podría&amp;nbsp;mencionar ahora, son los objetos Javascript).&lt;/p&gt; &lt;p&gt;Así, podemos escribir código como:&lt;/p&gt; &lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:30521667-f166-4125-887a-00dfb2a18211" 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;a.FirstName &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;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;Adam&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
a.LastName &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;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;Doe&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
a.Age &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;800&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;No tenemos que declarar la variable. Podemos crear el objeto y agregar la propiedad FirstName en un comando (esta creación automática de objeto no está soportada en AjGenesis, aún, pero se puede crear un objeto del tipo DynamicObject con new).&lt;/p&gt;
&lt;p&gt;Podemos probar la existencia de una propiedad:&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:5ca73578-c895-434f-a2a6-3c336993d8d3" 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:#0000FF;"&gt;if&lt;/span&gt;&lt;span style="color:#000000;"&gt; a.LastName &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;then&lt;/span&gt;&lt;span style="color:#000000;"&gt;

&lt;/span&gt;&lt;span style="color:#008000;"&gt;&amp;#39;&lt;/span&gt;&lt;span style="color:#008000;"&gt; it has a LastName not nothing&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;else&lt;/span&gt;&lt;span style="color:#000000;"&gt;

...

&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;end&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;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Si la variable &lt;strong&gt;a&lt;/strong&gt; no tiene valor asignado, o si no tiene la propiedad &lt;strong&gt;LastName&lt;/strong&gt;, la condición de arriba es evaluada a falso. Podemos preguntar por algo como &lt;strong&gt;foo.bar.anything&lt;/strong&gt; y no se levanta una exception. El valor del resultado sería Nothing, que es evaluado y tomado por falso en una condición.&lt;/p&gt;
&lt;h3&gt;Los Tests&lt;/h3&gt;
&lt;p&gt;La solución no fue desarrollado usando TDD (Test-driven development). Escribí los tests despues del código, solo para estar seguro que la funcionalidad principal estuviera bien implementado, cumpliendo con lo que esperaba de cada método. No usé nombres descriptivos para los tests, pero me fueron muy útiles cuando encaré la refactorización de la solución completa:&lt;/p&gt;
&lt;p align="center"&gt;&lt;img src="http://www.ajlopez.com/images/articles/ajbasic01.png" alt="" /&gt; &lt;/p&gt;
&lt;p&gt;Podemos probar el lenguaje desde la consola &lt;strong&gt;AjBasic.Console&lt;/strong&gt;:&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.ajlopez.com/images/articles/ajbasic03.png" alt="" /&gt; &lt;/p&gt;
&lt;p&gt;y desde el WinForm &lt;strong&gt;AjBasic.GUI&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;img src="http://www.ajlopez.com/images/articles/ajbasic02.png" alt="" /&gt; &lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Ninguno de los dos es la &amp;quot;qué aplicación, que bruta...&amp;quot;, pero funcionan.... ;-)&lt;/p&gt;
&lt;h3&gt;Próximos Pasos&lt;/h3&gt;
&lt;p&gt;Hay varias ideas volando cerca de la neurona que me queda, y tengo que poner orden en mi cabeza. Algunos puntos, para que queden escritos:&lt;/p&gt;
&lt;p&gt;- Ahora que el núcleo del intérprete está separado del compilador basic, me gustaría escribir AjSharp, un intérprete con sintaxis C#. Entonces, podría ser agregado a AjGenesis, para escribir plantillas y tareas en ese lenguaje, que puede resultar más agradable para los programadores C#.&lt;/p&gt;
&lt;p&gt;- Agregar soporte de clases dinámicas y prototipos.&lt;/p&gt;
&lt;p&gt;- Refactorizar los tests&lt;/p&gt;
&lt;p&gt;- Escribir un manual mínimo, explicando el lenguaje y sus características&lt;/p&gt;
&lt;p&gt;- Extender el lenguaje para soportar valores &amp;quot;delayed&amp;quot; y &amp;quot;delayed evaluation&amp;quot; (quizás paralelismo).&lt;/p&gt;
&lt;p&gt;- La forma internal del intérprete podrías ser reescrita en Java&lt;/p&gt;
&lt;p&gt;- La opción de escribir un AST (Abstract Syntax Tree) que se acople al soporte de DLR (Dynamic Language Runtime) no me atrae, podría llevar mucho trabajo. Pero podría ser interesante para aprender sobre el soporte de DLR en .NET.&lt;/p&gt;
&lt;p&gt;- Usar el lenguaje como base para la programación de agentees distribuidos (un punto ambicioso, que merece mayor evaluación).&lt;/p&gt;
&lt;p&gt;Como es costumbre, me divertí mucho escribiendo este software.&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/en"&gt;http://www.ajlopez.com/en&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1645185" 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/AjBasic/default.aspx">AjBasic</category></item></channel></rss>