<% %>
隔离代码和文本,采用${}
在文本中进行插值操作<%
${
分隔符均可以被转义, 如: \<%
\${
<
$
不需要转译//
/* */
var const super this if else switch case default for do while break continue function return import include echo native new @import throw try catch finally
static instanceof class final
与Java 保持一致,顺序按优先级从高到低
[] . () .~ => -> ! ~ ++ -- – (取负) * / % + - << >> >>> < <= > >= ^ | && || ?: .. = += -= *= /= %= ^= <<= >>= >>>=
可设置
engine.looseSemicolon=false
强制不允许省略分号
{ }
var a; var a, b, c=0, d="d"; var [e,f] = ["e","f"]; var [g1,g2,g3,g4] = 1..4;
常量是不可变量,必须在声明的时候指明初始值,需要是直接量,或者直接量的简单运算
const c1 =1; const c2 = "aaa"; const c3 = 'a'; const c4 = 2 * 1000; const c5 = "a" + 1; //native一个函数/构造方法也将得到一个直接量 const func = native java.util.List.add(Object); // 如果 是一个public static final 的java字段 也可以作为直接量 const INT_MAX = native Integer.MAX_VALUE;
super.
用于 取得指定上层且仅该层作用域的变量, 可嵌套super.super.a
++ this.
用于 取得本层且仅本层作用域的变量, 可嵌套this.super.a
++ for.iter
用于 最近一层for循环的 迭代状态对象, 可使用super
this
限定作用域super.for.iter
var x; //null var x2 = 6; //数字 var x3 = "Bill"; //字符串 var x4 = 'a'; //字符 var x5 = [1, "string"]; //数组 var x6 = {}; //Map
\\
\"
\'
\n
\r
\t
\f
\b
var string = "第一行 \ 这还是在第一行 这是第二行\n第三行\n 这是第五行,第四行是空行";
var x1=34; //Integer var x2=34L; //Long var x3=34.00; //Double var x4=34.00D; //Double var x5=34.00F; //Float var x6 = 0b10101; //二进制 var x7 = 0123; //八进制 var x8 = 0x1A; //十六进制
var x = true; var y = false;
var array = [ 1, "a string", book, // 支持最后一个元素冗余逗号 ]; var item; item = array[0]; item = array[1]; item = array[2]; array[0] = "a new value";
// 引入生成数组的 native 方法 var new_int_array = native [] int; var new_Object_array = native [] Object; var new_DateTime_array = native [] java.util.DateTime; // 或使用方法引用 var new_int_array2 = int[]::new; //得到定长数组 var int_array = new_int_array(5); //长度为5 的int数组 var objects = new_Object_array(5);//长度为5 的Object数组 var int_array2 = new_int_array2(4); //长度为4 的int数组 var int_array3 = int[]::new(4); //长度为4 的int数组 var a; a = objects[4]; objects[4]=4; // 自动 装箱为Integer 然后放入数组 var len = objects.length; //数组长度 len = objects.size; //数组长度 //不定长数组 可使用Java提供的List实现 var new_list = native new java.util.ArrayList(); var list_add = native java.util.List.add(Object); var list = new_list(); list_add(list,0); list_add(list,1); var a = list[0]; list[0] = "zero"; list[1] = "a string";
var map = {}; var map2 = {1:1,"2","2"}; map["key"] = "a string value"; var value = map[1]; value = map["2"]; value = map["key"]; var id = "9527" var name = "Mr. T" var map = { id, // 只提供现有的变量名, 取名作为key, 取值作为值, 等同于 map["id"] = id name, // 同上, 等同于 等同于 map["name"] = name nickname: "wit", // 标识符作为 key, 提供的值作为值 1 : "a", // 直接量作为 key "1": "b", // 同上 '1': "c", // 同上 -1 : "d", // 同上 [ -1-1 ] : "e", // 表达式作为 key, 使用 [] 内的表达式的结果作为key, 等同于 map[-1-1] = "e" "x-y-z" : "XYZ", // 支持最后一个元素冗余逗号 };
var new_list = native new java.util.ArrayList(); var list = new_list(); var list2 = new_list();
var book; var name = book.name; // book.getName(); book.name = "new name"; //book.setName("new name");
访问方法必须事先native导入成本地函数
var list_add = native java.util.List.add(Object); list_add(list, 0); list_add(list, 1);
动态调用成员方法
list.~add(item); list.~add(0, item2); list.~clear(); list.~addAdd(list2);
访问公共静态方法
var now = native java.lang.System.currentTimeMillis(); echo now(); echo "\n"; // 或者使用方法引用 echo java.lang.System::currentTimeMillis();
//对于final的字段,直接得到其值 const INT_MAX = native Integer.MAX_VALUE; //对于非final的字段,得到其引用,可以即时使用和赋值 var f2 = native StaticFields.field2; (native StaticFields.field2) = new_value;
var outSideVar; var a; var myFunc = function(arg1, arg2){ var arg3 = arguments[3]; // 如果没有将抛出异常,最好通过 arguments.size确认 outSideVar = "a new "; //可访问 var a = 0; //内部变量 super.a ++ ; //访问上层变量 var func = function(){ ... }; //内部嵌套函数 }; //不要忘了分号!!!
@import
导入类名 或者包名 用法同Java里的 import
, 以简化类名输入@import java.lang.System; //实际上默认已经导入 java.lang.* 只是演示使用方法 @import java.util.List; @import java.util.ArrayList; var now = native java.lang.System.currentTimeMillis(); var list_add = native List.add(Object); var new_list = native new ArrayList(); // 导入 构造函数 var new_list2 = native new ArrayList(int); // 导入 构造函数
null
补齐,func(arg1, arg2); list_add(list, item);
=>
var out; var book; //代码段 输出重定向 { echo "a String"; >${book.name} < } => out; // "a String" 以及 book.name 都将输出到 out var out; // 函数 输出重定向 func() => out; //由于 `=>` 具有较高的优先级,也可以这么些 var a = func(arg1) => out +1; //此时 a为 func()+1 , func() 本次执行的输出内容赋值给out
//相对路径 include "./book-head.wit"; //等同于 include "book-head.wit"; //绝对路径 include "/copyright.wit"; //动态模板名 var style = ""; import "book-list-"+ style +".wit"; //可传入参数 函数同样也可以作为变量传输 var func = function(){}; var book; import "book-head.wit" {"book": book, "func":func}; //导出指定变量 var a; var b; //导出 : a 到a ,c 到 b import "book-head.wit" {"param1":1} a,b=c;
?:
之间没有空白字符~~ v2.0.0+ 不再支持, 请使用 ||
代替var a1 = isTrue ? "Yes" : "No"; //自右向左 结合 var x = expr1 ? expr3 : expr2 ? expr4 : expr5; //这个等同于 var x = expr1 ? expr3 : (expr2 ? expr4 : expr5); // 如果 是 自左向右 就会变成这样 var x = (expr1 ? expr3 : expr2) ? expr4 : expr5;
{ }
if( ... ){ ...; }else if(...){ ...; }else{ ...; }
//集合 数组 等 for(item : list){ echo item; //echo for.iter.index; // .isFirst .hasNext .isOdd .isEven } else{ echo "list is empty"; } //递增 for(i: 3..6){ echo i; } //递减 for(i: 6..3){ echo i; //支持 for.iter.* }
for(key, value : map){ echo key + " = " value; echo "\n"; //同样支持 for.iter.* }
// var iter; ... ; while(iter.hasNext){ var item = iter.next; ....; } // do{ ....; }while( ... );
Object.equls()
判断是否相等switch(a){ case 1: ....; break; case "c": //String ....; break; case 'c': //Char ....; break; default: ....; }
支持 label
//break continue outter: for(i: 6..3){ echo i; //支持 for.iter.* inner: for(item : list){ if( ..... ){ break outter; } .....; break; // break inner; } // switch(a){ ...; case 'x': break outter; ...; } }
可以认为是 function(..){..} 的简写
()->0; //等同与 ()->{ return 0; }; // 下面几组也分别是等同的 x -> x > 2 || x < 8; x -> (x > 2 || x < 8); x -> {return x > 2 || x < 8;}; (x) -> x > 2 || x < 8; (x, y, z) -> x > y || x < z; (x, y, z) -> {return x > y || x < z;}); //注意: 你可能会发现,这里会有一个歧义,实际上是个返回一个空map的函数, 而不是一个空函数 ()->{};
\
转义var id=9527, name="Mr Tang"; var jobs = { 9527: "Master" }; var str = `awesome\t\n template ${1+2}, ${id}, ${name}, ${jobs[id]}${(()->",")()} ${((name)->{ var map={func:"bala..bala..bala"}; return "nested function: " + name + " - " + map[name]})("func")} .`