docs: function executeExpr_(expr,context){
  	var value=null;
  	if(typeof expr=='string'){
  		if(context.params[expr]){
  			value=context.params[expr];
  		}else{
  			value=expr;
  		}
  	}else if(typeof expr[0]=='string'){
  		switch(expr[0]){
  		case 'defined':
  			for(var k=1;k<expr.length;k++){
  				if(typeof expr[k]!='string'){
  					console.log("error: invalid format in defined expression");
  					return null;
  				}else if(context.params[expr[k]]==null){
  					return false;
  				}else{
  					//nothing to do
  				}
  			}
  			value=true;
  			break;
  		case 'append':{
  			if(expr.length<3){
  				console.log("error: append expression needs 2 arguments or more");
  				return null;
  			}
  			value='';
  			var v;
  			for(var k=1;k<expr.length;k++){
  				if(!(v=executeExpr(expr[k],context))){
  					return false;
  				}
  				value+=v;
  			}
  			break;}
  		case '&&':
  			if(expr.length<3){
  				console.log("error: && expression needs 2 arguments or more");
  				return null;
  			}
  			for(var k=1;k<expr.length;k++){
  				if(!executeExpr(expr[k],context)){
  					return false;
  				}
  			}
  			value=true;
  			break;
  		case '||':
  			if(expr.length<3){
  				console.log("error: && expression needs 2 arguments or more");
  				return null;
  			}
  			for(var k=1;k<expr.length;k++){
  				if(executeExpr(expr[k],context)){
  					return true;
  				}
  			}
  			value=false;
  			break;
  		case '==':
  			if(expr.length!=3){
  				console.log("error: == expression needs 2 arguments");
  				return null;
  			}
  			return (executeExpr(expr[1],context)==executeExpr(expr[2],context));
  		case '!=':
  			if(expr.length!=3){
  				console.log("error: != expression needs 2 arguments");
  				return null;
  			}
  			return (executeExpr(expr[1],context)!=executeExpr(expr[2],context));
  		case '!':
  			if(expr.length!=2){
  				console.log("error: == expression needs only 1 argument");
  				return null;
  			}
  			return !executeExpr(expr[1],context);
  			break;
  		default:
  			break;
  		}
  	}else if(expr[0] instanceof Array){
  		if(expr.length==1){
  			value=executeExpr(expr[0], context);
  		}else{
  			console.log("error: () expression needs only 1 argument");
  		}
  	}else{
  		console.log("error: unknown expression");
  	}
  	return value;
  }