AjSharp: objetos y clases dinámicas

Estoy escribiendo un intérprete no tipado con sintaxis tipo C#, que bauticé AjSharp. Hace un tiempo escribí sobre este proyecto de código abierto en:

AjSharp Programming Language a C#-like Dynamic Language
AjSharp: un lenguaje dinámico en C#

Pueden bajarse la versión actual desde http://code.google.com/p/ajcodekatas en trunk/AjLanguage (AjLanguage define el árbol de ejecución del intérprete, AjSharp tiene un parser, un lenguaje definido para construir ese árbol; la idea es colocar otros parsers sobre AjLanguage, por ejemplo, AjBasic).

Ayer sábado, agregué una nueva característica, la definición de un objecto. Ya de antes, AjSharp soporta la definición de una clase dinámica:

class Person
{
  var Name;
  var Age;
  
  function AddYears(years) 
  {
    this.Age = this.Age + years;
  }
}





Pueden crear un objecto usando:



adam = new Person();
adam.AddYears(800);
adam.Name = "Adam";





El objeto creado es dinámico: se le pueden agregar variables de instancias y métodos, en cualquier momento:



adam.LastName = "unknown";
adam.EyeColor = "brown";
adam.SayHello = function() { PrintLine("Hello"); };





Pueden crear objetos, con esta notación, inicializando su estado:



adam = new Person() { FirstName = “Adam”, LastName = “Genesis”, Age = 800 };





Y hasta pueden definir un objeto sin tener una clase asociada:



dynobj = new { Name = “Adam”, Age = 800 };





Esto es equivalente a hacerlo más “programáticamente” así:



dynobj = new DynamicObject();
dynobj.FirstName = “Adam”;
dynobj.LastName = "Genesis”;
dynobj.Age = 800;
dynobj.FullName = function() { return FirstName + “ “ + LastName; }





Esto estaba implementado desde hace meses. Ayer agregué la notación:



object Adam
{
  var Name = "Adam";
  var Age = 700;
  
  function AddYears(years) 
  {
    this.Age = this.Age + years;
  }
}
Adam.AddYears(100);





donde se puede definir un objecto único, dándole estructura, conducta y nombre.



La idea de AjLanguage es que pueda acceder a todas las clases y objetos del framework subyacente (en este caso, .NET, pero está pensado para ser reescribible sobre Java, si fuera necesario, claro, cambiando cualquier referencia a tipos nativos):



ds = new System.Data.DataSet();
dinfo = new System.IO.DirectoryInfo(“.”);
foreach (fi in dinfo.GetFiles())
{
    PrintLine(fi.FullName);
}





Desde ayer, seguí implementando constructores. Tengo pensado definir visibilidades privadas y públicas (por ejemplo, las variables y métodos de instancia que comiencen con minúscula, hacerlas automáticamente privadas). También agregar propotipos, como en Javascript, lo que permitiría implementar cosas similares a los métodos de extensión de .NET.



Pero si van hoy al trunk, encontrarán que estuve implementando canales, como en en lenguaje Go de Google.



channel = new Channel();
go for (k=1; k<=5; k++) channel <- k;
for (j=1; j<=5; j++)
	result = result + <-channel;


Pero eso dará para otro post más detallado. Con esa característica quiero explorar temas como programación reactiva, agentes, actores, shared transactional memory, ver:



http://clojure.org/Agents



http://en.wikipedia.org/wiki/Actor_model



http://en.wikipedia.org/wiki/Axum_%28programming_language%29



Por ejemplo, sería interesante que los canales comunicaran no sólo dos códigos en paralelos, sino máquinas diferentes. Y definir esas máquinas en tiempo de deployment, sin cambiar el código del programa. Podría reescribir los ejemplos de Distributed Agents using DSS/VPL Genetic Algorithms with AjAgents and Concurrency and Coordination Runtime (CCR)



Como verán, me estoy divirtiendo!



Angel “Java” Lopez
http://www.ajlopez.com
http://twitter.com/ajlopez

This entry was posted in 1389, 5124, 8870, 8926. Bookmark the permalink.

2 Responses to AjSharp: objetos y clases dinámicas

  1. Fabián Foos says:

    La verdad que está muy bueno AjSharp, muy expresivo. Espero con ansias el parser de templates y la integración con AjGenesis para aplicarlo a mis plantillas.
    Saludos!

  2. Cagide says:

    :D me ah encantado, eh buscado algo asi antes de que llegue C# 4.0 muchas gracias por compartirlo

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>