<?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 : Smalltalk, Javascript</title><link>http://msmvps.com/blogs/lopez/archive/tags/Smalltalk/Javascript/default.aspx</link><description>Tags: Smalltalk, Javascript</description><dc:language>en</dc:language><generator>CommunityServer 2008.5 SP2 (Build: 40407.4157)</generator><item><title>Resoluciones del Nuevo Mes: Noviembre 2012</title><link>http://msmvps.com/blogs/lopez/archive/2012/11/07/resoluciones-del-nuevo-mes-noviembre-2012.aspx</link><pubDate>Wed, 07 Nov 2012 16:15:49 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1818911</guid><dc:creator>lopez</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/lopez/rsscomments.aspx?PostID=1818911</wfw:commentRss><comments>http://msmvps.com/blogs/lopez/archive/2012/11/07/resoluciones-del-nuevo-mes-noviembre-2012.aspx#comments</comments><description>&lt;p&gt;Revisión de &lt;a href="http://msmvps.com/blogs/lopez/archive/2012/10/02/resoluciones-del-nuevo-mes-octubre-2012.aspx"&gt;mis resoluciones de Octubre&lt;/a&gt;:&lt;/p&gt;  &lt;p&gt;- Dar una charla sobre lenguajes de programación en Javascript &lt;strong&gt;&lt;font color="#008000"&gt;[completo]&lt;/font&gt;&lt;/strong&gt; &lt;a href="http://www.youtube.com/watch?feature=player_embedded&amp;amp;v=khbun9jb2T8"&gt;ver video&lt;/a&gt;     &lt;br /&gt;- Dar una chalar sobre Node.js/Socket.IO, aplicaciones web de tiempo real &lt;strong&gt;&lt;font color="#008000"&gt;[completo]&lt;/font&gt;&lt;/strong&gt; &lt;a href="http://msmvps.com/blogs/lopez/archive/2012/11/01/node-js-express-y-socket-io-en-udadev-2012-cuenca-ecuador.aspx"&gt;ver post&lt;/a&gt;    &lt;br /&gt;- Trabajar en PythonSharp &lt;strong&gt;&lt;font color="#008000"&gt;[completo]&lt;/font&gt;&lt;/strong&gt; &lt;a href="https://github.com/ajlopez/PythonSharp"&gt;ver repo&lt;/a&gt;     &lt;br /&gt;- Trabajar en AjTalk para Java &lt;strong&gt;&lt;font color="#800000"&gt;[pendiente]&lt;/font&gt;&lt;/strong&gt;     &lt;br /&gt;- Trabajar en AjConsorSite &lt;font color="#800000"&gt;&lt;strong&gt;[parcial]&lt;/strong&gt;&lt;/font&gt;&lt;font color="#000000"&gt;&lt;strong&gt; &lt;/strong&gt;solo tuve demo y reuniones&lt;/font&gt;     &lt;br /&gt;- Trabajar en GameServer &lt;font color="#800000"&gt;&lt;strong&gt;[parcial] &lt;/strong&gt;&lt;font color="#000000"&gt;&lt;strong&gt;&lt;/strong&gt;solo tuve demo y reuniones&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;Adicionalmente, estuve trabajando en:&lt;/p&gt;  &lt;p&gt;- Actualizar mis ejemplos de Node.js &lt;strong&gt;&lt;font color="#008000"&gt;[completo]&lt;/font&gt;&lt;/strong&gt; &lt;a href="https://github.com/ajlopez/NodeSamples"&gt;ver repo&lt;/a&gt;     &lt;br /&gt;- Autómata celular en Javascript/Node.js &lt;strong&gt;&lt;font color="#008000"&gt;[completo]&lt;/font&gt;&lt;/strong&gt; &lt;a href="https://github.com/ajlopez/Cellular"&gt;ver repo&lt;/a&gt;     &lt;br /&gt;- Mejoras menores de &lt;a href="https://github.com/ajlopez/AjTalkJs"&gt;AjTalkJs&lt;/a&gt; y &lt;a href="https://github.com/ajlopez/AjLispJs"&gt;AjLispJs&lt;/a&gt;     &lt;br /&gt;- Comenzar mi Basic Script (para Javascript/Node.js) &lt;font color="#008000"&gt;&lt;strong&gt;[completo] &lt;/strong&gt;&lt;/font&gt;&lt;font color="#000000"&gt;&lt;a href="https://github.com/ajlopez/BasicScript"&gt;ver repo&lt;/a&gt;       &lt;br /&gt;- Comenzar a portar AjGroups (librería de grupos finitos) a Javascript/Node.js &lt;/font&gt;&lt;font color="#008000"&gt;&lt;strong&gt;[completo] &lt;/strong&gt;&lt;/font&gt;&lt;font color="#000000"&gt;&lt;a href="https://github.com/ajlopez/AjGroupsJs"&gt;ver repo&lt;/a&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#000000"&gt;Para este nuevo mes:&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#000000"&gt;- Trabajar en PythonSharp      &lt;br /&gt;- Dar una charla sobre Implementando Python, en PyCon 2012 Argentina       &lt;br /&gt;- Trabajar en AjTalk para Java       &lt;br /&gt;- Trabajar en AjTalk para Javascript       &lt;br /&gt;- Trabajar en BasicScript (quiero comenzar a usarlo para que se pueda definir la lógica de un juego ejemplo de mi GameServer)       &lt;br /&gt;- Comenzar páginas markdown con Tutorial de Java, en español&amp;#160; &lt;br /&gt;- Comenzar páginas markdown con Tutorial de Node.js en español&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#000000"&gt;Nos leemos!&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#000000"&gt;Angel “Java” Lopez      &lt;br /&gt;&lt;a href="http://www.ajlopez.com"&gt;http://www.ajlopez.com&lt;/a&gt;       &lt;br /&gt;&lt;a href="http://twitter.com/ajlopez"&gt;http://twitter.com/ajlopez&lt;/a&gt;&lt;/font&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1818911" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/lopez/archive/tags/Smalltalk/default.aspx">Smalltalk</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/Desarrollo+de+Software/default.aspx">Desarrollo de Software</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/Lenguajes+de+Programaci_26002300_243_3B00_n/default.aspx">Lenguajes de Programaci&amp;#243;n</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/Programaci_F300_n/default.aspx">Programación</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/Python/default.aspx">Python</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/Javascript/default.aspx">Javascript</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/Proyectos+de+C_26002300_243_3B00_digo+Abierto/default.aspx">Proyectos de C&amp;#243;digo Abierto</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/NodeJs/default.aspx">NodeJs</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/Desarrollo+de+Juegos/default.aspx">Desarrollo de Juegos</category></item><item><title>AjTalk en Javascript (1) Primeras Implementaciones desde 0</title><link>http://msmvps.com/blogs/lopez/archive/2012/03/23/ajtalk_2D00_in_2D00_javascript_2D00_1_2D00_first_2D00_implementations.aspx</link><pubDate>Fri, 23 Mar 2012 10:10:48 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1807813</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=1807813</wfw:commentRss><comments>http://msmvps.com/blogs/lopez/archive/2012/03/23/ajtalk_2D00_in_2D00_javascript_2D00_1_2D00_first_2D00_implementations.aspx#comments</comments><description>&lt;p&gt;Hace unos días, migré mi proyecto AjTalk de Google Code a mi cuenta en&amp;#160; GitHub:&lt;/p&gt;  &lt;p&gt;&lt;a href="https://github.com/ajlopez/AjTalk"&gt;https://github.com/ajlopez/AjTalk&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Vengo trabajando en él, en mis tiempos libros, debe ser desde el 2008. Está escrito en C# e implementa una máquina virtual Smalltalk, basada en bytecodes. Codificado en C# plano, debería probarlo en otras plataformas, pero seguro que Mono lo soporta. En el 2011 le agregué la capacidad de compilar código Smaltalk de fileouts a Javascript, que se pueden usar tanto en el browser como en Node.js. El domingo pasado me decidí a crear otro proyecto:&lt;/p&gt;  &lt;p&gt;&lt;a href="https://github.com/ajlopez/AjTalkJs"&gt;https://github.com/ajlopez/AjTalkJs&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;como code kata del día. Tiene otro “approach”: implementar una máquina virtual AjTalk, desde 0, directamente en Javascript. La idea es compilar código Smalltalk a métodos y bloques con bytecodes, y tener el intérprete de esos método. Tanto la base del Lexer, Compiler, Block, Execution Block están funcionando. El código de la implementación principal está en:&lt;/p&gt;  &lt;p&gt;&lt;a href="https://github.com/ajlopez/AjTalkJs/blob/master/lib/ajtalk.js"&gt;https://github.com/ajlopez/AjTalkJs/blob/master/lib/ajtalk.js&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;En esa implementación, estoy usando un método sendMessage que usa un “custom lookup” para ubicar el método que atiende un mensaje, de acuerdo a su “selector”, su nombre. Un fragmento de lib/ajtalk.js:&lt;/p&gt;  &lt;pre style="background-color:black;color:white;font-size:14px;"&gt;BaseObject.prototype.sendMessage = &lt;span style="color:orange;"&gt;function&lt;/span&gt;&lt;span style="color:cyan;"&gt;(&lt;/span&gt;selector&lt;span style="color:cyan;"&gt;,&lt;/span&gt; args&lt;span style="color:cyan;"&gt;)&lt;/span&gt;
&lt;span style="color:cyan;"&gt;{&lt;/span&gt;
    &lt;span style="color:orange;"&gt;var&lt;/span&gt; method = &lt;span style="color:orange;"&gt;this&lt;/span&gt;.lookup&lt;span style="color:cyan;"&gt;(&lt;/span&gt;selector&lt;span style="color:cyan;"&gt;);&lt;/span&gt;
    &lt;span style="color:orange;"&gt;return&lt;/span&gt; method.apply&lt;span style="color:cyan;"&gt;(&lt;/span&gt;&lt;span style="color:orange;"&gt;this&lt;/span&gt;&lt;span style="color:cyan;"&gt;,&lt;/span&gt; args&lt;span style="color:cyan;"&gt;);&lt;/span&gt;
&lt;span style="color:cyan;"&gt;};&lt;/span&gt;

&lt;span style="color:orange;"&gt;function&lt;/span&gt; BaseClass&lt;span style="color:cyan;"&gt;(&lt;/span&gt;name&lt;span style="color:cyan;"&gt;,&lt;/span&gt; instvarnames&lt;span style="color:cyan;"&gt;,&lt;/span&gt; clsvarnames&lt;span style="color:cyan;"&gt;,&lt;/span&gt; supercls&lt;span style="color:cyan;"&gt;)&lt;/span&gt; &lt;span style="color:cyan;"&gt;{&lt;/span&gt;
    &lt;span style="color:orange;"&gt;this&lt;/span&gt;.name = name&lt;span style="color:cyan;"&gt;;&lt;/span&gt;
    &lt;span style="color:orange;"&gt;this&lt;/span&gt;.instvarnames = instvarnames&lt;span style="color:cyan;"&gt;;&lt;/span&gt;
    &lt;span style="color:orange;"&gt;this&lt;/span&gt;.clsvarnames = clsvarnames&lt;span style="color:cyan;"&gt;;&lt;/span&gt;
    &lt;span style="color:orange;"&gt;this&lt;/span&gt;.supercls = supercls&lt;span style="color:cyan;"&gt;;&lt;/span&gt;
    &lt;span style="color:orange;"&gt;this&lt;/span&gt;.methods = &lt;span style="color:cyan;"&gt;{};&lt;/span&gt;
&lt;span style="color:cyan;"&gt;};&lt;/span&gt;

BaseClass.prototype.&lt;span style="color:cyan;"&gt;__&lt;/span&gt;proto&lt;span style="color:cyan;"&gt;__&lt;/span&gt; = BaseObject.prototype&lt;span style="color:cyan;"&gt;;&lt;/span&gt;

BaseClass.prototype.defineMethod = &lt;span style="color:orange;"&gt;function&lt;/span&gt; &lt;span style="color:cyan;"&gt;(&lt;/span&gt;selector&lt;span style="color:cyan;"&gt;,&lt;/span&gt; method&lt;span style="color:cyan;"&gt;)&lt;/span&gt; 
&lt;span style="color:cyan;"&gt;{&lt;/span&gt;
    &lt;span style="color:orange;"&gt;this&lt;/span&gt;.methods&lt;span style="color:cyan;"&gt;[&lt;/span&gt;selector&lt;span style="color:cyan;"&gt;]&lt;/span&gt; = method&lt;span style="color:cyan;"&gt;;&lt;/span&gt;
&lt;span style="color:cyan;"&gt;};&lt;/span&gt;

BaseClass.prototype.getInstanceSize = &lt;span style="color:orange;"&gt;function&lt;/span&gt;&lt;span style="color:cyan;"&gt;()&lt;/span&gt; &lt;span style="color:cyan;"&gt;{&lt;/span&gt;
    &lt;span style="color:orange;"&gt;var&lt;/span&gt; result = &lt;span style="color:orange;"&gt;this&lt;/span&gt;.instvarnames.length&lt;span style="color:cyan;"&gt;;&lt;/span&gt;
    &lt;span style="color:orange;"&gt;if&lt;/span&gt; &lt;span style="color:cyan;"&gt;(&lt;/span&gt;&lt;span style="color:orange;"&gt;this&lt;/span&gt;.supercls&lt;span style="color:cyan;"&gt;)&lt;/span&gt;
        result += &lt;span style="color:orange;"&gt;this&lt;/span&gt;.supercls.getInstanceSize&lt;span style="color:cyan;"&gt;();&lt;/span&gt;
        
    &lt;span style="color:orange;"&gt;return&lt;/span&gt; result&lt;span style="color:cyan;"&gt;;&lt;/span&gt;
&lt;span style="color:cyan;"&gt;};&lt;/span&gt;

BaseClass.prototype.lookupInstanceMethod = &lt;span style="color:orange;"&gt;function&lt;/span&gt; &lt;span style="color:cyan;"&gt;(&lt;/span&gt;selector&lt;span style="color:cyan;"&gt;)&lt;/span&gt; 
&lt;span style="color:cyan;"&gt;{&lt;/span&gt;
    &lt;span style="color:orange;"&gt;var&lt;/span&gt; result = &lt;span style="color:orange;"&gt;this&lt;/span&gt;.methods&lt;span style="color:cyan;"&gt;[&lt;/span&gt;selector&lt;span style="color:cyan;"&gt;];&lt;/span&gt;
    &lt;span style="color:orange;"&gt;if&lt;/span&gt; &lt;span style="color:cyan;"&gt;(&lt;/span&gt;result == null &lt;span style="color:cyan;"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span style="color:orange;"&gt;this&lt;/span&gt;.supercls&lt;span style="color:cyan;"&gt;)&lt;/span&gt;
        &lt;span style="color:orange;"&gt;return&lt;/span&gt; &lt;span style="color:orange;"&gt;this&lt;/span&gt;.supercls.lookupInstanceMethod&lt;span style="color:cyan;"&gt;(&lt;/span&gt;selector&lt;span style="color:cyan;"&gt;);&lt;/span&gt;
    &lt;span style="color:orange;"&gt;return&lt;/span&gt; result&lt;span style="color:cyan;"&gt;;&lt;/span&gt;
&lt;span style="color:cyan;"&gt;};&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;El lunes, se me ocurrió otra forma de hacerlo, que pensé que iba a tener dificultades: en vez de relegar la herencia a un “custom lookup”, podría aprovechar la cadena de prototipos para heredar métodos, e instancias por separado, para tener las variables de cada instancia. Escribí código en lib/ajtalknew.js:&lt;/p&gt;

&lt;pre style="background-color:black;color:white;font-size:14px;"&gt;&lt;span style="color:orange;"&gt;function&lt;/span&gt; createClass&lt;span style="color:cyan;"&gt;(&lt;/span&gt;name&lt;span style="color:cyan;"&gt;,&lt;/span&gt; superklass&lt;span style="color:cyan;"&gt;,&lt;/span&gt; instvarnames&lt;span style="color:cyan;"&gt;,&lt;/span&gt; clsvarnames&lt;span style="color:cyan;"&gt;)&lt;/span&gt;
&lt;span style="color:cyan;"&gt;{&lt;/span&gt;
    &lt;span style="color:orange;"&gt;var&lt;/span&gt; protoklass = &lt;span style="color:orange;"&gt;new&lt;/span&gt; Function&lt;span style="color:cyan;"&gt;();&lt;/span&gt;
    
    &lt;span style="color:orange;"&gt;if&lt;/span&gt; &lt;span style="color:cyan;"&gt;(&lt;/span&gt;superklass&lt;span style="color:cyan;"&gt;)&lt;/span&gt;
    &lt;span style="color:cyan;"&gt;{&lt;/span&gt;
        // Chain class prototypes
        protoklass.prototype.&lt;span style="color:cyan;"&gt;__&lt;/span&gt;proto&lt;span style="color:cyan;"&gt;__&lt;/span&gt; = superklass.proto&lt;span style="color:cyan;"&gt;;&lt;/span&gt;
    &lt;span style="color:cyan;"&gt;}&lt;/span&gt;
    &lt;span style="color:orange;"&gt;else&lt;/span&gt;
    &lt;span style="color:cyan;"&gt;{&lt;/span&gt;
        // First class methods
        protoklass.prototype.basicNew = &lt;span style="color:orange;"&gt;function&lt;/span&gt;&lt;span style="color:cyan;"&gt;()&lt;/span&gt;
        &lt;span style="color:cyan;"&gt;{&lt;/span&gt;
            &lt;span style="color:orange;"&gt;var&lt;/span&gt; obj = &lt;span style="color:orange;"&gt;new&lt;/span&gt; &lt;span style="color:orange;"&gt;this&lt;/span&gt;.func&lt;span style="color:cyan;"&gt;;&lt;/span&gt;
            obj.klass = &lt;span style="color:orange;"&gt;this&lt;/span&gt;&lt;span style="color:cyan;"&gt;;&lt;/span&gt;
            &lt;span style="color:orange;"&gt;return&lt;/span&gt; obj&lt;span style="color:cyan;"&gt;;&lt;/span&gt;
        &lt;span style="color:cyan;"&gt;}&lt;/span&gt;
        
        protoklass.prototype.defineSubclass = &lt;span style="color:orange;"&gt;function&lt;/span&gt;&lt;span style="color:cyan;"&gt;(&lt;/span&gt;name&lt;span style="color:cyan;"&gt;,&lt;/span&gt; instvarnames&lt;span style="color:cyan;"&gt;,&lt;/span&gt; clsvarnames&lt;span style="color:cyan;"&gt;)&lt;/span&gt;
        &lt;span style="color:cyan;"&gt;{&lt;/span&gt;
            &lt;span style="color:orange;"&gt;return&lt;/span&gt; createClass&lt;span style="color:cyan;"&gt;(&lt;/span&gt;name&lt;span style="color:cyan;"&gt;,&lt;/span&gt; &lt;span style="color:orange;"&gt;this&lt;/span&gt;&lt;span style="color:cyan;"&gt;,&lt;/span&gt; instvarnames&lt;span style="color:cyan;"&gt;,&lt;/span&gt; clsvarnames&lt;span style="color:cyan;"&gt;);&lt;/span&gt;
        &lt;span style="color:cyan;"&gt;}&lt;/span&gt;
        
        protoklass.prototype.defineMethod = &lt;span style="color:orange;"&gt;function&lt;/span&gt;&lt;span style="color:cyan;"&gt;(&lt;/span&gt;name&lt;span style="color:cyan;"&gt;,&lt;/span&gt; method&lt;span style="color:cyan;"&gt;)&lt;/span&gt;
        &lt;span style="color:cyan;"&gt;{&lt;/span&gt;
            &lt;span style="color:orange;"&gt;var&lt;/span&gt; mthname = name.replace&lt;span style="color:cyan;"&gt;(&lt;/span&gt;/:/g&lt;span style="color:cyan;"&gt;,&lt;/span&gt; &lt;span style="color:green;"&gt;&amp;#39;_&amp;#39;&lt;/span&gt;&lt;span style="color:cyan;"&gt;);&lt;/span&gt;
            &lt;span style="color:orange;"&gt;if&lt;/span&gt; &lt;span style="color:cyan;"&gt;(&lt;/span&gt;&lt;span style="color:orange;"&gt;typeof&lt;/span&gt; method == &lt;span style="color:green;"&gt;&amp;quot;function&amp;quot;&lt;/span&gt;&lt;span style="color:cyan;"&gt;)&lt;/span&gt;
                &lt;span style="color:orange;"&gt;this&lt;/span&gt;.func.prototype&lt;span style="color:cyan;"&gt;[&lt;/span&gt;mthname&lt;span style="color:cyan;"&gt;]&lt;/span&gt; = method&lt;span style="color:cyan;"&gt;;&lt;/span&gt;
            &lt;span style="color:orange;"&gt;else&lt;/span&gt;
                &lt;span style="color:orange;"&gt;this&lt;/span&gt;.func.prototype&lt;span style="color:cyan;"&gt;[&lt;/span&gt;mthname&lt;span style="color:cyan;"&gt;]&lt;/span&gt; = method.toFunction&lt;span style="color:cyan;"&gt;();&lt;/span&gt;
        &lt;span style="color:cyan;"&gt;}&lt;/span&gt;
        
        protoklass.prototype.defineClassMethod = &lt;span style="color:orange;"&gt;function&lt;/span&gt;&lt;span style="color:cyan;"&gt;(&lt;/span&gt;name&lt;span style="color:cyan;"&gt;,&lt;/span&gt; method&lt;span style="color:cyan;"&gt;)&lt;/span&gt;
        &lt;span style="color:cyan;"&gt;{&lt;/span&gt;
            &lt;span style="color:orange;"&gt;var&lt;/span&gt; mthname = name.replace&lt;span style="color:cyan;"&gt;(&lt;/span&gt;/:/g&lt;span style="color:cyan;"&gt;,&lt;/span&gt; &lt;span style="color:green;"&gt;&amp;#39;_&amp;#39;&lt;/span&gt;&lt;span style="color:cyan;"&gt;);&lt;/span&gt;
            &lt;span style="color:orange;"&gt;if&lt;/span&gt; &lt;span style="color:cyan;"&gt;(&lt;/span&gt;&lt;span style="color:orange;"&gt;typeof&lt;/span&gt; method == &lt;span style="color:green;"&gt;&amp;quot;function&amp;quot;&lt;/span&gt;&lt;span style="color:cyan;"&gt;)&lt;/span&gt;
                &lt;span style="color:orange;"&gt;this&lt;/span&gt;.proto&lt;span style="color:cyan;"&gt;[&lt;/span&gt;mthname&lt;span style="color:cyan;"&gt;]&lt;/span&gt; = method&lt;span style="color:cyan;"&gt;;&lt;/span&gt;
            &lt;span style="color:orange;"&gt;else&lt;/span&gt;
                &lt;span style="color:orange;"&gt;this&lt;/span&gt;.proto&lt;span style="color:cyan;"&gt;[&lt;/span&gt;mthname&lt;span style="color:cyan;"&gt;]&lt;/span&gt; = method.toFunction&lt;span style="color:cyan;"&gt;();&lt;/span&gt;
        &lt;span style="color:cyan;"&gt;}&lt;/span&gt;

        // TODO Quick hack. It should inherits from Object prototype
        protoklass.prototype.sendMessage = &lt;span style="color:orange;"&gt;function&lt;/span&gt;&lt;span style="color:cyan;"&gt;(&lt;/span&gt;selector&lt;span style="color:cyan;"&gt;,&lt;/span&gt; args&lt;span style="color:cyan;"&gt;)&lt;/span&gt;
        &lt;span style="color:cyan;"&gt;{&lt;/span&gt;
            &lt;span style="color:orange;"&gt;return&lt;/span&gt; &lt;span style="color:orange;"&gt;this&lt;/span&gt;&lt;span style="color:cyan;"&gt;[&lt;/span&gt;selector&lt;span style="color:cyan;"&gt;]&lt;/span&gt;.apply&lt;span style="color:cyan;"&gt;(&lt;/span&gt;&lt;span style="color:orange;"&gt;this&lt;/span&gt;&lt;span style="color:cyan;"&gt;,&lt;/span&gt; args&lt;span style="color:cyan;"&gt;);&lt;/span&gt;
        &lt;span style="color:cyan;"&gt;}&lt;/span&gt;
    &lt;span style="color:cyan;"&gt;}&lt;/span&gt;
    
    &lt;span style="color:orange;"&gt;var&lt;/span&gt; klass = &lt;span style="color:orange;"&gt;new&lt;/span&gt; protoklass&lt;span style="color:cyan;"&gt;;&lt;/span&gt;
    
    // Function &lt;span style="color:orange;"&gt;with&lt;/span&gt; prototype of &lt;span style="color:orange;"&gt;this&lt;/span&gt; klass instances
    klass.func = &lt;span style="color:orange;"&gt;new&lt;/span&gt; Function&lt;span style="color:cyan;"&gt;();&lt;/span&gt;
    klass.proto = protoklass.prototype&lt;span style="color:cyan;"&gt;;&lt;/span&gt;
    klass.name = name&lt;span style="color:cyan;"&gt;;&lt;/span&gt;
    klass.super = superklass&lt;span style="color:cyan;"&gt;;&lt;/span&gt;
    klass.instvarnames = instvarnames&lt;span style="color:cyan;"&gt;;&lt;/span&gt;
    klass.clsvarnames = clsvarnames&lt;span style="color:cyan;"&gt;;&lt;/span&gt;
    
    klass.func.prototype.klass = klass&lt;span style="color:cyan;"&gt;;&lt;/span&gt;
    
    &lt;span style="color:orange;"&gt;if&lt;/span&gt; &lt;span style="color:cyan;"&gt;(&lt;/span&gt;superklass&lt;span style="color:cyan;"&gt;)&lt;/span&gt; 
    &lt;span style="color:cyan;"&gt;{&lt;/span&gt;
        // Chaining instances prototypes
        klass.func.prototype.&lt;span style="color:cyan;"&gt;__&lt;/span&gt;proto&lt;span style="color:cyan;"&gt;__&lt;/span&gt; = superklass.func.prototype&lt;span style="color:cyan;"&gt;;&lt;/span&gt;
    &lt;span style="color:cyan;"&gt;}&lt;/span&gt;
    &lt;span style="color:orange;"&gt;else&lt;/span&gt; 
    &lt;span style="color:cyan;"&gt;{&lt;/span&gt;   
        // First instance methods
        klass.func.prototype.sendMessage = &lt;span style="color:orange;"&gt;function&lt;/span&gt;&lt;span style="color:cyan;"&gt;(&lt;/span&gt;selector&lt;span style="color:cyan;"&gt;,&lt;/span&gt; args&lt;span style="color:cyan;"&gt;)&lt;/span&gt;
        &lt;span style="color:cyan;"&gt;{&lt;/span&gt;
            &lt;span style="color:orange;"&gt;return&lt;/span&gt; &lt;span style="color:orange;"&gt;this&lt;/span&gt;&lt;span style="color:cyan;"&gt;[&lt;/span&gt;selector&lt;span style="color:cyan;"&gt;]&lt;/span&gt;.apply&lt;span style="color:cyan;"&gt;(&lt;/span&gt;&lt;span style="color:orange;"&gt;this&lt;/span&gt;&lt;span style="color:cyan;"&gt;,&lt;/span&gt; args&lt;span style="color:cyan;"&gt;);&lt;/span&gt;
        &lt;span style="color:cyan;"&gt;}&lt;/span&gt;
    &lt;span style="color:cyan;"&gt;}&lt;/span&gt;
    
    Smalltalk&lt;span style="color:cyan;"&gt;[&lt;/span&gt;name&lt;span style="color:cyan;"&gt;]&lt;/span&gt; = klass&lt;span style="color:cyan;"&gt;;&lt;/span&gt;
    
    &lt;span style="color:orange;"&gt;return&lt;/span&gt; klass&lt;span style="color:cyan;"&gt;;&lt;/span&gt;
&lt;span style="color:cyan;"&gt;}&lt;/span&gt;

createClass&lt;span style="color:cyan;"&gt;(&lt;/span&gt;&lt;span style="color:green;"&gt;&amp;#39;Object&amp;#39;&lt;/span&gt;&lt;span style="color:cyan;"&gt;);&lt;/span&gt;

Smalltalk.Object.defineClassMethod&lt;span style="color:cyan;"&gt;(&lt;/span&gt;&lt;span style="color:green;"&gt;&amp;#39;compileMethod:&amp;#39;&lt;/span&gt;&lt;span style="color:cyan;"&gt;,&lt;/span&gt; &lt;span style="color:orange;"&gt;function&lt;/span&gt;&lt;span style="color:cyan;"&gt;(&lt;/span&gt;text&lt;span style="color:cyan;"&gt;)&lt;/span&gt;
    &lt;span style="color:cyan;"&gt;{&lt;/span&gt;
        &lt;span style="color:orange;"&gt;var&lt;/span&gt; compiler = &lt;span style="color:orange;"&gt;new&lt;/span&gt; Compiler&lt;span style="color:cyan;"&gt;();&lt;/span&gt;
        &lt;span style="color:orange;"&gt;var&lt;/span&gt; method = compiler.compileMethod&lt;span style="color:cyan;"&gt;(&lt;/span&gt;text&lt;span style="color:cyan;"&gt;,&lt;/span&gt; &lt;span style="color:orange;"&gt;this&lt;/span&gt;&lt;span style="color:cyan;"&gt;);&lt;/span&gt;
        &lt;span style="color:orange;"&gt;this&lt;/span&gt;.defineMethod&lt;span style="color:cyan;"&gt;(&lt;/span&gt;method.name&lt;span style="color:cyan;"&gt;,&lt;/span&gt; method&lt;span style="color:cyan;"&gt;);&lt;/span&gt;
        &lt;span style="color:orange;"&gt;return&lt;/span&gt; method&lt;span style="color:cyan;"&gt;;&lt;/span&gt;
    &lt;span style="color:cyan;"&gt;});&lt;/span&gt;

Smalltalk.Object.defineClassMethod&lt;span style="color:cyan;"&gt;(&lt;/span&gt;&lt;span style="color:green;"&gt;&amp;#39;compileClassMethod:&amp;#39;&lt;/span&gt;&lt;span style="color:cyan;"&gt;,&lt;/span&gt; &lt;span style="color:orange;"&gt;function&lt;/span&gt;&lt;span style="color:cyan;"&gt;(&lt;/span&gt;text&lt;span style="color:cyan;"&gt;)&lt;/span&gt;
    &lt;span style="color:cyan;"&gt;{&lt;/span&gt;
        &lt;span style="color:orange;"&gt;var&lt;/span&gt; compiler = &lt;span style="color:orange;"&gt;new&lt;/span&gt; Compiler&lt;span style="color:cyan;"&gt;();&lt;/span&gt;
        &lt;span style="color:orange;"&gt;var&lt;/span&gt; method = compiler.compileMethod&lt;span style="color:cyan;"&gt;(&lt;/span&gt;text&lt;span style="color:cyan;"&gt;,&lt;/span&gt; &lt;span style="color:orange;"&gt;this&lt;/span&gt;&lt;span style="color:cyan;"&gt;);&lt;/span&gt;
        &lt;span style="color:orange;"&gt;this&lt;/span&gt;.defineClassMethod&lt;span style="color:cyan;"&gt;(&lt;/span&gt;method.name&lt;span style="color:cyan;"&gt;,&lt;/span&gt; method&lt;span style="color:cyan;"&gt;);&lt;/span&gt;
        &lt;span style="color:orange;"&gt;return&lt;/span&gt; method&lt;span style="color:cyan;"&gt;;&lt;/span&gt;
    &lt;span style="color:cyan;"&gt;});&lt;/span&gt;

    &lt;/pre&gt;

&lt;p&gt;Ok, es un poco “tricky” pero funciona!. Y ambos códigos fueron desarrollados con TDD, así que los refactors que hice fueron bien soportados y bienvenidos.&lt;/p&gt;

&lt;p&gt;Esta vez, no usé QUnit para TDD en el browser. Usé línea de comando, con Node.js, y su “built-in” módulo assert (no tenía conexión a Internet cuando comencé a escribir, así que no me traje en NodeUnit). Es una experiencia interesante, porque fue la forma más simple de escribir tests: un largo programa con assert tras otro. Puedo en cualquier momento refactorizarlo, pero no ví que me complicara mucho en el desarrollo: avancé tan rápido como cuando escribo tests más organizados.&lt;/p&gt;

&lt;p&gt;Tengo una función/”clase” javascript llamada Compilar que puede compilar código Smalltalk (un subconjunto de la gramática, por ahora) en bytecodes. Soporta mensajes unarios, binarios y de “keywords”. Sólo unos pocos bytecodes fueron necesarios para implementar la funcionalidad actual:&lt;/p&gt;

&lt;pre style="background-color:black;color:white;font-size:14px;"&gt;&lt;span style="color:orange;"&gt;var&lt;/span&gt; ByteCodes = &lt;span style="color:cyan;"&gt;{&lt;/span&gt;
    GetValue: 0&lt;span style="color:cyan;"&gt;,&lt;/span&gt;
    GetArgument: 1&lt;span style="color:cyan;"&gt;,&lt;/span&gt;
    GetLocal: 2&lt;span style="color:cyan;"&gt;,&lt;/span&gt;
    GetInstanceVariable: 3&lt;span style="color:cyan;"&gt;,&lt;/span&gt;
    GetGlobalVariable: 4&lt;span style="color:cyan;"&gt;,&lt;/span&gt;
    GetSelf: 5&lt;span style="color:cyan;"&gt;,&lt;/span&gt;
    SetLocal: 10&lt;span style="color:cyan;"&gt;,&lt;/span&gt;
    SetInstanceVariable: 11&lt;span style="color:cyan;"&gt;,&lt;/span&gt;
    SetGlobalVariable: 12&lt;span style="color:cyan;"&gt;,&lt;/span&gt;
    Add: 20&lt;span style="color:cyan;"&gt;,&lt;/span&gt;
    Subtract: 21&lt;span style="color:cyan;"&gt;,&lt;/span&gt;
    Multiply: 22&lt;span style="color:cyan;"&gt;,&lt;/span&gt;
    Divide: 23&lt;span style="color:cyan;"&gt;,&lt;/span&gt;
    SendMessage: 40&lt;span style="color:cyan;"&gt;,&lt;/span&gt;
    Return: 50
&lt;span style="color:cyan;"&gt;};&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;Hay ejemplos index.html, indexnew.html para probar interactivamente ambas implementaciones.&lt;/p&gt;

&lt;p&gt;Trabajo pendiente: implementar variables de clases, metaclases, como siempre usando TDD. Mejorar los ejemplos de browser, y escribir posts sobre todo eso.&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=1807813" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/lopez/archive/tags/Smalltalk/default.aspx">Smalltalk</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/Lenguajes+de+Programaci_26002300_243_3B00_n/default.aspx">Lenguajes de Programaci&amp;#243;n</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/AjTalk/default.aspx">AjTalk</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/Javascript/default.aspx">Javascript</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/Proyectos+de+C_26002300_243_3B00_digo+Abierto/default.aspx">Proyectos de C&amp;#243;digo Abierto</category></item><item><title>AjTalk y Javascript (Parte 2) Compilando una Clase Simple</title><link>http://msmvps.com/blogs/lopez/archive/2011/12/20/ajtalk_2D00_and_2D00_javascript_2D00_part_2D00_2_2D00_compiling_2D00_a_2D00_simple_2D00_class.aspx</link><pubDate>Tue, 20 Dec 2011 10:05:11 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1803832</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=1803832</wfw:commentRss><comments>http://msmvps.com/blogs/lopez/archive/2011/12/20/ajtalk_2D00_and_2D00_javascript_2D00_part_2D00_2_2D00_compiling_2D00_a_2D00_simple_2D00_class.aspx#comments</comments><description>&lt;p&gt;&lt;a href="http://msmvps.com/blogs/lopez/archive/2011/10/14/ajtalk_2D00_and_2D00_javascript_2D00_part_2D00_1_2D00_abstract_2D00_model.aspx"&gt;Post Anterior&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;En este post explicaré con un ejemplo simple cómo código Smalltalk puede ser compilado a Javascript usando el proyecto &lt;strong&gt;AjTalk.Compiler&lt;/strong&gt;, el nombre del ejecutable es &lt;strong&gt;ajtalkc&lt;/strong&gt;. El compilador está escrito desde cero en C#. La forma de compilar (la salida) fue fruto de investigar temas dinámicos de Javascript, y para Smalltalk en particular, leí los posts que mencioné en&amp;#160; &lt;a href="http://msmvps.com/blogs/lopez/archive/2011/09/23/smalltalk_2D00_and_2D00_javascript.aspx"&gt;Smalltalk y Javascript&lt;/a&gt; sin ver la implementación interna, sólo lo publicado en post. En cada proyecto trato de ver cómo implementar lo que quiero, sin “infectarme” de otras implementaciones, simplemente para ver hasta donde puedo llegar desde las ideas básicas. Y usando TDD, la implementación interna va surgiendo a medida que se va desarrollando.&lt;/p&gt;  &lt;p&gt;Como es usual, el código está en mi repo:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://code.google.com/p/ajtalk/"&gt;http://code.google.com/p/ajtalk/&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Yo hice “fileOut” de una clase simple de Pharo: &lt;strong&gt;Point&lt;/strong&gt;. El fragmento del principio:&lt;/p&gt;  &lt;pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,courier,monospace;font-size:12px;"&gt;Object subclass: #Point
	instanceVariableNames: &amp;#39;x y&amp;#39;
	classVariableNames: &amp;#39;&amp;#39;
	poolDictionaries: &amp;#39;&amp;#39;
	category: &amp;#39;Graphics-Primitives&amp;#39;!
!Point commentStamp: &amp;#39;&amp;lt;historical&amp;gt;&amp;#39; prior: 0!
I represent an x-y pair of numbers usually 
designating a location on the screen.!
!Point methodsFor: &amp;#39;*Polymorph-Geometry&amp;#39; stamp: &amp;#39;gvc 10/31/2006 11:01&amp;#39;!
directionToLineFrom: p1 to: p2
	&amp;quot;&lt;span style="color:#8b0000;"&gt;Answer the direction of the line from the receiver
&lt;/span&gt;	position.
	&amp;lt; 0 =&amp;gt; left (receiver to right)
	= =&amp;gt; on line
	&amp;gt; 0 =&amp;gt; right (receiver to left).&amp;quot;&lt;span style="color:#8b0000;"&gt;
&lt;/span&gt;	^((p2 x - p1 x) * (self y - p1 y)) -
		((self x - p1 x) * (p2 y - p1 y))! !
....&lt;/pre&gt;&lt;/pre&gt;

&lt;p&gt;Lo compilé usando el programa de comando de línea &lt;strong&gt;ajtalkc.exe&lt;/strong&gt; (vean el proyecto de consola &lt;strong&gt;AjTalk.Compiler&lt;/strong&gt; en la solución &lt;strong&gt;AjTalk&lt;/strong&gt;; tiene un directorio CodeFiles con varios fileouts):&lt;/p&gt;

&lt;p&gt;&lt;font size="2" face="Consolas"&gt;ajtalkc CodeFiles\PharoCorePoint.st&lt;/font&gt;&lt;/p&gt;

&lt;p&gt;Se crea un nuevo archivo: &lt;strong&gt;Program.js&lt;/strong&gt;. Exploremos cómo una clase Smalltalk puede ser representada en Javascript. Estas líneas definen la clase Point como una función Javascript, y su clase como otra función BLOCKED SCRIPT&lt;/p&gt;

&lt;pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,courier,monospace;font-size:12px;"&gt;&lt;span style="color:#0000ff;"&gt;function&lt;/span&gt; PointClass()
{
}
&lt;span style="color:#0000ff;"&gt;function&lt;/span&gt; Point()
{
}
&lt;/pre&gt;&lt;/pre&gt;

&lt;p&gt;Nada especial. Las siguientes dos líneas son:&lt;/p&gt;

&lt;pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,courier,monospace;font-size:12px;"&gt;Point.&lt;span style="color:#0000ff;"&gt;prototype&lt;/span&gt;.__class = PointClass.&lt;span style="color:#0000ff;"&gt;prototype&lt;/span&gt;;
Point.classPrototype = PointClass.&lt;span style="color:#0000ff;"&gt;prototype&lt;/span&gt;;
&lt;/pre&gt;&lt;/pre&gt;

&lt;p&gt;De esta manera, cada instancia de la clase &lt;strong&gt;Point&lt;/strong&gt; tiene una variable &lt;strong&gt;__class&lt;/strong&gt; que apunta al singleton &lt;strong&gt;PointClass.prototype&lt;/strong&gt;. Y la función/”clase”&amp;#160; &lt;strong&gt;Point&lt;/strong&gt; tiene una variable &lt;strong&gt;classPrototype&lt;/strong&gt; para apuntar al mismo singleton, si es necesario.&lt;/p&gt;

&lt;p&gt;¿Cómo creamos una nueva instancia de &lt;strong&gt;Point&lt;/strong&gt;? Usando un método de &lt;strong&gt;PointClass&lt;/strong&gt;, en este caso definiendo su método &lt;strong&gt;basicNew&lt;/strong&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,courier,monospace;font-size:12px;"&gt;PointClass.&lt;span style="color:#0000ff;"&gt;prototype&lt;/span&gt;[&amp;#39;_basicNew&amp;#39;] = &lt;span style="color:#0000ff;"&gt;function&lt;/span&gt;() { &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; Point(); };
&lt;/pre&gt;&lt;/pre&gt;

&lt;p&gt;Agregué un carácter _ para evitar la colisión de nombres con cualquier método Javascript. &lt;/p&gt;

&lt;p&gt;Ahora, ¿Cómo asegurar que todas las instancias tengan sus variables de instanca? Definiéndolas en su prototipo:&lt;/p&gt;

&lt;pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,courier,monospace;font-size:12px;"&gt;Point.&lt;span style="color:#0000ff;"&gt;prototype&lt;/span&gt;.x = &lt;span style="color:#0000ff;"&gt;null&lt;/span&gt;;
Point.&lt;span style="color:#0000ff;"&gt;prototype&lt;/span&gt;.y = &lt;span style="color:#0000ff;"&gt;null&lt;/span&gt;;
&lt;/pre&gt;&lt;/pre&gt;

&lt;p&gt;Y la parte más interesante: ¿Cómo traducir un método Javascript a Smalltalk? Sea el método &lt;strong&gt;min &lt;/strong&gt;en Smalltalk:&lt;/p&gt;

&lt;pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,courier,monospace;font-size:12px;"&gt;min
	&amp;quot;&lt;span style="color:#8b0000;"&gt;Answer a number that is the minimum
&lt;/span&gt;	of the x and y of the receiver.&amp;quot;&lt;span style="color:#8b0000;"&gt;
&lt;/span&gt;	^&lt;span style="color:#0000ff;"&gt;self&lt;/span&gt; x min: &lt;span style="color:#0000ff;"&gt;self&lt;/span&gt; y! !
&lt;/pre&gt;&lt;/pre&gt;

&lt;p&gt;Su traducción a un método del prototipo de &lt;strong&gt;Point&lt;/strong&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,courier,monospace;font-size:12px;"&gt;Point.&lt;span style="color:#0000ff;"&gt;prototype&lt;/span&gt;[&amp;#39;_min&amp;#39;] = &lt;span style="color:#0000ff;"&gt;function&lt;/span&gt;()
{
    &lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;self&lt;/span&gt; = &lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;;
    &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; send(send(&lt;span style="color:#0000ff;"&gt;self&lt;/span&gt;, &amp;#39;_x&amp;#39;), &amp;#39;_min_&amp;#39;, [send(&lt;span style="color:#0000ff;"&gt;self&lt;/span&gt;, &amp;#39;_y&amp;#39;)]);
};
&lt;/pre&gt;&lt;/pre&gt;

&lt;p&gt;Noten que definí la variable &lt;strong&gt;self&lt;/strong&gt; para ser usado por el resto del método (especialmente como variable libre en cualquier closure Javascript que encuentre, donde &lt;strong&gt;this&lt;/strong&gt; podría apuntar a otro objeto). Y el uso de un método ayudante &lt;strong&gt;send&lt;/strong&gt; que recibe: un objeto destino, el nombre del método a invocar, y un arreglo con sus argumentos.&lt;/p&gt;

&lt;p&gt;Todo esto es trabajo en progreso. Ahora, estoy generando las líneas adicionales para usar &lt;strong&gt;Program.js&lt;/strong&gt; desde Node.js (pueden ver el repo, con un ejemplo de Node.js), y también con otras líneas adicionales, usarlo desde el browser (ver el repo, ya hay un ejemplo cliente). Debería escribir diferentes compiladores para el server y el cliente, todos usando el mismo núcleo: el compilador de NodeJs ahora es una subclase del compilador básico de Javascript. Lo mismo el compilador para el browser. Tengo planeado compilar a Ruby. Todo esto es una prueba de concepto para mostrar el poder de tener un modelos abstracto del programa a ejecutar/compilar. Hasta podría usar ese modelo abstracto para ejecutar un programa, en lugar de compilar a bytecodes. O podría usar ese modelo abstracto, para compilar a bytecodes de AjTalk.&lt;/p&gt;

&lt;p&gt;Próximos temas a visitar en posts: opciones de compilación, ejemplo para el browser, ejemplo para Node.js. Cómo acceder desde el código generado a objectos Javascript. Las funciones utilitarias. Implementación de herencia, bloques y clausuras.&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=1803832" 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/Smalltalk/default.aspx">Smalltalk</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/Lenguajes+de+Programaci_26002300_243_3B00_n/default.aspx">Lenguajes de Programaci&amp;#243;n</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/AjTalk/default.aspx">AjTalk</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/Javascript/default.aspx">Javascript</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/Proyectos+de+C_26002300_243_3B00_digo+Abierto/default.aspx">Proyectos de C&amp;#243;digo Abierto</category></item><item><title>AjTalk y Javascript (Parte 1) El Modelo Abstracto</title><link>http://msmvps.com/blogs/lopez/archive/2011/10/14/ajtalk_2D00_and_2D00_javascript_2D00_part_2D00_1_2D00_abstract_2D00_model.aspx</link><pubDate>Fri, 14 Oct 2011 11:44:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1801213</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=1801213</wfw:commentRss><comments>http://msmvps.com/blogs/lopez/archive/2011/10/14/ajtalk_2D00_and_2D00_javascript_2D00_part_2D00_1_2D00_abstract_2D00_model.aspx#comments</comments><description>&lt;p&gt;&lt;a href="http://msmvps.com/blogs/lopez/archive/2011/12/20/ajtalk_2D00_and_2D00_javascript_2D00_part_2D00_2_2D00_compiling_2D00_a_2D00_simple_2D00_class.aspx"&gt;Post Siguiente&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Hace tres semanas escrib&amp;iacute; los posts:&lt;/p&gt;
&lt;p&gt;&lt;a target="_blank" href="http://ajlopez.wordpress.com/2011/09/22/smalltalk-and-javascript/"&gt;Smalltalk and Javascript&lt;/a&gt;    &lt;br /&gt;&lt;a target="_blank" href="http://msmvps.com/blogs/lopez/archive/2011/09/23/smalltalk_2D00_and_2D00_javascript.aspx"&gt;Smalltalk y Javascript&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Este a&amp;ntilde;o (2011) escribo un mont&amp;oacute;n de c&amp;oacute;digo Javascript, as&amp;iacute; que ya estoy m&amp;aacute;s entrenado en su uso. Como comentaba en los posts mencionados, estoy trabajando mi VM de c&amp;oacute;digo abierto &lt;a target="_blank" href="http://code.google.com/p/ajtalk/"&gt;AjTalk&lt;/a&gt; (implementada en C#) para que pueda generar c&amp;oacute;digo Javascript (s&amp;iacute;, yo tambi&amp;eacute;n! ;-). Este primer post est&amp;aacute; dedicado a describir el nuevo modelo abstracto que reside en el projecto de librer&amp;iacute;a de clases AjTalk.&lt;/p&gt;
&lt;p&gt;El AjTalk tradicional procesa y &amp;ldquo;parsea&amp;rdquo; c&amp;oacute;digo Smalltalk desde consola o archivos, lo arma en memoria (armando los m&amp;eacute;todos como secuencias de bytecods de la m&amp;aacute;quina virtual), y los puede ejecutar. Pero ahora, tengo un nuevo modelo abstracto en memoria. Vean, en la actual versi&amp;oacute;n, el Model:&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.ajlopez.com/images/articles2/ajtalkjs02.png" alt="" /&gt; &lt;/p&gt;
&lt;p&gt;La idea es tener representaciones en memoria de clases, m&amp;eacute;todos, expresiones. Algunas interfaces:&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.ajlopez.com/images/articles2/ajtalkjs03.png" alt="" /&gt; &lt;/p&gt;
&lt;p&gt;Hay varias clases que implementan IExpressio: SetExpression, ConstantExpression, MessageExpression, ArrayExpression, etc. La m&amp;aacute;s interesante, quiz&amp;aacute;s, es MessageExpression: representa c&amp;oacute;digo que tiene un receptor, un selector de mensaje y tiene a otras expresiones como par&amp;aacute;metros:&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Consolas;font-size:small;"&gt;a + b. &amp;ldquo;binary messages&amp;rdquo;      &lt;br /&gt;anObject doSomething. &amp;ldquo;unary messages&amp;rdquo;       &lt;br /&gt;anObject do: aParameter with: anotherParameter. &amp;ldquo;keyword messages&amp;rdquo;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;La clase ModelParser se encarga de leer un stream de chars y los convierte en el modelo abstracto en memoria:&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.ajlopez.com/images/articles2/ajtalkjs04.png" alt="" /&gt; &lt;/p&gt;
&lt;p&gt;En el estado actual del proyecto, pude procesar un file out de la clase Object de Squeak. Mi idea es procesar todas las clases del kernel de Squeak (jeje &amp;hellip; estoy un poco perezoso para escribir mi propia librer&amp;iacute;a ;-)&lt;/p&gt;
&lt;p&gt;Las principales clases del modelo abstracto:&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.ajlopez.com/images/articles2/ajtalkjs06.png" alt="" /&gt; &lt;/p&gt;
&lt;p&gt;CodeModel tiene una lista de elementos: cada &amp;ldquo;chunk&amp;rdquo; de c&amp;oacute;digo se parsea a memoria y es agregado a esta lista. Si un &amp;ldquo;chunk&amp;rdquo; representa la definici&amp;oacute;n de una nueva clase, se crea un nuevo objecto ClassModel para representarla. Por cada m&amp;eacute;tedo definido, se crea un objeto MethodModel.&lt;/p&gt;
&lt;p&gt;Ahora, puedo manipular esta representaci&amp;oacute;n abstracta en memoria. Quiero experimentar este modelo para usar un patr&amp;oacute;n Interpreter: evaluar las expresiones, DIRECTAMENTE usando este modelo abstracto, en vez de compilar a Bytecodes. Pero por ahora, el camino a explorar es usar el patr&amp;oacute;n Visitor para recorrer el modelo abstracto, mientras se lo va traduciendo a c&amp;oacute;digo BLOCKED SCRIPT&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.ajlopez.com/images/articles2/ajtalkjs05.png" alt="" /&gt; &lt;/p&gt;
&lt;p&gt;Estas son las clases que estoy escribiendo para este paso:&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.ajlopez.com/images/articles2/ajtalkjs07.png" alt="" /&gt; &lt;/p&gt;
&lt;p&gt;Vean que podr&amp;iacute;a implementar otros Visitor: puedo generar otro c&amp;oacute;digo (&amp;iquest;Ruby? &amp;iquest;otra forma de pasar a Javascrip? &amp;iquest;Dart? ;-) o, como escrib&amp;iacute; m&amp;aacute;s arriba, podr&amp;iacute;a ejecutar el c&amp;oacute;digo en memoria usando un patr&amp;oacute;n Interpreter, por ejemplo, haciendo que cada IExpression tenga un m&amp;eacute;todo Evaluate (usar un Visitor me parece algo extremo).&lt;/p&gt;
&lt;p&gt;El proyecto AjTalk.Compiler es una aplicaci&amp;oacute;n de consola que toma un archivo como par&amp;aacute;metro (por ejemplo, Object.st) y genera un archivo Program.js en Javascript. Parte del c&amp;oacute;digo generado luego de procesar el file out de Squeak de Object (Work in progress):&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.ajlopez.com/images/articles2/ajtalkjs01.png" alt="" /&gt; &lt;/p&gt;
&lt;p&gt;Ya saben: soy adicto a Twitter: as&amp;iacute; que qued&amp;oacute; capturado parte de mi TweetDeck en el rinc&amp;oacute;n de abajo a la derecha ;-). Tome el c&amp;oacute;digo de arriba y lo proces&amp;eacute; con Node.js sin errores (s&amp;oacute;lo define funciones, todav&amp;iacute;a no prob&amp;eacute; si la sem&amp;aacute;ntica es la correcta). Deber&amp;iacute;a implementar algunas primitivas (vean que en el c&amp;oacute;digo de arriba, las primitivas las genero como comentarios Javascript). Las estrategias que estoy usando para traducir elementos de Smalltalk a Javascript puede cambiar en el futuro cercano. Estoy experimentando distintas soluciones. &lt;/p&gt;
&lt;p&gt;Pr&amp;oacute;ximos temas: c&amp;oacute;mo implementar elementos de Smalltalk (clases, herencia, expresiones) en Javascript.&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=1801213" 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/AjTalk/default.aspx">AjTalk</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/Javascript/default.aspx">Javascript</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/Proyectos+de+C_26002300_243_3B00_digo+Abierto/default.aspx">Proyectos de C&amp;#243;digo Abierto</category></item><item><title>Smalltalk y Javascript</title><link>http://msmvps.com/blogs/lopez/archive/2011/09/23/smalltalk_2D00_and_2D00_javascript.aspx</link><pubDate>Fri, 23 Sep 2011 11:06:38 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1800069</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=1800069</wfw:commentRss><comments>http://msmvps.com/blogs/lopez/archive/2011/09/23/smalltalk_2D00_and_2D00_javascript.aspx#comments</comments><description>&lt;p&gt;Por décadas Smalltalk fue &amp;quot;la fragata bandera” de las ideas de objetos y clases implementadas en un lenguaje, ambiente de desarrollo e imagen viva. Pero ha sido un caso de “demasiado, y demasiado temprano”. Aparecieron Smalltalks diferentes, compañías que lo implementaban distintos, no había tanta comunicación en línea y masa crítica como para formar una comunidad que lo desarrollado. Se necesitaba mucho hardware, su ambiente de desarrollo era (y es) muy “lo hago a mi manera”, todo eso conspiró para que no llegara a la corriente principal de lenguajes usados hoy en día. Mientras tantos, nuevos lenguajes de los 90s (noten el paralelismo con el desarrollo de la web) aparecen Javascript hasta Ruby, tomando ideas de Smalltalk. Y son lenguajes más usados que Smalltalk. En este siglo, Javascript, Ruby, Python, CLR (la VM de .NET con varios lenguajes), JVM (la VM de java con scala, Groovy, Clojure (“look ma.. Lisp for the masses” ;-) siguen ganando momento. Con la emergencia de múltuples dispositivos, móbiles, tables, smart phones, distintos sistemas operativos, estos nuevos lenguajes están siendo desarrollados para ejecutar en muchos entornos diferentes. Y están soportados por una comunidad vibrante, con cantidad de buenos proyectos de código abierto que contribuyen a la popularidad y adopción de estas tecnologías. Vean como ejemplo a Node.js, una implementación en Javascript/Google V8 Engine del patrón reactor. Tiene cantidad de módulos que se montan sobre su implementación núcleo.&lt;/p&gt;  &lt;p&gt;Los Smalltalkers clásicos preferiran sus entornos, pero es una realidad que el código Smalltalk podría aprovecharse de los lenguajes, máquinas virtuales y librerías existentes. Un camino promisorio: compilar Smalltalk a Javascript, y conseguir el sueño “run everywhere”. (Noten que &lt;a href="http://clojure.org/"&gt;Clojure&lt;/a&gt; (special Lisp over JVM and CLR) tiene una nueva rama: &lt;a href="https://github.com/clojure/clojurescript"&gt;ClojureScript&lt;/a&gt; ver &lt;a href="https://github.com/clojure/clojurescript/wiki/Rationale"&gt;su rationale&lt;/a&gt;). Este post de hoy es una enumeración de proyectos que usan alguna variación de Smalltalk compilado a Javascript.&lt;/p&gt;  &lt;p&gt;Está el ST2JS (Smalltalk to Javascript translator):&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;ST2JS - Smalltalk to Javascript translator      &lt;br /&gt;&lt;a href="http://www.squeaksource.com/ST2JS/"&gt;http://www.squeaksource.com/ST2JS/&lt;/a&gt;&lt;/p&gt;    &lt;p&gt;ST2JS - Traductor de Smalltalk a JavaScript (Parte I) (Spanish)      &lt;br /&gt;&lt;a href="http://diegogomezdeck.blogspot.com/2006/07/st2js-traductor-de-smalltalk.html"&gt;http://diegogomezdeck.blogspot.com/2006/07/st2js-traductor-de-smalltalk.html&lt;/a&gt;&lt;/p&gt;    &lt;p&gt;ST2JS - Traductor de Smalltalk a JavaScript (Parte II) (Spanish)      &lt;br /&gt;&lt;a href="http://diegogomezdeck.blogspot.com/2006/07/st2js-traductor-de-smalltalk_28.html"&gt;http://diegogomezdeck.blogspot.com/2006/07/st2js-traductor-de-smalltalk_28.html&lt;/a&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Hay un Smalltalk Web Toolkit basado en el ST2JS (no pude encontrar el código fuente):&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;Smalltalk Web Toolkit (Smalltalks 2009)      &lt;br /&gt;&lt;a href="http://www.slideshare.net/garduino1/swt-2009"&gt;http://www.slideshare.net/garduino1/swt-2009&lt;/a&gt;&lt;/p&gt;    &lt;p&gt;Introducción a Smalltalk Web Toolkit (SWT) « CEIBO      &lt;br /&gt;&lt;a href="http://ceibo.wordpress.com/2008/01/06/introduccion-a-smalltalk-web-toolkit-swt/"&gt;http://ceibo.wordpress.com/2008/01/06/introduccion-a-smalltalk-web-toolkit-swt/&lt;/a&gt; (with detailed mini examples of Smalltak to Javascript translations, like closures, blocks, etc)&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Nicolas Petton tiene Amber (antes era JTalk), que crea archivos Javascript traduciendo código Smalltalk (tiene ejemplo ejecutando en Node.js):&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;ST 4U 133: Amber      &lt;br /&gt;&lt;a href="http://www.jarober.com/blog/blogView?entry=3493610269"&gt;http://www.jarober.com/blog/blogView?entry=3493610269&lt;/a&gt;&lt;/p&gt;    &lt;p&gt;NicolasPetton/amber - GitHub      &lt;br /&gt;&lt;a href="https://github.com/NicolasPetton/amber"&gt;https://github.com/NicolasPetton/amber&lt;/a&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Peter Fisk (creador VistaSmalltak, GWT Smalltalk, y ahora SilverSmalltalk) estuvo escribiendo Smalltalk usando Silverlight, herramientas de Google, y ahora, BLOCKED SCRIPT&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;Implementing Smalltalk’s Non-Local Returns in JavaScript « Silver Smalltalk      &lt;br /&gt;&lt;a href="http://silversmalltalk.wordpress.com/2011/02/02/implementing-smalltalks-non-local-returns-in-javascript/"&gt;http://silversmalltalk.wordpress.com/2011/02/02/implementing-smalltalks-non-local-returns-in-javascript/&lt;/a&gt;&lt;/p&gt;    &lt;p&gt;Smalltalk Classes in JavaScript « Silver Smalltalk      &lt;br /&gt;&lt;a href="http://silversmalltalk.wordpress.com/2011/02/02/smalltalk-classes-in-javascript/"&gt;http://silversmalltalk.wordpress.com/2011/02/02/smalltalk-classes-in-javascript/&lt;/a&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Vean el Lively Kernel, Javascript inspirado por Smalltalk, y JTalk (ahora Amber):&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;InfoQ: Smalltalk IDEs Come to the Browser: Jtalk, tODE, Lively Kernel 2.0      &lt;br /&gt;&lt;a href="http://www.infoq.com/news/2011/08/smalltalk-in-browser"&gt;http://www.infoq.com/news/2011/08/smalltalk-in-browser&lt;/a&gt;&lt;/p&gt;    &lt;p&gt;InfoQ: Dan Ingalls on the History of Smalltalk and the Lively Kernel      &lt;br /&gt;&lt;a href="http://www.infoq.com/interviews/ingalls-smalltalk"&gt;http://www.infoq.com/interviews/ingalls-smalltalk&lt;/a&gt;&lt;/p&gt;    &lt;p&gt;Lively Kernel      &lt;br /&gt;&lt;a href="http://en.wikipedia.org/wiki/Lively_Kernel"&gt;http://en.wikipedia.org/wiki/Lively_Kernel&lt;/a&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Hay una implementación de Smalltalk a Javascript, llamada S8, trabajo en progreso. Ver:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;Blog de Leo De Marco: Lanzamiento de S8 en Smalltalking      &lt;br /&gt;&lt;a href="http://leodemarco.blogspot.com/2011/09/lanzamiento-de-s8-en-smalltalking.html"&gt;http://leodemarco.blogspot.com/2011/09/lanzamiento-de-s8-en-smalltalking.html&lt;/a&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Y sí, adivinaron! Hay Smalltalk a Javascript (y espero, a otros lenguajes dinámicos) en mi &lt;a href="http://ajlopez.wordpress.com/category/ajtalk/"&gt;proyecto AjTalk&lt;/a&gt; (Work in Progress) (tengo que escribir post!). Estoy trabajando en cómo implementar algunas características como:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;doesNotUnderstand for JavaScript?      &lt;br /&gt;&lt;a href="http://stackoverflow.com/questions/3918920/doesnotunderstand-for-javascript"&gt;http://stackoverflow.com/questions/3918920/doesnotunderstand-for-javascript&lt;/a&gt;&lt;/p&gt;    &lt;p&gt;Is there an equivalent of the __noSuchMethod__ feature for properties, or a way to implement it in JS?      &lt;br /&gt;&lt;a href="http://stackoverflow.com/questions/2266789/is-there-an-equivalent-of-the-nosuchmethod-feature-for-properties-or-a-way-t"&gt;http://stackoverflow.com/questions/2266789/is-there-an-equivalent-of-the-nosuchmethod-feature-for-properties-or-a-way-t&lt;/a&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Mis enlaces:    &lt;br /&gt;&lt;a title="http://www.delicious.com/ajlopez/smalltalk+javascript" href="http://www.delicious.com/ajlopez/smalltalk+javascript"&gt;http://www.delicious.com/ajlopez/smalltalk+javascript&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Gracias a &lt;a href="http://twitter.com/garduino"&gt;@garduino&lt;/a&gt; por sus enlaces acerca de ST2JS y el Smalltalk Web Toolkit. Y a &lt;a href="http://twitter.com/leodmarco"&gt;@leodmarco&lt;/a&gt; por su post aclaratorio sobre S8.&lt;/p&gt;  &lt;p&gt;Se viene más Smalltalk a Javascript (&lt;a href="http://ajlopez.wordpress.com/category/ajtalk"&gt;usando AjTalk&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=1800069" 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/AjTalk/default.aspx">AjTalk</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/Javascript/default.aspx">Javascript</category></item></channel></rss>