Moto supports an additional, more compact syntax for embedding large
'blocks' of code into a page without worrying about whitespace treatment. This
syntax may be used in addition to the single construct syntax described in the
previous section.
Embedded blocks begin with the escape sequence ${ and ends with }$. Inside and
embedded block you can have multiple moto statements. Each statement must be terminated
by a semicolon ';' .
${
statement 1;
statement 2;
statement 3;
}$
| |
To comment out a block of text you want moto to ignore from within an
ebmedded block surround that text with /* and */ .
You can also comment out all text until the next end of line by preceeding the
comment with //
print "hello"; // this statement prints "hello" | |
Inside of an embedded block you can declare variables just as you can in C or java
variable type variable name ( = optional variable value )
| |
The embedded block syntax for declarations is much more compact than with $declare()
${
Date d = new Date();
String month = getValue("_month",str(d.getMonth()+1));
String day = getValue("_day",str(d.getDayOfMonth()));
String year = getValue("_year","2002");
int i;
String curtok;
Tokenizer stok = new Tokenizer("Jan|Feb|Mar|Apr|Mar|Jun|Jul|Aug|Sep|Nov|Dec",'|');
}$
| |
Every statement inside an embedded block is essentially a $do() statement. Anything
you would use a $do() construct for you can write as a statement inside an
embedded block.
${String foo = "bar"; int l; l=foo.length() ; l++; foo=foo+foo; }$
| |
You can print something out from an embedded block statement by preceding your expression
with the print keyword.
${print 7.00e+10 ;}$
${print 7.00E+10 ;}$
${print 7.00e-10 ;}$
${print 7.00E-10 ;}$
${print false; }$
${print 7.0F; }$
${print 7.0f; }$
${ print 7;}$
${
print 7L;
print "\n";
print 7l;
}$
${print null;}$
${print "string";}$
| |
If statements in embedded blocks work just like they do in C or Java
${
String qryQuestions;
if (idTopic eq "0")
qryQuestions =
"SELECT q.*,iu.imageURL,p.uname FROM "+
"tblQuestion q LEFT OUTER JOIN tblImageURL iu ON q.idImageURL=iu.idImageURL "+
", tblPrincipal p WHERE p.idPrincipal=q.idOwner";
else if (idTopic eq "-1")
qryQuestions =
"SELECT q.*,iu.imageURL,p.uname FROM "+
"tblQuestion q LEFT OUTER JOIN tblImageURL iu ON q.idImageURL=iu.idImageURL " +
"LEFT OUTER JOIN tblTopicToQuestion ttq ON ttq.idQuestion = q.idQuestion "+
", tblPrincipal p WHERE p.idPrincipal=q.idOwner AND ttq.idTopic is null ";
else
qryQuestions =
"SELECT q.*,iu.imageURL,p.uname FROM "+
"tblQuestion q LEFT OUTER JOIN tblImageURL iu ON q.idImageURL=iu.idImageURL " +
", tblTopicToQuestion ttq, tblPrincipal p WHERE ttq.idQuestion = q.idQuestion "+
"AND ttq.idTopic = "+idTopic+" AND p.idPrincipal=q.idOwner";
}$
| |
There is no elseif keyword in embedded blocks, rather the else matches up with
the most recent if
The switch statement works similar to switch in C or Java but like in the
$switch() construct, cases do not fall through. Unlike the $switch()
construct however, the embedded switch statement does make use of a
default keyword. It must however follow all cases in the switch block.
${foo="bang";
switch(foo){
case "bar": print "baz";
case "maka": print "ok";
case "bling": print "bing";
default: print "zip";
}
}$
| |
For loops in embedded blocks have the same syntax as they do in C
${for(i=0;i<10;i++) print "hello "+str(i)+"\n"; }$
| |
So do While loops
${i=0; while(i<10) print "hello "+str(i++)+"\n"; }$
| |
Break and continue are used just like any other statement
Embedded while
${i=0;
while(true)
if (i<10)
print "hello "+str(i++)+"\n";
else
break;
print "goodbye\n";
}$
Embedded continue
${i=0;
while(true) {
if (i<10) {
print "hello "+str(i++)+"\n";
continue;
}
break;
}
print "goodbye\n";
}$
| |
Within embedded blocks you can create explicit variable scopes by using the '{' and '}'
operators. Again this works just like it does in C or Java. Declarations inside an embedded scope
only exist within that scope. For example the following piece of moto code
${
int j = 1;
{
int j = 1;
print ++j; print "\n";
}
print j;print "\n";
}$
| |
Would output
From the above example you can see also that redeclaration of an existing variable
inside an embedded scope shadows the previous declaration.
You can also use moto scopes to escape from embedded blocks allowing you to intersperse
static text or classic moto constructs with your embedded block structured code
${ i=0;
while(true)
if (i<10) {
}$
hello $(i++)
${
} else {
}$
$break
${
}
print "goodbye\n";
}$
| |
They syntax for defining a function in an embedded block is the same as it is in C or Java
type name(arguments){
...
return expression;
}
| |
The to use the global type qualifier, just preceed the variable declaration with the keyword
global
The following example defines two functions and declares three global variables
${
global Vector debugQueries = new Vector();
global Vector debugQueryTimes = new Vector();
global Vector debugQueryResults = new Vector();
MySQLResultSet doQuery(MySQLConnection conn, String qry){
MySQLResultSet r;
long t;
t=time();
r = conn.query(qry);
t=t-time();
debugQueries.add(qry);
debugQueryTimes.add(new Long(t));
debugQueryResults.add(new Integer(r.size()));
return r;
}
void doDebugQueries(){
int i;
for(i=0;i<debugQueries.size();i++){
print "<p><pre>";
print <String>debugQueries.get(i);
print "</pre>\n";
print "Results Returned: "+str((<Integer>debugQueryResults.get(i)).getValue()) + "<br>\n";
print "Execution Time: "+str((<Long>debugQueryTimes.get(i)).getValue()) + "<br>\n";
}
}
}$
| |
The syntax for defining a Class in an embedded block is the same as it is in Java
class class name {
member variable declarations
method definitions
}
| |
The following example defines two classes
${
class Question {
int idQuestion;
String qText;
int idImageURL;
int level;
String explanation;
int numanswers;
int answers[];
int canswer;
int numtopics;
int topics[];
}
class QuestionManager {
Question get(int idQuestion){
int i;
MySQLResultSet rset;
Question q = new Question();
rset = doQuery(conn,
"SELECT q.* FROM tblQuestion q WHERE q.idQuestion = "+str(idQuestion));
if(!rset.next())
return null;
q.idQuestion = idQuestion;
q.qText = rset.getString("qText");
q.idImageURL = rset.getInt("idImageURL");
q.level = rset.getInt("level");
q.explanation = rset.getString("explanation");
rset=doQuery(conn,
"SELECT a.idAnswer, qta.isCorrect " +
"FROM tblQuestionToAnswer qta, tblAnswer a WHERE " +
" qta.idQuestion = "+str(idQuestion)+ " AND " +
" a.idAnswer = qta.idAnswer " +
"ORDER BY a.aText"
);
q.numanswers = rset.size();
q.answers = new int[rset.size()];
for(i=0;i<rset.size();i++){
rset.next();
q.answers[i]=rset.getInt("idAnswer");
if(rset.getInt("isCorrect")==1)
q.canswer=rset.getInt("idAnswer");
}
rset=doQuery(conn,
"SELECT ttq.idTopic " +
"FROM tblTopicToQuestion ttq WHERE " +
" ttq.idQuestion = "+str(idQuestion)
);
q.numtopics = rset.size();
q.topics = new int[rset.size()];
for(i=0;i<rset.size();i++){
rset.next();
q.topics[i]=rset.getInt("idTopic");
}
return q;
}
}
}$
| |
The syntax for try catch and finally is the same as it is in Java
try { ... }
catch (NullPointerException npe) { ... }
catch (Exception e) { ... }
finally { ... }
| |
The syntax for throw is the same as well
Copyright © 2000 - 2003 David Hakim