lunes, 20 de abril de 2009

Jugando a ser Dios (haciendo un DSL)

Como vimos antes no es muy dificil crear meta lenguajes o lenguajes de dominio especificos con Javascript. Pero como no se me habia ocurrido una aplicación especifica, deje pasar el hecho de no mostrar un DSL en concreto.
Por suerte hace unos dias, en el trabajo, tuve la necesidad de realizar pequeñas o simple consultas algo parecidas a un SQL muy básico sobre algunas Arrays Javascript, entonces recordé mi post sobre DSL y decidí implementar algunas funcionalidades de javascript para que puedan ver un DSL en funcionamiento. aquí les va
(si yo se que el código es largo pero lo voy a comentar bien asi se comprende)


//arrSQL.js
var arrSQL =(function(){ //usamos una funcion para tener funciones privada


//private constructor
function _arrSQL(args){
this.sel=[];
this.from=args[0];
this.wh=[];
this.arrayResp=false;
return this;
};

_arrSQL.prototype = {
where:function (crit){
this.wh.push(crit);
return this;
},
select:function(field){
if(arguments.length===1){
this.sel.push(field);
}else{
for(var i=0; i0){
var ret=true;
for(var c in this.wh){
var criterio = this.wh[c];
switch(criterio[1]){
case '=':
if (o[criterio[0]]!==criterio[2]){
ret = false;
}
break;
}
}
return ret;
}else{
return true;
}
},
distinctCheck:function(o){
if(this.dist){
var ret = false;
this.dist.returnRoot();
for (var name in this.sel){
if(this.dist.nav(o[this.sel[name]]) ){
ret = ret || false;
}else{
this.dist.add(o[this.sel[name]]);
this.dist.nav(o[this.sel[name]]);
ret = ret||true;
}
}
return ret;
}else{
return true;
}
},
ret:function (){
var retu = [];
if(this.dist){
this.dist = new this.distCache();
}
for(var i=0;i < distcache=" function(){" root="{};" curr="this.root;" prototype="{" curr =" this.curr[name];" curr =" this.root;">


JAJAJA bueno disculpen mi ausencia de comentarios pero me tengo que ir a dormir, pueden pedir explicaciones por los comentarios.
Aqui tienen un pequeño html para poder probarlo



var arr = [{"titulo":"Titulo1",
"nombre":"Nombre1",
"apellido":"Apellido1",
"descripcion":"Descripcion1"},
{"titulo":"Titulo1",
"nombre":"Nombre2",
"apellido":"Apellido2",
"descripcion":"Descripcion2"},
{"titulo":"Titulo1",
"nombre":"Nombre3",
"apellido":"Apellido3",
"descripcion":"Descripcion3"},
{"titulo":"Titulo1",
"nombre":"Nombre4",
"apellido":"Apellido4",
"descripcion":"Descripcion4"}];
//alert(arr);
alert(arrSQL(arr).select('nombre','apellido').distinct().where(['titulo','=','Titulo1']).ret());

1 comentario:

  1. Hola, probé tu ejemplo en la caja lateral con ff y regresa

    missing ; after for-loop condition
    [Break on this error] for(var i=0; i0){\n

    Por lo que alcanzo a entender el for no cierra parentesis y no encuentro (a primera leida) las donde inicia/termina el codigo que ejecuta el for

    ResponderEliminar